Ceph 将数据存储在存储池中。存储池是用于存储对象的逻辑组。如果您先部署集群而不创建存储池,Ceph 会使用默认存储池来存储数据。
将存储池与应用关联
在使用存储池之前,需要将它们与应用关联。将与 CephFS 搭配使用或由对象网关自动创建的存储池会自动关联。需要使用 rbd 工具初始化要与 RBD 搭配使用的存储池。
1 | root # ceph osd pool application enable pool_name application_name |
一个存储池可以与多个应用关联,每个应用都可具有自己的元数据。可使用以下命令显示给定存储池的应用元数据:
1 | root # ceph osd pool application get pool_name |
操作存储池
了解如何列出、创建和删除存储池,以及如何显示存储池统计数字或管理存储池快照。
列出存储池
要列出集群的存储池,请执行以下命令:
1 | root # ceph osd lspools |
创建存储池
要创建副本存储池,请执行以下命令:
1 | root # ceph osd pool create pool_name pg_num pgp_num replicated crush_ruleset_name expected_num_objects |
要创建纠删码池,请执行以下命令:
1 | root # ceph osd pool create pool_name pg_num pgp_num erasure erasure_code_profile crush_ruleset_name expected_num_objects |
pool_name
存储池的名称,必须唯一。必须指定此选项。
pg_num
存储池的归置组总数。必须指定此选项。默认值是 8。
pgp_num
用于归置数据的归置组总数。此数量应该与归置组总数相等,归置组拆分情况除外。必须指定此选项。默认值是 8。
pgp_type
存储池类型,可以是 replicated(用于保留对象的多个副本,以便从失败的 OSD 恢复)或 erasure(用于获得某种通用 RAID5 功能)。副本池需要的原始存储较多,但可实现所有 Ceph 操作。纠删码池需要的原始存储较少,但只实现一部分可用的操作。默认值是“replicated”。
crush_ruleset_name
此存储池的 crush 规则组的名称。如果所指定的规则组不存在,则创建副本池的操作将会失败,并显示 -ENOENT。但副本池将使用指定的名称创建新的纠删规则组。对于纠删码池,默认值是“erasure-code”。对于副本池,将选取 Ceph 配置变量 osd_osd_pool_default_crush_replicated_ruleset。
erasure_code_profile=profile
仅适用于纠删码池。使用纠删码配置。该配置必须是 osd erasure-code-profile set 所定义的现有配置。
expected_num_objects
此存储池的预期对象数。如果设置此值,PG 文件夹拆分发生于存储池创建时。这可避免因运行时文件夹拆分导致的延迟影响。
设置存储池配额
您可以设置存储池配额,限定每个存储池的最大字节数和/或最大对象数。
1 | root # ceph osd pool set-quota pool-name max_objects obj-count max_bytes bytes |
删除存储池
存储池中可能包含重要数据。删除存储池会导致存储池中的所有数据消失,且无法恢复。
不小心删除存储池十分危险,因此 Ceph 实施了两个机制来防止删除存储池。要删除存储池,必须先禁用这两个机制。
第一个机制是 NODELETE 标志。每个存储池都有这个标志,其默认值是“false”。要确定某个存储池的此标志值,请运行以下命令:
1 | root # ceph osd pool get pool_name nodelete |
如果命令输出 nodelete: true,则只有在使用以下命令更改该标志后,才能删除存储池:
1 | ceph osd pool set pool_name nodelete false |
第二个机制是集群范围的配置参数 mon allow pool delete,其默认值为“false”。这表示默认不能删除存储池。
若要规避此安全设置删除存储池,可以临时将 mon allow pool delete 设置为“true”,删除存储池,然后将该参数恢复为“false”:
1 | root # ceph tell mon.* injectargs --mon-allow-pool-delete=true |
injectargs 命令会显示以下讯息:
1 | injectargs:mon_allow_pool_delete = 'true' (not observed, change may require restart) |
重命名存储池
要重命名存储池,请执行以下命令:
1 | root # ceph osd pool rename current-pool-name new-pool-name |
如果重命名了存储池,且为经过身份验证的用户使用了按存储池功能,则必须用新的存储池名称更新用户的功能。
显示存储池统计数字
要显示存储池的用量统计数字,请执行以下命令:
1 | root # rados df |
设置存储池的值
要设置存储池的值,请执行以下命令:
1 | root # ceph osd pool set pool-name key value |
1 |
|
获取存储池的值
要获取存储池中的值,请执行以下命令:
1 | root # ceph osd pool get pool-name key |
1 | pg_num |
设置对象副本数
要设置副本存储池上的对象副本数,请执行以下命令:
1 |
|
获取对象副本数
要获取对象副本数,请执行以下命令:
1 | root # ceph osd dump | grep 'replicated size' |
7.2.11 增加归置组数
创建新存储池时,需指定存储池的归置组数(请参见第 7.2.2 节 “创建存储池”)。将更多 OSD 添加至集群后,出于性能和数据持久性原因,通常还需要增加归置组数。对于每个归置组,OSD 和监视器节点始终都需要用到内存、网络和 CPU,在恢复期间需求量甚至更大。因此,最大限度地减少归置组数可节省相当大的资源量。
1 | root # ceph osd pool set rbd pg_num 4096 |
添加存储池
在您首次部署集群之后,Ceph 会使用默认存储池来存储数据。之后,您可以使用以下命令创建新的存储池:
1 | root # ceph osd pool create |
存储池迁移
迁移存储池的方法有多种。建议使用快速缓存层,因为该方法是透明的,能够减少集群停机时间并避免复制所有存储池的数据。
7.3.1 使用快速缓存层迁移
该方法的原理十分简单,只需将需要迁移的存储池按相反的顺序加入快速缓存层中即可。有关快速缓存层的详细信息,请参见第 10 章 “快速缓存分层”。例如,要将名为“testpool”的副本池迁移到纠删码池,请执行以下步骤:
创建一个名为“newpool”的新纠删码池:
1 | root@minion > ceph osd pool create newpool 4096 4096 erasure default |
您现在有两个池,即装满数据的原始副本池“testpool”和新的空纠删码池“newpool”:
设置快速缓存层,并将副本池“testpool”配置为快速缓存池:
1 | root@minion > ceph osd tier add newpool testpool --force-nonempty |
强制快速缓存池将所有对象移到新池中:
1 | root@minion > rados -p testpool cache-flush-evict-all |
数据清理
将所有客户端切换到新池。您需要指定一个覆盖层,以便在旧池中搜索对象,直到所有数据都已清理到新的纠删码池。
1 | root@minion > ceph osd tier set-overlay newpool testpool |
有了覆盖层,所有操作都会转到旧的副本池“testpool”:
设置覆盖层
现在,您可以将所有客户端都切换为访问新池中的对象。所有数据都迁移到纠删码池“newpool”后,删除覆盖层和旧超速缓冲池“testpool”:
1 | root@minion > ceph osd tier remove-overlay newpool |
存储池快照
存储池快照是整个 Ceph 存储池的状态快照。通过存储池快照,可以保留存储池状态的历史。创建存储池快照可能需要大量存储空间,具体取决于存储池的大小。在创建存储池快照之前,始终需要检查相关存储是否有足够的磁盘空间。
创建存储池快照
要创建存储池快照,请执行以下命令:
1 | root # ceph osd pool mksnap pool-name snap-name |
删除存储池快照
要删除存储池快照,请执行以下命令:
1 | root # ceph osd pool rmsnap pool-name snap-name |