CRUSH 解决什么问题
CRUSH(Controlled Replication Under Scalable Hashing)用确定性的伪随机函数把归置组映射到 OSD 集合。所有客户端与 OSD 持有同一份 Map,各自算出相同结果,因此不需要一个中心节点记录数据位置。这个设计让集群扩展到数千块盘,并在增删设备时只迁移受影响的 PG。
基本信息
| 输入 | 归置组编号、CRUSH Map(设备树与权重、规则)、tunables |
|---|---|
| 两步映射 | 对象名哈希到 PG,PG 经 CRUSH 选出 OSD 集合 |
| 选择算子 | take 选根,chooseleaf 按故障域选副本,emit 输出结果 |
| 默认算法 | 较新版本的 bucket 算法默认 straw2 |
| 权重语义 | 与容量成正比,通常 1TB 记 1.0 |
| 迁移特性 | 增删设备按权重比例迁移,不做全量重分布 |
典型使用场景
- 扩容前评估迁移量:按权重比例估算受影响的 PG 范围
- 核对池的副本落点:比对规则中的故障域与实际设备树结构
- 排除部分盘参与业务池:借助 device class 或独立规则限制
- 排查分布不均:确认权重、规则与 PG 数量三者是否匹配
- 评估机架级容灾能力:规则中的故障域是否已提升到机架
查阅与模拟分布
查阅与模拟分布
ceph osd getcrushmap -o /tmp/map.bin # 导出二进制 Map
crushtool -d /tmp/map.bin -o /tmp/map.txt # 反编译为可读文本
crushtool -c /tmp/map.txt -o /tmp/map2.bin # 编译回二进制
crushtool -i /tmp/map.bin --test --show-utilization --min-x=0 --max-x=500 # 模拟分布
ceph osd crush rule dump # 查看现有规则定义
ceph osd crush rule create-replicated r-hdd default host hdd # 建按主机故障域的副本规则CRUSH 关键概念
| 概念 | 含义 | 配置要点 |
|---|---|---|
| tunables | 控制哈希行为的兼容参数集 | 集群内取值应统一,混用会造成分布不一致 |
| bucket 算法 | 同一层级内设备的选择算法 | straw2 分布最均匀,新集群保持默认即可 |
| 规则 ruleset | 从根到叶的选择路径 | 规则决定池的落点,改规则会触发迁移 |
| 权重 weight | 设备承担数据的比例 | 应与真实可用容量成正比 |
| 故障域 | 副本不会落在同一域内 | 默认按主机,多机架部署应提升到机架 |
crushtool 的模拟测试可以在不落地的情况下输出分布与使用率结果,是评估规则改动影响最省事的手段。任何涉及规则的变更,都建议先模拟再执行。
手工反编译再编译回 Map 时,任何语法或权重错误都会在应用后立刻影响全集群的数据分布,且回滚需要时间。变更前先导出当前 Map 备份,并安排在业务低峰执行。
权重比数量更重要
CRUSH 按权重而不是按设备数量分配数据。容量差异较大的盘混装时,如果权重被人为均分,小盘与大容量盘会承担同样多的 PG,容量利用率出现明显差距。正确做法是让权重与可用容量成正比,或用 device class 把不同介质分开承载不同池。