ZooKeeper 04 - ZooKeeper 集群的节点为什么必须是奇数个
- 1 - 关于节点个数的说明
- 2 - ZooKeeper 集群的容错数
- 3 - ZooKeeper 集群可用的标准
- 4 - 为什么不能是偶数个节点
- 4.1 防止由脑裂造成的集群不可用
- 4.2 奇数个节点更省资源
- 4.3 偶数个节点遇到的其他问题
- 参考资料
- 版权声明
首发于 2018-12-08,修改于 2021-12-06。
1 - 关于节点个数的说明
ZooKeeper 的单机服务 (也就是单节点,或着单进程) 虽然便于开发与测试,但并不适合在生产环境使用 —— 生产环境中为了服务的高可用以及容错性,建议使用 ZooKeeper 集群模式.
ZooKeeper 集群中,建议部署奇数个 ZooKeeper节点(或进程) —— 大多数情况下,3个节点就足够了。
节点个数并不是越多越好 —— 节点越多,节点间通信所需的时间就会越久,选举 Leader 时需要的时间也会越久。
2 - ZooKeeper 集群的容错数
ZooKeeper 集群中,在保证集群可用的前提下,最多允许挂掉的节点个数,即为 ZooKeeper 集群的容错数,也叫集群的容忍度。
为了集群中 Leader 节点的选举,允许挂掉的节点个数 < 剩余的存活节点个数 —— 剩余的存活节点个数必须大于n/2,n为总节点个数。
2n 和 2n-1(n>1) 个节点的集群的容错数都是 n-1。比如:
- 5个节点中,最多允许挂掉2个,因为剩余的3个节点大于5/2;
- 6个节点中,最多允许挂掉2个,因为剩余的4个节点大于6/2。
3 - ZooKeeper 集群可用的标准
集群模式(包括伪集群模式,即在一台服务器上部署多个 ZooKeeper 进程)下,遵循 “过半存活即可用” 的原则:
(1) 集群中超过一半的节点(或进程)可以正常工作,集群就是对外可以用的。示例:
- 2个节点的 ZooKeeper 集群:当 leader (主)节点挂掉,还活跃着的 follower(随从)节点的数量为1,没有超过集群总数的一半(即2/2=1),所以此时集群就无法对外提供服务 —— 2个节点的集群容错数为0。
- 3个节点的 ZooKeeper 集群:当 leader (主)节点挂掉,还活跃着的 follower(随从)节点的数量为2,就能再次选出 leader 对外提供服务 —— 容错数为1。
- 同样的,5个节点的 ZooKeeper 集群最多允许2个主节点挂掉 —— 容错数为2。
(2) ZooKeeper 写操作成功的标志:
leader 节点负责 ZooKeeper 集群的写操作,它会通知所有 follower 节点执行写操作,只有收到半数以上 follower 节点的成功反馈,写操作才算成功.
如果2个节点的 ZooKeeper 集群,就必须2个节点都写成功,才能算操作成功。
4 - 为什么不能是偶数个节点
4.1 防止由脑裂造成的集群不可用
关于 ZooKeeper 集群的脑裂,请参看:
举例说明:
(1) 假如:集群有 5 个节点,发生了脑裂,脑裂成了 A、B 两个小集群:
(a) 小集群 A:1个节点,小集群 B:4个节点,或A、B互换
(b) 小集群 A:2个节点,小集群 B:3个节点,或A、B互换
上面两种情况下,A、B 中总会有一个小集群满足 可用节点数量 > 总节点数量/2 ,所以集群仍然能选举出 leader,仍然能对外提供服务。
(2) 假如:集群有4个节点,同样发生脑裂,脑裂成了 A、B 两个小集群:
(a) 小集群 A:1个节点,小集群 B:3个节点,或 A、B互换
(b) 小集群 A:2个节点,小集群 B:2个节点
上述情况 (a) 满足选举条件,而情况(b)不满足,此时集群就彻底不能提供服务了。
(3) 总结:
- 节点数量为奇数个,只要不出现过半的节点失效,集群就总能对外提供服务;
- 节点数量是偶数个,如果有一半的节点失效,就可能存在集群可用(脑裂成两个均等的子集群)。
4.2 奇数个节点更省资源
原则上 ZooKeeper 集群中可以有偶数个节点,但其容错数并不会提高,反而降低了集群间的通信效率,也浪费了资源。
—— 即:容错能力相同时,奇数个节点更节省资源.
4.3 偶数个节点遇到的其他问题
博主测试过2个和4个节点的 ZooKeeper 集群,基于这个前提总结出下述问题:
(1) 分布式环境下,ZooKeeper 集群容易受到网络、系统调度等因素的影响;
(2) 2个 ZooKeeper 节点的集群中:
- 如果1个 ZooKeeper 节点挂掉,剩下的1个节点并不能满足“过半存活”的原则,所以集群将不可用;
- 2个节点的集群比单机模式更不可靠 —— 2个节点中至少1个节点出错的概率比单节点出错的概率大;
(3) 4个节点的 ZooKeeper 集群中,第4个节点不能成功启动,ZooKeeper 会强制 JVM 抛出如下错误:
Error occurred during initialization of VM Unable to allocate 983040KB bitmaps for parallel garbage collection for the requested 31457280KB heap. Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.
参考资料
zookeeper节点为什么是奇数个?
zookeeper集群奇偶数节点问题
Zookeeper集群节点数量为什么要是奇数个?
版权声明
作者:瘦风(https://healchow.com)
出处:博客园-瘦风的南墙(https://www.cnblogs.com/shoufeng)
感谢阅读,公众号 「瘦风的南墙」 ,手机端阅读更佳,还有其他福利和心得输出,欢迎扫码关注??
本文版权归博主所有,欢迎转载,但 [必须在页面明显位置标明原文链接],否则博主保留追究相关人士法律责任的权利。