Ceph Pool、PG 与 CRUSH 配置参考:从集中配置数据库到实战调优
2026/9/23 11:26:20 网站建设 项目流程
  • 存储
  • 分布式文件系统
  • 对象存储
  • 后端
  • 高可用

【免费下载链接】ceph

Ceph is a distributed object, block, and file storage platform

项目地址:https://gitcode.com/gh_mirrors/ce/ceph
点击查看免费下载

Ceph 使用集中式的 Monitor 集群配置数据库管理每个存储池(Pool)的副本数、最小副本数、放置组(PG)数量等关键参数,CRUSH 算法依据这些变量把 PG 分配到 OSD 上。本篇以仓库文档 doc/rados/configuration/pool-pg-config-ref.rst 为主线,结合 src/common/options 下的真实参数定义源码,系统讲解如何查看与修改这些变量、如何手动调优 Pool 的 size/min_size/pg_num,以及 PG 自动缩放(PG Autoscaler)的工作方式,读完即可在自己的 Ceph 集群中安全地调整放置组数量与冗余策略。

一、PG 数量由谁决定:Monitor 集中配置数据库

在 Ceph 中,CRUSH 算法分配给每个 Pool 的放置组(Placement Group,PG)数量,由Monitor 集群中的集中式配置数据库里的变量值决定。这意味着无论是使用cephadm或 Rook 进行的容器化部署,还是传统的非容器化部署,最终都依赖同一套集中配置数据库来为 Pool 分配 PG。

配置数据库的完整参数定义位于仓库的 src/common/options/global.yaml.in、src/common/options/mon.yaml.in、src/common/options/mgr.yaml.in、src/common/options/osd.yaml.in 中,本文后面列出的所有默认值、类型与作用域均出自这些文件,是仓库当前版本的真实配置事实。

配置选项可以设置为三类作用域:

  1. 全局生效:影响所有守护进程;
  2. 按类型生效:影响某一类守护进程或服务(如所有osd或所有mon);
  3. 按实例生效:仅影响某个特定守护进程、进程或客户端。

Pool/PG/CRUSH 相关选项大多属于第二类或第三类,其中osd_pool_default_*系列作用于mon服务(由 Monitor 在创建 Pool 时使用),mon_*系列作用于monmgr服务(负责健康检查与状态统计),osd_*系列作用于 OSD 守护进程。

二、查看与设置 PG 数量变量的标准命令

查看某个变量的当前值

要查看决定某个 Pool 放置组数量的变量值,运行如下命令:

ceph config get osd osd_pool_default_pg_num

其中第一个参数osd是服务类型,第二个参数osd_pool_default_pg_num是变量名。你也可以把服务类型换成monmgrglobal或某个具体守护进程实例名,来查看不同作用域下的取值。

设置某个变量的值

要修改决定某个 Pool 放置组数量的变量值,运行如下命令:

ceph config set osd osd_pool_default_pg_num

例如,将新建 Pool 的默认 PG 数量改为 256:

ceph config set osd osd_pool_default_pg_num 256

ceph config set写入的是 Monitor 集中配置数据库,因此修改对所有遵守该配置的守护进程立即生效,无需像传统ceph.conf那样逐台分发文件。在容器化部署(cephadm/Rook)场景下这一优势尤为明显,因为配置变更不再依赖重启容器或重建 Pod。

通过 ceph.conf 静态配置

集中配置数据库之外,传统的ceph.conf静态配置方式依然可用。仓库文档中随附的示例配置 doc/rados/configuration/pool-pg.conf 给出了一个典型的[global]段:

[global] # By default, Ceph makes three replicas of RADOS objects. If you want # to maintain four copies of an object the default value--a primary # copy and three replica copies--reset the default values as shown in # 'osd_pool_default_size'. If you want to allow Ceph to accept an I/O # operation to a degraded PG, set 'osd_pool_default_min_size' to a # number less than the 'osd_pool_default_size' value. osd_pool_default_size = 3 # Write an object three times. osd_pool_default_min_size = 2 # Accept an I/O operation to a PG that has two copies of an object. # Note: by default, PG autoscaling is enabled and this value is used only # in specific circumstances. It is however still recommended to set it. # Ensure you have a realistic number of placement groups. We recommend # approximately 100 per OSD. E.g., total number of OSDs multiplied by 100 # divided by the number of replicas (i.e., 'osd_pool_default_size'). So for # 10 OSDs and 'osd_pool_default_size' = 4, we'd recommend approximately # (100 * 10) / 4 = 250. # Always use the nearest power of two. osd_pool_default_pg_num = 256

这段示例同时给出了三个最重要的经验法则:

  • osd_pool_default_size:默认写 3 份(1 份主副本 + 2 份副本)。想维护 4 份则改为 4;
  • osd_pool_default_min_size:允许对处于降级(degraded)状态的 PG 继续接受 I/O 的最低副本数,通常应小于size。示例中size=3min_size=2表示即使 PG 只剩 2 份拷贝仍可接受写操作;
  • osd_pool_default_pg_num:PG 数量的经验公式约为“每 OSD 100 个 PG”,即(OSD 总数 × 100) / 副本数,并向上取到最近的 2 的幂。例如 10 个 OSD、size=4时,推荐约为(100 × 10) / 4 = 250,取最接近的 2 的幂即 256。

三、手动调优:覆盖默认值

在某些场景下,覆盖部分默认值是明智的做法。例如,你可能希望为一个 Pool 单独设置副本数(replica size),并覆盖该 Pool 默认的 PG 数量。这类调整通过ceph osd pool set系列命令完成,具体见 Pool 操作指南。

设置副本数与最小副本数

# 将 pool 的副本数设为 3 ceph osd pool set {pool-name} size 3 # 将 pool 的最小可用副本数设为 2 ceph osd pool set {pool-name} min_size 2

关于这两个字段的语义(依据 doc/rados/operations/pools.rst):

  • size:Pool 中对象的副本数,仅对replicated(副本)池可直接设置;纠删码(EC)池会报告一个等于K+Msize,但不能直接修改;
  • min_size:PG 保持 active 状态(从而允许 I/O 继续)所需的最小活跃副本/分片数。对 EC 池,应设置为大于K的值——如果只在 K 个分片可用时就允许 I/O,将没有任何冗余,一旦再有 OSD 永久故障就会丢数据。

设置 PG 数量与 pgp_num

# 设置 pool 的 PG 总数 ceph osd pool set {pool-name} pg_num {pg-num} # 设置参与数据放置计算的 PG 数量 ceph osd pool set {pool-name} pgp_num {pgp-num}

字段语义(依据 doc/rados/operations/pools.rst):

  • pg_num:Pool 的 PG 总数。有效范围是0mon_max_pool_pg_num;若设为0,则使用osd_pool_default_pg_num的值。注意:如果该 Pool 开启了 PG 自动缩放(autoscaler),自动缩放器可能覆盖手动设置的值;
  • pgp_num:计算数据放置时实际生效的 PG 数量。自 Nautilus 版本起,管理员通常不再需要手动设置:Ceph 会自动增量地把pgp_numpg_num靠拢。

设置 CRUSH 规则

ceph osd pool set {pool-name} crush_rule {crush-rule-name}

该命令设置 Ceph 用于把 Pool 的 RADOS 对象映射到 OSD 的 CRUSH 规则;对于新建的副本池,默认规则由osd_pool_default_crush_rule决定(见下文参数表)。

预期对象数:避免运行时 PG 分裂的代价

创建 Pool 时可以指定expected-num-objects

ceph osd pool create {pool-name} [pg-num] [pgp-num] [crush-rule-name] [expected-num-objects]

通过预估 Pool 中预期的 RADOS 对象数,可以让 PG 分裂(split)在创建时发生,从而避免运行时分裂带来的延迟影响。默认值为 0,表示创建时不分裂(参见 doc/rados/operations/pools.rst)。

四、PG 自动缩放:默认开启的行为

现代 Ceph 集群中,osd_pool_default_pg_autoscale_mode的默认值是on,这意味着新建 Pool 时不会直接使用osd_pool_default_pg_num,而是先创建 1 个 PG,再由自动缩放器根据实际用量自动调整 PG 数量。这也解释了 pool-pg.conf 注释中的提醒:该变量只在特定场景下使用,但依然建议显式设置。该行为在 src/common/options/global.yaml.in 中有明确说明:

- name: osd_pool_default_pg_autoscale_mode type: str level: advanced desc: Default PG autoscaling behavior for new pools long_desc: When 'on', the autoscaler assigns 1 PG to new pools unless the user specifies a value. default: 'on' enum_values: - 'off' - 'warn' - 'on'

三种自动缩放模式

创建 Pool 时可通过--autoscale-mode指定模式(参见 doc/rados/operations/pools.rst):

模式行为
on集群根据实际用量自动调整 Pool 的 PG 数量
warn集群根据实际用量给出调整建议,但不自动执行
off关闭自动缩放,完全由管理员决定 PG 数量

全局默认行为由osd_pool_default_pg_autoscale_mode决定。也可以在创建后修改:

ceph osd pool set {pool-name} pg_autoscale_mode <on|off|warn>

全局开关 noautoscale

自动缩放器可以通过noautoscale标志对所有 Pool 全局启用/禁用(详见 placement-groups.rst):

# 对所有 Pool 关闭自动缩放 ceph osd pool set noautoscale # 重新开启自动缩放 ceph osd pool unset noautoscale # 查看当前标志值 ceph osd pool get noautoscale

查看自动缩放建议

ceph osd pool autoscale-status

输出示例(取自 placement-groups.rst):

POOL SIZE TARGET SIZE RATE RAW CAPACITY RATIO FINAL RATIO TARGET RATIO EFFECTIVE RATIO BIAS PG_NUM NEW PG_NUM AUTOSCALE BULK a 12900M 3.0 82431M 0.4695 0.2560 8 128 warn True c 0 3.0 82431M 0.0000 0.1280 0.2000 0.9884 1.0 1 64 warn True

该命令展示每个 Pool 的相对利用率以及 PG 数量调整建议(NEW PG_NUM列)。如果输出为空,说明所有 Pool 的 PG 数量都已达到或接近自动缩放器的目标值。若需更系统地计算 PG 数量,可参考仓库中的 PG Calculator 工具 及 PG 概念文档。

五、完整配置项参考(默认值来自当前仓库源码)

以下是本参考文档(pool-pg-config-ref.rst)所覆盖的全部配置项。表中默认值、类型、级别均取自当前仓库的 src/common/options 参数定义文件,可作为配置的权威依据。

Monitor / Manager 侧:PG 上限与健康告警

配置项类型级别默认值含义(源码出处)
mon_max_pool_pg_numuintadvanced65536每个 Pool 的最大 PG 数量(mon.yaml.in)
mon_pg_stuck_thresholdintadvanced60 秒PG 被视为 stuck(如 inactive、unclean、undersized、stale)的秒数(mgr.yaml.in)
mon_pg_warn_min_per_osduintadvanced0每个in状态的 OSD 平均 PG 数低于此值则触发HEALTH_WARN;非正数表示禁用(mgr.yaml.in)
mon_pg_warn_min_objectsintadvanced10000集群 RADOS 对象总数低于此值时不发出警告(mgr.yaml.in)
mon_pg_warn_min_pool_objectsintadvanced1000对象数低于此值的 Pool 不参与告警判断(mgr.yaml.in)
mon_pg_check_down_all_thresholdfloatadvanced0.5down 的 OSD 比例超过该阈值后检查所有 PG 是否 stale(mgr.yaml.in)
mon_pg_warn_max_object_skewfloatadvanced10某 Pool 每 PG 平均对象数超过全局平均值该倍数时触发HEALTH_WARN;非正数禁用(mgr.yaml.in)
mon_delta_reset_intervalfloatadvanced10 秒无活动时重置某 Pool 空间使用 delta 统计的窗口时长,用于ceph status中的速率计算(mgr.yaml.in)

OSD 侧:默认 Pool 属性

配置项类型级别默认值含义(源码出处)
osd_crush_chooseleaf_typeintdev1CRUSH 规则中chooseleaf使用的 bucket 类型,按序号而非名称;1 表示 host(global.yaml.in)
osd_crush_initial_weightfloatadvanced-1新加入 OSD 的初始 CRUSH 权重;负值(默认)表示按设备容量(TiB)计算,非负值则使用显式权重(osd.yaml.in)
osd_pool_default_crush_ruleintadvanced-1创建副本池时使用的默认 CRUSH 规则;-1表示“选取数值 ID 最小的规则”,以保证没有规则 0 时也能创建 Pool(global.yaml.in)
osd_pool_default_sizeuintadvanced3新建副本池对象的副本数,等价于ceph osd pool set {pool} size {n};范围 0–10(global.yaml.in)
osd_pool_default_min_sizeuintadvanced0降级模式下最低写入副本数;0 表示不设下限,此时取size - (size / 2);范围 0–255(global.yaml.in)
osd_pool_default_pg_numuintadvanced32新建 RADOS Pool 的默认 PG 数量;因自动缩放默认开启,仅当 autoscaler 关闭或创建时显式指定pg_num时才生效(global.yaml.in)
osd_pool_default_pgp_numuintadvanced0Pool 用于放置目的的默认 PG 数;0 表示跟随pg_num。除非关闭自动缩放,否则不应显式设置(global.yaml.in)
osd_pool_default_pg_autoscale_modestradvancedon新建 Pool 的默认 PG 自动缩放行为,取值off/warn/on(global.yaml.in)
osd_pool_default_flagsintdev0新建 Pool 设置的整数标志位(global.yaml.in)
osd_pool_default_flag_ec_optimizationsbooladvancedfalse新建 EC 池是否默认开启allow_ec_optimizations标志(global.yaml.in)
osd_pool_erasure_code_stripe_unitsizeadvanced0EC 池对象条带中每个数据块默认大小(字节);0 表示自动选择——开启allow_ec_optimizations时为 16KB,否则为 4KB;可被 EC profile 中的stripe_unit覆盖(mon.yaml.in)

OSD 侧:PG 操作与日志

配置项类型级别默认值含义(源码出处)
osd_max_pglsuintadvanced1000列出 Pool 对象时返回的最大 PG 数量上限;大请求可能拖住 OSD 守护进程,因此设上限(osd.yaml.in)
osd_min_pg_log_entriesuintdev250裁剪 PG 日志时保留的最小条目数(global.yaml.in)
osd_max_pg_log_entriesuintdev10000裁剪 PG 日志时保留的最大条目数(global.yaml.in)
osd_default_data_pool_replay_windowintadvanced45 秒OSD 等待客户端重放请求的时间(global.yaml.in)
osd_max_pg_per_osd_hard_ratiofloatadvanced3OSD 拒绝创建新 PG 的硬上限倍数:超过osd_max_pg_per_osd_hard_ratio × mon_max_pg_per_osd后停止新建 PG;最小值 1(global.yaml.in)

六、健康告警与监控联动

Monitor/Mgr 侧的多个mon_pg_warn_*变量共同构成 PG 健康告警体系(定义见 mgr.yaml.in):

  • 当每个inOSD 的平均 PG 数低于mon_pg_warn_min_per_osd时触发HEALTH_WARN(默认 0,即不告警);
  • 当某 Pool 每 PG 的平均对象数超过全部 Pool 平均值的mon_pg_warn_max_object_skew倍时触发HEALTH_WARN(默认 10 倍);
  • mon_pg_warn_min_objects(10000)与mon_pg_warn_min_pool_objects(1000)分别用于在集群或单 Pool 对象数过少时抑制这类告警,避免小集群上产生噪音;
  • mon_pg_stuck_threshold(60 秒)定义 PG 进入 stuck 状态(inactive/unclean/undersized/stale)的判定时间,与 监控 OSD 与 PG 文档 中的 peering 监控直接相关;
  • mon_pg_check_down_all_threshold(0.5)控制 down 的 OSD 比例超过 50% 时对所有 PG 做 stale 检查。

如果集群出现与 PG 数量相关的告警,建议先运行ceph osd pool autoscale-status查看自动缩放建议,再结合ceph config get核对相关变量的当前值,避免盲目修改。

七、CRUSH 权重相关补充

CRUSH 层的两个关键变量同样归入本参考:

  • osd_crush_chooseleaf_type:CRUSH 规则中chooseleaf使用的 bucket 类型序号,默认 1 即 host 级别,决定副本默认分散到不同主机;
  • osd_crush_initial_weight:新 OSD 的初始 CRUSH 权重,默认-1表示按设备容量(TiB)自动计算。若需显式控制,可设为非负值,具体算法参见 CRUSH Map 操作指南 中的 Weighting Bucket Items 一节。

八、常用操作速查

# 查看默认 PG 数量 ceph config get osd osd_pool_default_pg_num # 修改默认 PG 数量 ceph config set osd osd_pool_default_pg_num 256 # 修改默认副本数 / 最小副本数(等价于 pool set) ceph config set osd osd_pool_default_size 3 ceph config set osd osd_pool_default_min_size 2 # 对单个 Pool 手动调优 ceph osd pool set {pool-name} size 3 ceph osd pool set {pool-name} min_size 2 ceph osd pool set {pool-name} pg_num 256 ceph osd pool set {pool-name} pgp_num 256 ceph osd pool set {pool-name} crush_rule {rule-name} # PG 自动缩放管理 ceph osd pool autoscale-status ceph osd pool set {pool-name} pg_autoscale_mode <on|off|warn> ceph osd pool set noautoscale ceph osd pool unset noautoscale

九、进一步阅读

  • Pool、PG 与 CRUSH 配置参考(本文档源)
  • 示例配置 pool-pg.conf
  • Pool 操作指南(创建、设置属性、配额)
  • PG 自动缩放与放置组操作
  • 监控 OSD 与 PG(peering 与 stuck 判定)
  • CRUSH Map 操作指南(bucket 权重)
  • PG 概念与计算
  • 配置项定义源码:global.yaml.in / mon.yaml.in / mgr.yaml.in / osd.yaml.in
  • 存储
  • 分布式文件系统
  • 对象存储
  • 后端
  • 高可用

【免费下载链接】ceph

Ceph is a distributed object, block, and file storage platform

项目地址:https://gitcode.com/gh_mirrors/ce/ceph
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询