ceph osd tree展示osd的层级拓扑(host/rack/root等)、状态(up/down)和权重(reweight),反映crush位置分布而非pg副本分布;需结合ceph pg map等命令定位实际副本落点。

什么是 ceph osd tree,它能告诉你什么
ceph osd tree 输出的是 OSD 层级的拓扑结构,包括 host、rack、root 等 bucket 类型,以及每个 OSD 的状态(up/down)、权重(reweight)和所在位置。但它**不直接显示某个 PG 或对象的副本落在哪些 OSD 上**——那是 ceph pg map 或 ceph osd map 的职责。ceph osd tree 只反映“物理/逻辑位置分布”,不是“数据副本分布”。想看副本落点,得先定位 PG,再查映射。
怎么用 ceph osd tree 辅助判断副本分布合理性
虽然它不显示具体副本位置,但它是验证 CRUSH 规则是否生效的第一道关卡。常见误判场景如下:
- 所有 OSD 都挂在同一个
hostbucket 下,而 CRUSH rule 却设为replicated_rule+rack类型:实际副本仍会挤在同一台机器上,因为 topology 缺失 rack 划分 -
ceph osd tree中某 rack 下只有 1 个 OSD,但副本数为 3:CRUSH 无法满足故障域隔离,会退化到同 rack 内重复放置(甚至同 host),ceph -s可能报HEALTH_WARN too few PGs per OSD或pool N has no replicas - OSD 权重(
reweight)全为 0 或异常低:该 OSD 不参与数据分配,即使在线也不会被选为副本目标
执行 ceph osd tree 后,重点扫视三列:TYPE(确认 bucket 层级是否建对)、WEIGHT(是否全 > 0)、STATUS(up/down 是否与预期一致)。
真正查副本落点:从 pool → PG → OSD 链路操作
假设你想知道 pool rbd 中某个对象(如 rbd_id.myimage)的副本在哪几个 OSD:
- 先算出它归属的 PG:
rados -p rbd ls | head -1 | xargs -I{} ceph osd map rbd {}(或直接用rados lspools+ceph pg dump | grep 'rbd'拿活跃 PG) - 拿到 PG ID(如
9.5f)后,运行:ceph pg map 9.5f,输出里acting字段就是当前承载该 PG 副本的 OSD ID 列表(如[2,5,8]) - 再用
ceph osd tree查看 OSD 2/5/8 分别属于哪个 host/rack:快速判断它们是否跨了预设的故障域
注意:acting 是当前活跃副本集,可能因 rebalance 或 down OSD 而临时变化;稳定状态下应与 CRUSH rule 输出一致(可用 ceph osd crush rule dump replicated_rule 验证)。
为什么有时 ceph osd tree 显示正常,但副本还是不跨 rack
最常被忽略的点是 CRUSH rule 和 bucket 的关联没生效:
- 你新建了
rackbucket 并把 OSD 加进去了,但没在 CRUSH rule 中指定take到该 rack bucket,而是仍take默认defaultroot —— 此时ceph osd tree看起来有 rack,实际 rule 根本不走它 - OSD 的 crush location(
ceph osd crush set设置的位置)和ceph osd tree显示的不一致:比如ceph osd tree显示 OSD 3 在 rack1,但ceph osd getcrushmap -o map.txt && crushtool -d map.txt -o map.txt.decoded里发现其 location 是root=default host=node1,说明位置未更新 - CRUSH rule 的
step chooseleaf firstn 0 type rack写成了type host,或者firstn值小于副本数(如副本=3,但写firstn 2)
查 CRUSH 实际行为,比盯着 ceph osd tree 更有效的是:ceph osd crush show-tunables 看版本,ceph osd crush rule dump 看步骤,ceph osd crush class ls 确认 device class 是否干扰了选择(比如 SSD/HDD class 分离导致跨 rack 失败)。










