跳转至

架构、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 自动伸缩模式和预期数据比例。
  • 应用类型,例如 rbdcephfsrgw
  • 配额、压缩等池级属性。

不同业务应使用独立 Pool,便于设置故障域、设备类型、容量目标和权限,但不应为每个小用途创建大量 Pool。每个 Pool 都会产生 PG 和管理开销。

ceph osd pool ls detail
ceph osd pool get <pool> all
ceph df detail

Object、PG 与 OSD

  • Object:Ceph 实际存储和复制的数据单元。
  • PG:一组对象的逻辑分片,是 Ceph 执行放置、Peering 和恢复的管理单位。
  • OSD:通常对应一块由 BlueStore 管理的数据设备,负责保存对象。

Ceph 不为每个对象单独维护完整放置信息,而是先把对象映射到 PG,再把 PG 映射到一组 OSD。这在对象数量很大时可以控制元数据规模。

现代版本通常启用 PG Autoscaler。优先设置池的预期占用比例或容量,让 Autoscaler 给出或执行调整,不再照搬旧教程手工计算固定 pg_num

ceph osd pool autoscale-status
ceph osd pool set <pool> pg_autoscale_mode on

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 层级和相应规则。只有三台主机时,三副本池失去一台主机后通常已处于降级状态,必须尽快恢复,不能认为还有两份数据就可以长期运行。

ceph osd tree
ceph osd crush tree
ceph osd crush rule ls
ceph osd crush rule dump <rule>

副本池与纠删码池

副本池

三副本池通常配置 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 状态、容量水位、网络和最近变更判断根因。

官方参考:PoolsPlacement GroupsCRUSH Maps