默认 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。

标签: none

添加新评论