Map 由五部分组成
CRUSH Map 是一份声明式配置:tunables 定义哈希行为,devices 列出所有 OSD,types 定义层级类型(如机房、机架、主机、OSD),buckets 把设备组织成树,rules 规定每个池从根到叶的选择路径。客户端与 OSD 各持一份,因此它们的取值必须一致。
基本信息
| 组成部分 | tunables、devices、types、buckets、rules |
|---|---|
| 故障域 | 由规则中 chooseleaf 的类型决定,副本不在同一域内重复 |
| 常用层级 | root 到机架到主机到 OSD,可按机房与房间继续细分 |
| 设备类别 | device class 标记 hdd、ssd、nvme,规则可限定在本类介质内选点 |
| 变更入口 | 优先使用 ceph osd crush 系列命令,避免手工改文本 |
| 风险操作 | 应用新的 Map 会立即改变全集群的数据分布 |
典型使用场景
- 多机架部署:把主机归入机架,规则故障域提升到机架级
- 介质分离:SSD 承载元数据池、HDD 承载数据池,各用独立规则
- 故障域评估:确认某一层级的设备数量是否够容纳副本数
- 排查副本集中:同一 PG 的多个副本落在同一主机,多为故障域设得过低
- 变更前备份:导出当前 Map 以便快速回退
层级查看与调整
层级查看与调整
ceph osd crush tree # 查看 bucket 层级与设备归属
ceph osd crush dump # 输出完整 Map
ceph osd crush add-bucket rack01 rack # 新建机架 bucket
ceph osd crush move host01 rack=rack01 # 把主机挂到机架下
ceph osd getcrushmap -o /tmp/map.bin # 变更前先导出备份
ceph osd crush rule dump # 确认规则中的故障域类型故障域层级取舍
| 层级 | 适用规模 | 要点 |
|---|---|---|
| 主机级 | 单机架或小规模集群 | 默认设置,副本跨主机即可满足冗余 |
| 机架级 | 多机架机房 | 避免整机架断电影响同一 PG 的多个副本 |
| 机房或房间级 | 跨机房或跨楼层部署 | 设备数量必须足够,否则选点会回退 |
| 设备类别维度 | 介质混装 | 与故障域正交,可叠加使用 |
| OSD 级 | 仅测试环境 | 副本可能落在同一主机,没有真实冗余 |
某一层级的设备数量少于池的副本数时,CRUSH 选点会回退到更细的层级,出现副本落在同一上层域的情况。设计层级前先数清每层的宽度,层级要与真实冗余边界一致。
调整故障域会触发大范围数据迁移:原本落在同一主机的副本需要迁往其他主机,迁移量可能接近该池的数据总量。变更前评估时间窗口并安排在业务低峰。
先数设备再定层级
层级不是越细越好。只有单机架时把故障域设成机架级,副本选择反而受限并回退;跨机房部署却只设主机级,机房级故障会同时打掉多个副本。设计依据是真实拓扑与每层宽度,而不是照搬他人配置。