故障域是什么
故障域描述的是「会一起坏掉的范围」:同一台服务器、同一个机架、同一路供电、同一个机房。机架感知的意思是,同一份数据的多份副本或编码块不能被放进同一个故障域。集群本身并不知道物理布局,它完全依赖运维人员填写的层级信息判断隔离,因此拓扑填错时隔离也就跟着失效。
选择机制怎么工作
设备在层级树中被逐个分组,逐级向上直到根节点。写入时按规则自上而下选择路径,并在规则指定的层级上做出唯一选择,这一层就是副本之间不会重复的边界。由此得到一条硬约束:层级树的每一层宽度都必须能够容纳所需的副本份数或编码块总数,否则选择过程无法满足规则。
基本信息
| 适用平台 | 跨机架或跨机房部署的集群 |
|---|---|
| 边界单元 | 主机、机架、房间、机房等层级 |
| 隔离目标 | 同一份数据的副本不在同一域内 |
| 关键约束 | 每层宽度不小于副本数或块总数 |
| 表达方式 | 层级树结构与分布规则中的选择层级 |
| 验证方法 | 查看层级树与单个归置组的实际选点 |
典型使用场景
- 多机架机房:把主机挂到机架分组下,选择层级提升到机架
- 跨机房部署:先评估网络时延与带宽是否满足重建与写入
- 双机房高可用:配合额外仲裁机制,避免网络分区导致两侧同时写入
- 介质分离:高速介质单独建组,与故障域维度叠加使用
- 变更前验证:确认同一份数据的多个副本确实落在不同域内
层级查看与调整
层级查看与调整
ceph osd crush tree # 检查设备在层级树中的实际归属
ceph osd crush rule dump # 查看规则中指定的选择层级
ceph osd crush add-bucket rack02 rack # 新建一个机架分组
ceph osd crush move host03 rack=rack02 # 把主机挂到该机架之下
ceph osd getcrushmap -o /tmp/map.bin # 变更前导出备份便于回退
ceph pg map 1.0 # 查看该归置组的实际选点是否跨域层级与宽度要求
| 选择层级 | 最小宽度 | 适用场景 |
|---|---|---|
| 主机级 | 不少于副本数的可用主机 | 单机架或小规模集群 |
| 机架级 | 不少于副本数或块总数的机架 | 多机架机房 |
| 机房级 | 满足宽度且网络条件允许 | 跨机房或跨楼层部署 |
| 介质维度 | 与故障域维度正交 | 介质混装时叠加筛选 |
| 设备级 | 没有隔离效果 | 仅限测试环境 |
宽度不足时选择会悄悄回退:某一层的分组数量少于需要选出的数量,选择过程便退到更细的层级,结果看起来一切正常,实际却出现同一故障域内存在多个副本的情况。设计层级前先数清每层的宽度。
同一机架的设备被挂到不同机架分组下,是隐蔽而危险的错配:隔离看似生效,物理上仍共用供电与交换机,一处故障依然会同时带走多份数据。拓扑填写必须与真实机房布局一致。
提升故障域的代价
故障域越宽,跨域流量越多:写入与重建都可能跨机架甚至跨机房传输,对带宽与时延提出更高要求。跨机房部署还要考虑网络分区场景,需要额外的仲裁机制避免两侧同时写入同一份数据。隔离程度与成本必须一起权衡,并非越宽越好。