Ceph CRUSH map 调优实战:从默认到机架感知
默认 CRUSH 把数据按 host 分布,但生产经常需要按机架、机房分布做高可用。本文示范从默认改到机架感知的完整流程。
默认 CRUSH 长啥样
ceph osd tree
输出大概:
ID CLASS WEIGHT TYPE NAME
-1 12.0 root default
-2 4.0 host node1
0 hdd 1.0 osd.0
...
只有 root → host → osd 三层。
加 rack 一层
# 创建 rack
ceph osd crush add-bucket rack1 rack
ceph osd crush add-bucket rack2 rack
# 把 host 移到对应 rack 下
ceph osd crush move node1 rack=rack1
ceph osd crush move node2 rack=rack1
ceph osd crush move node3 rack=rack2
# 把 rack 挂到 root
ceph osd crush move rack1 root=default
ceph osd crush move rack2 root=default
改规则 — 副本跨机架
# 导出默认 rule
ceph osd getcrushmap -o /tmp/crush.bin
crushtool -d /tmp/crush.bin -o /tmp/crush.txt
# 改 rule,把 step chooseleaf type host 改成 type rack
vi /tmp/crush.txt
改完编译回去:
crushtool -c /tmp/crush.txt -o /tmp/crush.new
ceph osd setcrushmap -i /tmp/crush.new
验证
ceph pg dump | awk '/active+clean/ {print $1, $15}' | head
# 看 acting set 里的 OSD 是不是真的跨 rack 了
一个常见坑
如果 rack 数量 < pool 副本数(比如只有 2 个 rack 但 size=3),改完规则后 PG 会变 undersized。要么加 rack,要么把 size 降到 rack 数量。
进阶:upmap 平衡器
CRUSH 是伪随机,分布不可能完全均匀。打开 upmap 平衡器:
ceph balancer mode upmap
ceph balancer on
它会自动微调 PG 位置,把不均匀度降到 5% 以内。Nautilus 以上默认就是 upmap。