ceph集群PG数具体计算过程(我们有七个osd)
1. 当前 PG 总量计算
总 PG 数 = 所有存储池的 pg_num 之和
通过你的命令 ceph osd pool ls detail | grep pg_num,各池的 pg_num 如下:
| 存储池名称 | pg_num | 副本数(size) | 实际 PG 副本数(pg_num × size) |
|---|---|---|---|
| .mgr | 1 | 3 | 3 |
| cephfs_data | 32 | 3 | 96 |
| cephfs_metadata | 32 | 3 | 96 |
| .rgw.root | 32 | 3 | 96 |
| default.rgw.log | 32 | 3 | 96 |
| default.rgw.control | 32 | 3 | 96 |
| default.rgw.meta | 32 | 3 | 96 |
| default.rgw.buckets.index | 32 | 3 | 96 |
| default.rgw.buckets.non-ec | 32 | 3 | 96 |
| default.rgw.buckets.data | 256 | 3 | 768 |
- 总实际 PG 副本数 =
3 + 96×8 + 768 = 3 + 768 + 768 = 1539 - 每个 OSD 的 PG 副本数 =
1539 ÷ 7 (OSD 数量) ≈ 219.86→ 已接近每个 OSD 250 PG 的限制。
2. 报错原因分析
- 你尝试创建新池
yinzhengjie-k8s时指定pg_num=128,这会新增128 × 3(副本数)= 384个 PG 副本。 - 新增后的总 PG 副本数 =
1539 + 384 = 1923→ 每个 OSD 需要承载1923 ÷ 7 ≈ 274.71个 PG,超过了默认的mon_max_pg_per_osd=250限制。
3. 解决方案
(1) 方法 1:临时调高 mon_max_pg_per_osd
允许单个 OSD 承载更多 PG(需谨慎,可能影响性能):
ceph config set mon mon_max_pg_per_osd 300
然后重新创建池:
ceph osd pool create yinzhengjie-k8s 128 128
(2) 方法 2:优化现有池的 PG 数
减少部分高 pg_num 池的 PG 数量(例如 default.rgw.buckets.data 的 pg_num=256 过高):
# 调整该池的 pg_num 到合理值(例如 64)
ceph osd pool set default.rgw.buckets.data pg_num 64
ceph osd pool set default.rgw.buckets.data pgp_num 64
调整后:
- 原 PG 副本数减少
(256 - 64) × 3 = 576 - 释放空间后可安全创建新池。
(3) 方法 3:启用 PG 自动缩放(推荐)
让 Ceph 自动优化 PG 数量:
# 对所有池启用自动缩放
ceph config set global osd_pool_default_pg_autoscale_mode on
Ceph 将根据数据量自动调整 PG 数,避免手动计算。
(4) 方法 4:扩展 OSD 节点
添加更多 OSD 节点以分担 PG 负载(最根本的解决方案)。
4. 验证命令
- 查看当前 PG 分布:
ceph osd pool autoscale-status - 检查集群 PG 总量:
ceph osd pool stats
5. PG 规划参考公式
- 单个池的推荐 PG 数:
pg_num ≈ (预计数据量 TB × 100) / 副本数 - 总 PG 数上限:
总 PG 数 ≤ mon_max_pg_per_osd × OSD 数量
总结
| 方法 | 操作难度 | 风险 | 效果 |
|---|---|---|---|
调高 mon_max_pg_per_osd |
低 | 中 | 临时解决,可能影响性能 |
| 优化现有池 PG 数 | 中 | 高 | 长期有效,需停机维护 |
| 启用 PG 自动缩放 | 低 | 低 | 自动化管理,推荐方案 |
| 扩展 OSD 节点 | 高 | 低 | 根本解决,但成本高 |
建议顺序:先启用自动缩放 → 扩展 OSD → 必要时临时调高 PG 限制。
浙公网安备 33010602011771号