文章目录
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集群的脑裂, 请参看: 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) 总结:
节点数量为奇数个, 只要不出现过半的节点失效, 集群就总能对外提供服务;
节点数量是偶数个, 如果有一半的节点失效, 就可能存在集群可用(脑裂成两个均等的子集群).
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.
参考资料
文章来源:https://www.cnblogs.com/shoufeng/p/10591508.html