知识卡片
副本数不能超过故障域数量
内容
CRUSH 默认的隔离域是 Host 级,即[[ClusterMap的树状故障域]]里 Bucket 树的某一层级,意味着同一个 PG 的每个副本必须落在不同主机上。如果集群的主机数少于配置的副本数(比如只有 2 台机器却要放 3 副本),CRUSH 无论怎么算都凑不出那么多满足隔离条件的主机,PG 会永远卡在 degraded 状态、无法收敛成 active+clean。解决只有两条路:要么把副本数调低到不超过主机数,要么把隔离域从 Host 降级到更细粒度的 OSD(代价是失去”同一份数据不会因为一台机器宕机而全部丢失”这层保护)。发散:这是任何”带约束的放置策略”都会遇到的可行性问题——约束条件(隔离域)和资源数量(节点数)不匹配时,系统不是报错就是卡死,扩容前用[[数据分布算法的三个设计目标]]里的故障域隔离目标反推所需的最小节点数,是容量规划该做的功课。
参考来源
《Ceph分布式存储实战》第13章《Ceph运维与排错》