前言
在 Ceph 中,PG、PGP、pg_num、pgp_num 是最容易混淆、也是最高频的知识点。绝大多数初学者都会疑惑:明明已经有了 PG,为什么 Ceph 还要额外设计一个 PGP?两个参数 pg_num 和 pgp_num 看似雷同,到底分工是什么?扩容时为什么必须先改 pg_num,再改 pgp_num?
一、基础概念:什么是 PG?
PG(Placement Group,归置组) ,是 Ceph 数据管理的最小逻辑单元。
Ceph 完整的数据映射链路:Object 对象 → PG 归置组 → OSD 磁盘节点。
Ceph 不会直接以单个对象为单位管理数据,因为对象数量极其庞大(数十亿级别),直接管理性能极差。因此通过 PG 将海量对象分组,统一收拢管理。
Ceph 所有后台操作,全部以 PG 为最小粒度:
-
数据副本同步、故障恢复
-
磁盘巡检(scrub)、数据校验、修复
-
数据跨节点迁移、集群负载均衡
简单总结:PG 就是对象的"逻辑收纳箱",只负责分组,不负责数据搬家调度。
二、核心难点:什么是 PGP?
PGP 全称 Placement Group for Placement 。直译:用于 CRUSH 落地分配的归置组。
想要理解 PGP,首先要读懂 Ceph 顶级设计思想:将 PG 扩容拆分为两个独立动作,解耦"逻辑分裂"和"物理搬家"。
如果 PG 扩容时,分裂数据、跨节点搬家同时执行,会瞬间产生海量磁盘IO与网络流量,直接打满集群资源,导致线上业务延迟雪崩。
因此 Ceph 把扩容拆成两步:
-
第一步:本地逻辑拆分:只在本地 OSD 修改元数据,拆分 PG,不移动真实数据,无性能损耗
-
第二步:全局物理均衡:后台缓慢跨节点迁移数据,可控限流,不影响业务
为了实现这个解耦设计,Ceph 引入了 PGP:
PG 负责逻辑分组,PGP 负责物理调度。
通俗白话解释:
-
PG:只是给对象分配编号、完成本地分组
-
PGP:决定哪些 PG 拥有资格参与 CRUSH 算法调度、跨 OSD 搬家、全局均衡