注意
本文档适用于 Ceph 的开发版本。
池
池是用于存储 RADOS 对象的逻辑分区。
池提供
弹性:可以规划在不丢失数据或数据不可用的情况下并行发生故障的 OSD 数量。如果集群使用复制池,在不丢失数据的情况下可以并行发生故障的 OSD 数量比副本数少一个,而在不导致数据不可用的情况下可以发生故障的 OSD 数量通常是两个。
例如:典型的配置存储每个 RADOS 对象的三个副本(即:
size = 3),但可以按池配置副本数。对于纠删码池,弹性定义为编码(又称奇偶校验)块的数量(例如,默认纠删码配置文件中的m = 2)。放置组:自动调节器设置池的放置组 (PG) 数量。在典型的配置中,目标 PG 数量约为每 OSD 一百五十个 PG。这提供了合理的平衡,同时不会消耗过多的计算资源。设置多个池时,为每个池和整个集群设置适当的 PG 数量。每个 PG 属于一个特定的池:当多个池使用相同的 OSD 时,请确保每 OSD 的 PG 副本总和在所需的每 OSD PG 目标范围内。有关如何手动设置每池 PG 数量的说明,请参阅设置放置组数量(此过程仅在未使用自动调节器时有效)。PG 计算器提供了一个方便的计算器,用于各种场景和池、副本以及每 OSD 目标 PG 副本的组合。
CRUSH 规则:当数据存储在池中时,PG 和对象副本(或块/分片,对于纠删码池)在集群中的放置受 CRUSH 规则的约束。如果默认规则不符合您的用例,可以为池创建自定义 CRUSH 规则。
快照:命令
ceph osd pool mksnap创建池的快照。
池名称
以 . 开头的池名称保留用于 Ceph 的内部操作。请勿创建或操作具有这些名称的池。
列出池
有多种方法可以列出集群中的池。
要仅列出集群的池名称(例如,在编写脚本时),请执行
ceph osd pool ls
.rgw.root
default.rgw.log
default.rgw.control
default.rgw.meta
要列出带有池编号的集群池,请运行以下命令
ceph osd lspools
1 .rgw.root
2 default.rgw.log
3 default.rgw.control
4 default.rgw.meta
要列出带有附加信息的集群池,请执行
ceph osd pool ls detail
pool 1 '.rgw.root' replicated size 3 min_size 1 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 19 flags hashpspool stripe_width 0 application rgw read_balance_score 4.00
pool 2 'default.rgw.log' replicated size 3 min_size 1 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 21 flags hashpspool stripe_width 0 application rgw read_balance_score 4.00
pool 3 'default.rgw.control' replicated size 3 min_size 1 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 23 flags hashpspool stripe_width 0 application rgw read_balance_score 4.00
pool 4 'default.rgw.meta' replicated size 3 min_size 1 crush_rule 0 object_hash rjenkins pg_num 128 pgp_num 128 autoscale_mode on last_change 25 flags hashpspool stripe_width 0 pg_autoscale_bias 4 application rgw read_balance_score 4.00
要检索更多信息,您可以将此命令与 --format(或 -f)选项以及 json、json-pretty、xml 或 xml-pretty 值一起执行。
创建池
在创建池之前,请参阅池、PG 和 CRUSH 配置参考。Ceph 中央配置数据库包含一个默认设置(即 osd_pool_default_pg_num),用于确定如果未指定特定值,则分配给新池的 PG 数量。可以更改此值的默认值。有关设置每池 PG 数量的更多信息,请参阅设置 PG 数量。
注意
在 Luminous 及更高版本中,每个池必须与将使用该池的应用程序关联。有关详细信息,请参阅下面的将池与应用程序关联。
要创建池,请运行以下命令之一
ceph osd pool create {pool-name} [{pg-num} [{pgp-num}]] [replicated] \
[crush-rule-name] [expected-num-objects]
或
ceph osd pool create {pool-name} [{pg-num} [{pgp-num}]] erasure \
[erasure-code-profile] [crush-rule-name] [expected_num_objects] [--autoscale-mode=<on,off,warn>]
有关上述命令元素的简要说明,请参阅以下内容
- {pool-name}
池的名称。它必须是唯一的。
- 类型:
String
- 必需:
是。
- {pg-num}
池中的 PG 总数。有关计算适当数量的详细信息,请参阅放置组。默认值不适用于大多数系统。
- 类型:
整数
- 必需:
是。
- 默认值:
32
- {pgp-num}
用于放置目的的 PG 总数。这应该等于 PG 总数,除了在增加或减少
pg_num的短暂期间。请注意,在 Nautilus 及更高版本中,通常不会直接更改pgp_num:当给定池的pg_num已调整时,Ceph 会自动逐步扩展该池的pgp_num。对pg_num的调整可以通过 PG 自动调节器进行,或者如果自动调节器被禁用,则通过 CLI 或仪表板手动设置。- 类型:
整数
- 必需:
是。如果在命令中未指定值,则使用默认值(除非在 Ceph 配置中设置了不同的值)。
- 默认值:
32
- {replicated|erasure}
池的数据保护策略。这可以是
replicated(像 RAID1 和 RAID10)erasure (一种 :ref:`通用奇偶校验 RAID <ecpool>` 策略,如 RAID6 但更灵活)。 ``replicated`` 池在给定原始存储量的情况下提供较少可用容量,但适用于所有 Ceph 组件和用例。在给定底层原始存储量的情况下,erasure(EC) 池通常比复制提供更多可用容量,但仅适用于 Ceph 组件和用例的子集。根据工作负载和特定配置文件,EC 通常需要比复制更多的故障域,并提供较低的性能,但可能容忍更多的重叠驱动器或主机故障。- 类型:
String
- 必需:
否。
- 默认值:
replicated
- [crush-rule-name]
用于此池的 CRUSH 规则名称。指定的规则必须已经存在,否则命令将失败。
- 类型:
String
- 必需:
否。
- 默认值:
对于
replicated池,默认情况下是由osd_pool_default_crush_rule配置选项指定的规则。此规则必须存在。对于erasure池,如果使用default纠删码配置文件,则为erasure-code规则,否则为{pool-name}规则。如果此规则不存在,它将隐式创建。
- [erasure-code-profile=profile]
仅适用于
erasure池。指示 Ceph 使用指定的纠删码配置文件。此配置文件必须是通过仪表板或调用osd erasure-code-profile set定义的现有配置文件。请注意,创建后对池 EC 配置文件的更改不会生效。要更改现有池的 EC 配置文件,必须修改池以使用使用所需配置文件定义的另一个 CRUSH 规则。- 类型:
String
- 必需:
否。
- --autoscale-mode=<on,off,warn>
on:Ceph 集群将根据实际使用情况自动调整池中 PG 数量的变化。warn:Ceph 集群将根据实际使用情况推荐对池中 PG 数量的更改。off:有关详细信息,请参阅放置组。
- 类型:
String
- 必需:
否。
- 默认值:
默认行为由
osd_pool_default_pg_autoscale_mode选项确定。
- [expected-num-objects]
此池预期的 RADOS 对象数量。通过设置此值,您可以安排在创建池时进行 PG 分裂,并避免伴随运行时文件夹分裂的延迟影响。
- 类型:
整数
- 必需:
否。
- 默认值:
0,创建池时没有分裂。
将池与应用程序关联
每个池在使用前必须与应用程序关联。旨在用于 CephFS 的池和由 RGW 自动创建的池会自动关联。旨在用于 RBD 的池应通过仪表板或 rbd CLI 工具初始化(有关详细信息,请参阅块设备命令)。
对于不寻常的用例,您可以通过运行以下命令将自由格式的应用程序名称关联到池
ceph osd pool application enable {pool-name} {application-name}
注意
CephFS 使用应用程序名称 cephfs,RBD 使用应用程序名称 rbd,RGW 使用应用程序名称 rgw。
设置池配额
要设置每个池的最大字节数或最大 RADOS 对象数的配额,请运行以下形式的命令
ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]
例如
ceph osd pool set-quota data max_objects 10000
要删除配额,请将其值设置为 0。请注意,您可以仅设置字节配额或仅设置 RADOS 对象配额,也可以同时设置两者。
删除池
要删除池,请运行以下形式的命令
ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]
要删除池,必须在中央配置中将 mon_allow_pool_delete 标志设置为 true,否则 Ceph 监视器将拒绝删除池。
有关详细信息,请参阅监视器配置。
如果存在不再使用或需要的自定义 CRUSH 规则,请考虑删除这些规则。
ceph osd pool get {pool-name} crush_rule
例如,如果自定义规则为“123”,请通过运行以下命令检查所有池是否使用该规则
ceph osd dump | grep "^pool" | grep "crush_rule 123"
如果没有池使用此自定义规则,则可以安全地从集群中删除该规则。
同样,如果存在权限受限于不再存在的池的用户,请考虑通过运行以下形式的命令删除这些用户
ceph auth ls | grep -C 5 {pool-name}
ceph auth del {user}
重命名池
要重命名池,请运行以下形式的命令
ceph osd pool rename {current-pool-name} {new-pool-name}
如果您重命名具有每池权限的经过身份验证的用户所使用的池,则必须更新用户的权限(“caps”)以引用新的池名称。有关更新用户权限的说明,请参阅修改用户权限。
显示池统计信息
要显示池的利用率统计信息,请运行以下命令
rados df
要获取特定池或所有池的 I/O 信息,请运行以下形式的命令
ceph osd pool stats [{pool-name}]
制作池快照
要制作池快照,请运行以下形式的命令
ceph osd pool mksnap {pool-name} {snap-name}
删除池快照
要删除池快照,请运行以下形式的命令
ceph osd pool rmsnap {pool-name} {snap-name}
设置池值
要为池的配置属性分配值,请运行以下形式的命令
ceph osd pool set {pool-name} {key} {value}
您可以为以下键设置值
- compression_algorithm
- 描述:
设置用于在底层 BlueStore 后端存储数据时使用的内联压缩算法。此键设置会覆盖全局设置
bluestore_compression_algorithm。- 类型:
String
- 有效设置:
lz4、snappy、zlib、zstd
- compression_mode
- 描述:
设置用于在底层 BlueStore 后端存储数据时使用的内联压缩策略。此键设置会覆盖全局设置
bluestore_compression_mode。- 类型:
String
- 有效设置:
none、passive、aggressive、force
- compression_min_blob_size
- 描述:
设置块压缩的最小大小:即,小于此大小的块不被压缩。此键设置会覆盖以下全局设置
- 类型:
无符号整数
- compression_max_blob_size
- 描述:
设置块的最大大小:即,大于此大小的块在执行压缩之前会分解为不大于此大小的较小 blob。
- 类型:
无符号整数
注意
可以使用 ceph df detail 查看压缩池统计信息。压缩池中的对象将通过大多数 API 调用或 CLI 命令显示其原始未压缩大小。例如:直接放置在压缩 RADOS 池中的 RGW 存储桶(没有 RGW 级别压缩)将通过 radosgw-admin 报告未压缩的存储桶大小。
- 大小
- 描述:
设置池中对象的副本数。有关详细信息,请参阅设置 RADOS 对象副本数。这只能为
replicated池设置。EC 池将 _报告_等于 K+M 的size,但此值不能直接_设置_。- 类型:
整数
- min_size
- 描述:
设置 PGs 处于活动状态并因此可以进行 I/O 操作所需的最小活动副本数(或分片数)。有关详细信息,请参阅设置 RADOS 对象副本数。对于纠删码池,此值应设置为大于
K的值。如果只允许K个分片进行 I/O,则不会有冗余,并且在发生额外的永久 OSD 故障时会丢失数据。有关详细信息,请参阅纠删码- 类型:
整数
- 版本:
0.54及以上
- pg_num
- 描述:
指定给定池的 PG 总数。请注意,如果为给定池启用了 PG 自动调节器,它可能会覆盖手动分配的值。
- 类型:
整数
- 有效范围:
0到mon_max_pool_pg_num。如果设置为0,将使用osd_pool_default_pg_num的值。
- pgp_num
- 描述:
设置计算数据放置时使用的有效 PG 数。当运行 Nautilus 及更高版本的 Ceph 时,管理员通常不会显式设置此值:Ceph 会自动逐步增加或减少它以匹配
pg_num。- 类型:
整数
- 有效范围:
介于
1和pg_num的当前值之间。
- crush_rule
- 描述:
设置 Ceph 用于将池的 RADOS 对象映射到相应 OSD 的 CRUSH 规则。
- 类型:
String
- allow_ec_overwrites
- 描述:
确定是否允许对纠删码池的写入仅更新 RADOS 对象的一部分。这允许 CephFS 和 RBD 对用户数据(而不是元数据)使用 EC(纠删码)池。有关详细信息,请参阅使用覆盖的纠删码。
- 类型:
Boolean
12.2.0 版新增。
- allow_ec_optimizations
- 描述:
为纠删码池启用性能和容量优化。这些优化是为 CephFS 和 RBD 工作负载设计的;具有大量小对象或具有小随机访问读取的 RGW 工作负载也将受益。具有大量顺序读取和写入的 RGW 工作负载几乎不会受益。有关详细信息,请参阅纠删码优化
- 类型:
Boolean
20.2.0 版新增。
- hashpspool
- 描述:
在给定池上设置或取消设置
HASHPSPOOL标志。- 类型:
整数
- 有效范围:
1 设置标志,0 取消设置标志
- nodelete
- 描述:
在给定池上设置或取消设置
NODELETE标志。- 类型:
整数
- 有效范围:
1 设置标志,0 取消设置标志
- 版本:
版本
FIXME
- nopgchange
- 描述:
在给定池上设置或取消设置
NOPGCHANGE标志。- 类型:
整数
- 有效范围:
1 设置标志,0 取消设置标志
- 版本:
版本
FIXME
- nosizechange
- 描述:
在给定池上设置或取消设置
NOSIZECHANGE标志。- 类型:
整数
- 有效范围:
1 设置标志,0 取消设置标志
- 版本:
版本
FIXME
- bulk
- 描述:
在给定池上设置或取消设置
BULK标志。- 类型:
Boolean
- 有效范围:
true/1设置标志,false/0取消设置标志
- write_fadvise_dontneed
- 描述:
在给定池上设置或取消设置
WRITE_FADVISE_DONTNEED标志。- 类型:
整数
- 有效范围:
1设置标志,0取消设置标志
- noscrub
- 描述:
在给定池上设置或取消设置
NOSCRUB标志。- 类型:
整数
- 有效范围:
1设置标志,0取消设置标志
- nodeep-scrub
- 描述:
在给定池上设置或取消设置
NODEEP_SCRUB标志。- 类型:
整数
- 有效范围:
1设置标志,0取消设置标志
- target_max_bytes
- 描述:
当
max_bytes阈值触发且正在使用已弃用的缓存分层功能时,Ceph 将开始刷新或逐出对象。- 类型:
整数
- 示例:
1000000000000#1-TB
- target_max_objects
- 描述:
当
max_objects阈值触发且正在使用已弃用的缓存分层功能时,Ceph 将开始刷新或逐出对象。- 类型:
整数
- 示例:
1000000#1M 对象
- fast_read
- 描述:
对于纠删码池,如果此标志设置为
on,则读取请求会向所有分片发出“子读取”,然后等待直到接收到足够的分片进行解码,然后才为客户端提供服务。如果使用 jerasure 或 isa 纠删插件,则在返回前 K 个回复后,立即使用从这些回复解码的数据为客户端请求提供服务。这种方法以牺牲资源为代价来换取更好的性能。此标志仅受纠删码池支持。- 类型:
Boolean
- 默认值:
0
- scrub_min_interval
- 描述:
设置池的 PG 连续浅层(轻度)擦洗之间的最小间隔(以秒为单位)。如果此池属性与其默认值 (
0) 保持不变,则使用中央配置中的osd_scrub_min_interval值。- 类型:
Double
- 默认值:
0
- scrub_max_interval
- 描述:
设置池的 PG 连续浅层(轻度)擦洗之间的最大间隔(以秒为单位)。影响擦洗调度程序转储中显示的“overdue”属性。如果与其默认值
0保持不变,则使用中央配置中的osd_scrub_max_interval值。- 类型:
Double
- 默认值:
0
- deep_scrub_interval
- 描述:
设置池的 PG 连续深度擦洗的间隔(以秒为单位)。如果与其默认值
0保持不变,则使用中央配置中的osd_deep_scrub_interval值。- 类型:
Double
- 默认值:
0
- recovery_priority
- 描述:
设置此值可调整池的计算保留优先级。此值必须在
-10到10的范围内。分配负值的任何池的优先级都低于任何新池,因此建议用户为低优先级池分配负值。- 类型:
整数
- 默认值:
0
- recovery_op_priority
- 描述:
设置特定池的 PGs 的恢复操作优先级。这会覆盖由
osd_recovery_op_priority确定的常规优先级。- 类型:
整数
- 默认值:
0
获取池值
要获取给定池键的值,请运行以下形式的命令
ceph osd pool get {pool-name} {key}
您可以获取以下键的值
大小
- 描述:
请参阅 size。
- 类型:
整数
min_size
- 描述:
请参阅 min_size。
- 类型:
整数
- 版本:
0.54及以上
pg_num
- 描述:
请参阅 pg_num。
- 类型:
整数
pgp_num
- 描述:
请参阅 pgp_num。
- 类型:
整数
- 有效范围:
等于或小于
pg_num。
crush_rule
- 描述:
请参阅 crush_rule。
target_max_bytes
- 描述:
请参阅 target_max_bytes。
- 类型:
整数
target_max_objects
- 描述:
请参阅 target_max_objects。
- 类型:
整数
fast_read
- 描述:
请参阅 fast_read。
- 类型:
Boolean
scrub_min_interval
- 描述:
请参阅 scrub_min_interval。
- 类型:
Double
scrub_max_interval
- 描述:
请参阅 scrub_max_interval。
- 类型:
Double
deep_scrub_interval
- 描述:
请参阅 deep_scrub_interval。
- 类型:
Double
allow_ec_overwrites
- 描述:
请参阅 allow_ec_overwrites。
- 类型:
Boolean
recovery_priority
- 描述:
请参阅 recovery_priority。
- 类型:
整数
recovery_op_priority
- 描述:
请参阅 recovery_op_priority。
- 类型:
整数
设置 RADOS 对象副本数
要设置给定复制池要维护的数据副本数,请运行以下形式的命令
ceph osd pool set {poolname} size {num-replicas}
重要
{num-replicas} 参数包括主对象本身。例如,如果您希望对象有两个副本,除了原始对象(总共三个对象实例),请指定 3,运行以下命令
ceph osd pool set data size 3
您可以对每个所需的池独立运行如上所示的命令。
注意
PG 可能在降级模式下接受 I/O,副本数少于 pool size。要设置 I/O 所需的最小副本数,应使用 min_size 设置。例如,您可以运行以下命令
ceph osd pool set data min_size 2
此命令确保如果数据池中的对象副本数少于 min_size(在本例中为两个),则不会接收 I/O。请注意,在生产环境中将 size 设置为 2 或将 min_size 设置为 1 会有数据丢失的风险,应仅在某些紧急情况下临时进行。
获取对象副本数
要获取对象副本数,请运行以下命令
ceph osd dump | grep 'replicated size'
Ceph 将列出池并突出显示 replicated size 属性。默认情况下,Ceph 维护三个副本或拷贝,大小为 3)。
管理标记有 --bulk 的池
请参阅 管理标记有 bulk 的池。
设置拉伸池的值
要为拉伸池设置值,请运行以下形式的命令
ceph osd pool stretch set {pool-name} {peering_crush_bucket_count} {peering_crush_bucket_target} {peering_crush_bucket_barrier} {crush_rule} {size} {min_size} [--yes-i-really-mean-it]
以下是参数的细分
- {pool-name}
池的名称。它必须是一个现有的池:此命令不创建新池。
- 类型:
String
- 必需:
是。
- {peering_crush_bucket_count}
此值与
peering_crush_bucket_barrier一起使用,根据选定的 acting set 中有多少个不同的存储桶,确定所选 acting set 中的 OSD 是否可以相互对等。- 类型:
整数
- 必需:
是。
- {peering_crush_bucket_target}
此值与
peering_crush_bucket_barrier和size一起用于计算值bucket_max,该值限制在 PG 的 acting set 中选择的同一存储桶中的 OSD 数量。- 类型:
整数
- 必需:
是。
- {peering_crush_bucket_barrier}
池的 PGs 分布在其中的 CRUSH 存储桶类型,例如
rack、row或datacenter。- 类型:
String
- 必需:
是。
- {crush_rule}
用于池的 CRUSH 规则。池的类型必须与 CRUSH 规则的类型匹配(
replicated或erasure)。- 类型:
String
- 必需:
是。
- {size}
池中 RADOS 对象(以及 PGs)的副本数。
- 类型:
整数
- 必需:
是。
- {min_size}
必须处于活动状态才能提供 I/O 操作的最小副本数。
- 类型:
整数
- 必需:
是。
- {--yes-i-really-mean-it}
需要此标志来确认您确实要绕过安全检查并设置池的值,例如,当您尝试将
peering_crush_bucket_count或peering_crush_bucket_target设置为大于 crush map 中的存储桶数量时。- 类型:
标志
- 必需:
否。
取消设置拉伸池的值
要将池移回非拉伸状态,请运行以下形式的命令
ceph osd pool stretch unset {pool-name} {crush_rule} {size} {min_size}
以下是参数的细分
- {pool-name}
池的名称。它必须是已拉伸的现有池,即已通过命令 ceph osd pool stretch set 设置的池。
- 类型:
String
- 必需:
是。
- {crush_rule}
退出拉伸池后要使用的 crush rule。池的类型必须与 crush_rule 的类型匹配(replicated 或 erasure)。
- 类型:
String
- 必需:
是。
- {size}
退出拉伸池后对象的副本数。
- 类型:
整数
- 必需:
是。
- {min_size}
退出拉伸池后 I/O 所需的最小副本数。
- 类型:
整数
- 必需:
是。
显示拉伸池的值
要显示拉伸池的值,请运行以下形式的命令
ceph osd pool stretch show {pool-name}
以下是参数的细分
- {pool-name}
池的名称。它必须是已拉伸的现有池,即已通过命令 ceph osd pool stretch set 设置的池。
- 类型:
String
- 必需:
是。