架构、RADOS 与 CRUSH¶
RADOS 对象模型¶
RADOS 是 Ceph 的底层分布式对象存储。RBD 镜像、CephFS 文件和 RGW 对象最终都会转换为 RADOS Object 并保存在 OSD 中。
RBD / CephFS / RGW
↓
Pool(逻辑存储池)
↓
Object(底层数据对象)
↓ 哈希映射
PG(Placement Group)
↓ CRUSH 规则
OSD Acting Set
Pool¶
Pool 是对象的逻辑分区,同时定义数据保护和放置策略:
- 使用副本池还是纠删码池。
- 副本数
size和允许 IO 的最低副本数min_size。 - 使用哪条 CRUSH Rule。
- PG 自动伸缩模式和预期数据比例。
- 应用类型,例如
rbd、cephfs或rgw。 - 配额、压缩等池级属性。
不同业务应使用独立 Pool,便于设置故障域、设备类型、容量目标和权限,但不应为每个小用途创建大量 Pool。每个 Pool 都会产生 PG 和管理开销。
Object、PG 与 OSD¶
- Object:Ceph 实际存储和复制的数据单元。
- PG:一组对象的逻辑分片,是 Ceph 执行放置、Peering 和恢复的管理单位。
- OSD:通常对应一块由 BlueStore 管理的数据设备,负责保存对象。
Ceph 不为每个对象单独维护完整放置信息,而是先把对象映射到 PG,再把 PG 映射到一组 OSD。这在对象数量很大时可以控制元数据规模。
现代版本通常启用 PG Autoscaler。优先设置池的预期占用比例或容量,让 Autoscaler 给出或执行调整,不再照搬旧教程手工计算固定 pg_num。
CRUSH¶
CRUSH 根据集群拓扑、权重、设备类型和规则计算 PG 应放在哪些 OSD。它不仅负责“均匀分盘”,更重要的是保证副本跨越正确的故障域。
root default
├── rack rack-a
│ ├── host ceph-01 ── osd.0 osd.1
│ └── host ceph-02 ── osd.2 osd.3
└── rack rack-b
├── host ceph-03 ── osd.4 osd.5
└── host ceph-04 ── osd.6 osd.7
如果三副本规则的 failure domain 是 host,三个副本应落到三台不同主机;如果要求跨机架容灾,则要设计 rack 层级和相应规则。只有三台主机时,三副本池失去一台主机后通常已处于降级状态,必须尽快恢复,不能认为还有两份数据就可以长期运行。
副本池与纠删码池¶
副本池¶
三副本池通常配置 size=3。写入逻辑简单、随机 IO 和恢复表现相对直接,适合 RBD、CephFS 元数据以及更新频繁的小对象。
size=2 虽然节省空间,但任一副本故障后只剩一份;若恢复完成前再次故障,可能永久丢失数据,不应作为常规生产设计。
纠删码池¶
k+m 表示 k 个数据分片与 m 个校验分片。例如 4+2 将数据编码成 6 份,可容忍满足规则的 2 个分片故障,理论空间开销约为 1.5 倍。
纠删码适合大对象、归档和容量敏感场景。以下场景需要专项测试:
- 小块随机写和频繁覆盖。
- 故障恢复期间的 CPU 与网络消耗。
- RBD/CephFS 覆盖写支持及所需池属性。
- 实际 failure domain 是否能承受预期节点或机架故障。
PG 状态¶
| 状态 | 含义 |
|---|---|
active+clean |
PG 可用且副本完整,是正常目标状态 |
degraded |
副本或分片数量不足,通常仍可服务但冗余下降 |
undersized |
Acting Set 成员少于池的 size |
peering |
OSD 正在协商 PG 权威历史 |
remapped |
PG 临时映射到不同 OSD,常见于恢复或均衡 |
backfilling / recovering |
正在复制数据以恢复冗余或重新分布 |
inconsistent |
Scrub 发现副本不一致,需要确认原因后修复 |
inactive / stale |
PG 无法正常提供服务,需要优先处理 |
active+clean 数量只是结果。出现异常时还要结合 OSD 状态、容量水位、网络和最近变更判断根因。
官方参考:Pools、Placement Groups、CRUSH Maps。