在 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) 创建存储池
ceph osd pool create mypool 128 128
(2) 调整 PG 数量
ceph osd pool set mypool pg_num 256
ceph osd pool set mypool pgp_num 256
(3) 特殊场景:临时限制分布
ceph osd pool set mypool pgp_num 64
6. 监控与调优建议
7. 总结
关键点 | pg_num | pgp_num |
---|
定义 | 逻辑 PG 总数 | 可用于 CRUSH 计算的 PG 数 |
主要作用 | 控制数据分片粒度 | 控制数据分布范围 |
修改影响 | 触发数据迁移(高代价) | 仅影响新数据(低代价) |
最佳实践 | 按 OSD 数量和副本数计算 | 通常与 pg_num 相同 |
简单记忆:
pg_num
是“总房间数”,决定能放多少数据。pgp_num
是“可选的房间数”,决定新数据能放哪些房间。- 两者一致时,所有房间均可自由使用。