在 Ceph 中,pg_num
(Placement Group 数量)和 pgp_num
(Placement Group for Placement 数量)是存储池的两个关键参数,虽然通常设置为相同值,但它们的职责完全不同。以下是详细对比和解释:
1. 核心区别
参数 | 作用范围 | 影响阶段 | 修改代价 |
---|---|---|---|
pg_num |
数据逻辑分片数量 | 数据写入阶段 | 高(触发数据迁移) |
pgp_num |
CRUSH 计算时的可用 PG 范围 | 数据分布阶段 | 低(仅影响新写入) |
2. 具体功能解析
(1) pg_num
:逻辑 PG 数量
- 作用 :决定存储池中逻辑分片(PG)的总数 ,直接影响:
- 数据分布的粒度(PG 越多,分布越均匀)。
- 每个 OSD 承载的 PG 数量(需满足
(pg_num × 副本数) / OSD总数 ≈ 100
)。
- 修改影响 :
- 增加
pg_num
会触发 数据重平衡(大规模数据迁移)。 - 减少
pg_num
通常不允许(可能导致数据丢失)。
- 增加
(2) pgp_num
:CRUSH 计算时的 PG 范围
- 作用 :限定 CRUSH 算法在计算数据分布时可用的 PG 数量 (必须 ≤
pg_num
)。- 仅影响新写入数据的分布位置。
- 不改变现有数据的 PG 映射(除非手动触发重平衡)。
- 修改影响 :
- 增加
pgp_num
仅影响新数据,无数据迁移。 - 减少
pgp_num
可能导致新数据分布更集中(但旧数据不变)。
- 增加
3. 为什么通常设置为相同值?
- 默认最佳实践 :
当pgp_num == pg_num
时,所有 PG 均可用于数据分布,确保:- 最大化的数据分散性。
- 避免人为限制 CRUSH 算法的选择范围。
- 例外情况 :
在特殊场景下(如临时优化性能),可能会设置pgp_num < pg_num
,但通常不推荐。
4. 工作流程对比
(1) 数据写入流程
- 计算 PG :
hash(object) % pg_num
→ 确定对象所属的 PG(逻辑分片)。 - 计算 OSD :CRUSH 从
pgp_num
范围内的 PG 中选择目标 OSD。
(2) 修改参数的影响
操作 | pg_num 变化 |
pgp_num 变化 |
---|---|---|
增加 | 触发数据迁移(分裂 PG) | 仅影响新数据分布 |
减少 | 通常禁止 | 可能导致新数据分布收缩 |
5. 生产环境示例
(1) 创建存储池
bash
# 创建池时通常设置 pg_num = pgp_num
ceph osd pool create mypool 128 128 # pg_num=128, pgp_num=128
(2) 调整 PG 数量
bash
# 扩容时同时增加 pg_num 和 pgp_num(避免数据分布受限)
ceph osd pool set mypool pg_num 256
ceph osd pool set mypool pgp_num 256 # 必须手动执行,不会自动同步
(3) 特殊场景:临时限制分布
bash
# 临时缩小 pgp_num 以减少数据分散(如调试性能问题)
ceph osd pool set mypool pgp_num 64 # 仅新数据使用前64个PG
6. 监控与调优建议
-
检查当前设置 :
bashceph osd pool get mypool pg_num ceph osd pool get mypool pgp_num
-
确保一致性 :
bash# 如果 pgp_num < pg_num,建议调整为相同值 ceph osd pool set mypool pgp_num <pg_num_value>
-
重平衡触发 :
- 修改
pg_num
后,Ceph 会自动启动数据迁移。 - 可通过
ceph -w
监控迁移进度。
- 修改
7. 总结
关键点 | pg_num |
pgp_num |
---|---|---|
定义 | 逻辑 PG 总数 | 可用于 CRUSH 计算的 PG 数 |
主要作用 | 控制数据分片粒度 | 控制数据分布范围 |
修改影响 | 触发数据迁移(高代价) | 仅影响新数据(低代价) |
最佳实践 | 按 OSD 数量和副本数计算 | 通常与 pg_num 相同 |
简单记忆:
pg_num
是"总房间数",决定能放多少数据。pgp_num
是"可选的房间数",决定新数据能放哪些房间。- 两者一致时,所有房间均可自由使用。