首页/系统与基础设施/存储速查/Ceph OSD 工作原理与数据分布
分布式与对象存储70 条

Ceph OSD 工作原理与数据分布

OSD 是 Ceph 中真正落盘的守护进程,通常一块盘对应一个 OSD。对象先按名称哈希映射到归置组,再由 CRUSH 选出承载该组副本的 OSD 列表。本文说明这条数据路径、落盘引擎与分布均匀性的判读方法。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌​​‌​‌​​‌​‌‌‌‌​‌‌​​​‌‌​‌‌​​‌​‌​‌‌‌​​​​​‌‌​‌​​​​​‌​‌‌​‌​‌‌​‌‌‌‌​‌‌‌​​‌‌​‌‌​​‌​​​​‌​‌‌​‌​‌‌​​‌​​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​​​‌​​‌​‌‌​‌​‌‌​​‌​​​‌‌​‌​​‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​​​‌​​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

OSD 在数据路径上的位置

OSD(Object Storage Daemon)是 Ceph 中唯一真正读写磁盘的守护进程,常规部署一块盘一个 OSD。上层写入的数据先被切成对象,对象按名称哈希落到某个归置组(PG),再由 CRUSH 算出承载这个 PG 的 OSD 列表,列表首位是 primary,负责协调副本写入。客户端与服务端各自用同一份 Map 计算,因此不需要中心节点记录数据位置。

基本信息

部署粒度常规一块物理盘一个 OSD,单盘多 OSD 在性能敏感场景不推荐
落盘引擎新版本默认 BlueStore,直接管理裸设备,元数据放 RocksDB
权重语义CRUSH 权重按容量比例设置,通常 1TB 记 1.0
状态维度up/down 表示进程是否存活,in/out 表示是否参与数据分布
内存占用每 OSD 常驻数百 MB 起,PG 与对象数量大时更高
数据校验默认周期性 scrub 校验副本一致性,deep-scrub 会读取数据区

典型使用场景

  • 新集群盘位规划:按实际容量设定权重,避免大盘小盘一视同仁
  • 单盘性能异常定位:锁定到具体 OSD 后查看其延迟、队列与内核错误
  • 核对数据落点:用 osd map 与 pg map 确认副本实际分布在哪几块盘
  • 扩容前的容量与 PG 预算:新增 OSD 后确认每 OSD 的 PG 数与使用率
  • 恢复过程观察:down 或 out 之后要迁移多少数据由 OSD 侧参数决定

分布查看命令

分布查看命令
ceph osd stat            # 总数、up 与 in 的数量
ceph osd tree            # 层级结构、权重、up/down、in/out
ceph osd df              # 每 OSD 的容量使用率与偏差
ceph osd map <pool> <object>   # 对象所属 PG 与承载集合
ceph pg map <pgid>       # 指定 PG 的承载 OSD 列表
ceph osd metadata <id>   # 该 OSD 的设备型号与所在主机

输出逐列读法

字段含义判读要点
IDOSD 编号后续定位单盘的唯一依据
WEIGHTCRUSH 权重与真实容量不符时使用率会长期不均
UP/DOWN进程是否存活down 且未 out 会拖住对应的 PG 恢复
IN/OUT是否参与数据分布out 表示数据正在被迁出,迁移未完成前不要删 OSD
PRI-AFF主副本亲和度长期远低于 1 说明分布可能需复核
USE% 与 VAR使用率与偏差系数VAR 越大表示各 OSD 之间越不均衡
BlueStore 把数据写在裸设备上,元数据与 WAL 可放到独立介质:小规模常与数据同盘,容量或性能敏感时会把 block.db 放到 NVMe。介质组合需要在建 OSD 时确定,后期更换等于重建 OSD。
不先 out 就直接删除或重建 OSD,会让 PG 丢失副本并可能进入 incomplete 状态,此时只能从未损坏副本尽力恢复。规范顺序是 out、等待数据迁移完成、再移除 OSD。

分布不均的排查顺序

使用率长期不均,先看权重是否按容量设置,再看 CRUSH 规则是否把部分 OSD 排除在外,然后确认 PG 数量是否过少导致分配粒度太粗,最后才考虑微调 reweight。临时 reweight 在 OSD 重启后失效,需要持久效果就改 CRUSH 权重。

易错点

  • 单盘跑多个 OSD 想提高吞吐:单盘 IOPS 是硬上限,多进程只会互相争抢,延迟反而更差
  • 权重按盘数而非容量设置:大盘迅速接近写满而小盘闲置,触发池近满告警
  • OSD down 后直接 rm:PG 立即降级甚至 incomplete,应先 out 并等恢复完成
  • 看到 down 就批量重启主机:可能同时打掉多个副本,短暂失去可用性
  • 忽略每 OSD 的 PG 数量:PG 过多推高内存与 peering 开销,恢复时间反而拉长

数据来源与参考

  • Ceph 官方文档《OSD 与 RADOS 数据分布》章节
  • 论文《RADOS: A Scalable, Reliable Storage Service for Petabyte-scale Storage Clusters》
  • Ceph 官方文档《ceph osd tree 与 CRUSH 映射》

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/storage/ceph-osd-data-distribution.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌​​‌​‌​​‌​‌‌‌‌​‌‌​​​‌‌​‌‌​​‌​‌​‌‌‌​​​​​‌‌​‌​​​​​‌​‌‌​‌​‌‌​‌‌‌‌​‌‌‌​​‌‌​‌‌​​‌​​​​‌​‌‌​‌​‌‌​​‌​​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​​​‌​​‌​‌‌​‌​‌‌​​‌​​​‌‌​‌​​‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​​​‌​​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​