在 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是"可选的房间数",决定新数据能放哪些房间。- 两者一致时,所有房间均可自由使用。