标签:leader 无法 文章 奇偶数 阅读 为什么 否则 关于 进程
目录
ZooKeeper的单机服务 (也就是单节点, 或着单进程) 虽然便于开发与测试, 但并不适合在生产环境使用 —— 生产环境中为了服务的高可用以及容错性, 建议使用ZooKeeper集群模式.
ZooKeeper的集群中, 建议部署奇数个ZooKeeper节点(或进程) —— 大多数情况下, 3个节点就足够了.
节点个数并不是越多越好 —— 节点越多, 节点间通信所需的时间就会越久, 选举leader时需要的时间也会越久.
ZooKeeper集群中, 在保证集群可用的前提下, 最多允许挂掉的节点个数, 即为ZooKeeper集群的容错数, 也叫集群的容忍度.
为了集群中leader节点的选举, 允许挂掉的节点个数 < 剩余的存活节点个数 —— 剩余的存活节点个数必须大于n/2, n为总节点个数.
2n和2n-1(n>1)个节点的集群的容错数都是n-1. 比如:
- 5个节点中, 最多允许挂掉2个, 因为剩余的3个节点大于5/2;
- 6个节点中, 最多允许挂掉2个, 因为剩余的4个节点大于6/2.
集群模式(包括伪集群模式, 即在一台服务器上部署多个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个节点都写成功, 才能算操作成功.
关于ZooKeeper集群的脑裂, 请参看: ZooKeeper集群的脑裂问题 (Split Brain问题)
举例说明:
(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) 总结:
- 节点数量为奇数个, 只要不出现过半的节点失效, 集群就总能对外提供服务;
- 节点数量是偶数个, 如果有一半的节点失效, 就可能存在集群可用(脑裂成两个均等的子集群).
原则上ZooKeeper集群中可以有偶数个节点, 但其容错数并不会提高, 反而降低了集群间的通信效率, 也浪费了资源.
—— 即: 容错能力相同时, 奇数个节点更节省资源.
博主测试过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.
参考资料
版权声明
作者: ma_shoufeng(马瘦风)
出处: 博客园 马瘦风的博客
您的支持是对博主的极大鼓励, 感谢您的阅读.
本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.
ZooKeeper 02 - ZooKeeper集群的节点为什么是奇数个
标签:leader 无法 文章 奇偶数 阅读 为什么 否则 关于 进程
原文地址:https://www.cnblogs.com/shoufeng/p/10591508.html