zk推荐使用基数节点构建集群, 但基数节点的集群挂掉一个这个集群不就变成偶数节点了吗! 此时该集群还有可能变为不可用吗?

zk推荐使用基数节点构建集群, 因为leader选举需要超过半数节点同意. 以及集群要可对外提供服务也要求超过半数节点可用. 所以使用基数节点要优于使用偶数节点.

我的问题是:

如果一个集群由5个节点组成, 然后挂了1个. 变成了4个节点(偶数个节点). 那么此时应该还是有可能导致, 该集群分裂成两个集群(每个集群由2个节点组成). 那么一开始使用奇数个节点构成这个集群有什么意义?

不知道我这样写是否清晰明确的表达出了我的意思.

阅读 3.3k
2 个回答

Zookeeper刚好有深入研究过。回答一下。

首先你说的分裂成两个集群的情况是不存在,集群节点的配置是在ZK server 的配置中设置好的,怎么会出现挂了一个节点就分裂成两个集群的情况呢?官方文档也从来没说过会有这种现象.

关于你说的这个问题,为什么要用奇数个节点?这个的原因是因为ZAB协议。

ZAB 协议是为分布式协调服务ZooKeeper专门设计的一种支持崩溃恢复的一致性协议,这个机制保证了各个server之间的同步。全称 Zookeeper Atomic Broadcast Protocol - Zookeeper 原子广播协议。

这个协议规定投票是需要半数以上的节点同意,也就是半数以上节点需要处于可用状态。

高可用方面我打个必当,我6个节点的集群,我只要挂了3个节点,整个集群就不可用了;那我5个节点的集群,也是挂3个节点才导致集群不可用,那是不是5个节点和6个节点的集群在高可用方面达到的效果是一样的,那为什么要浪费一台机器的资源呢?所以官方建议使用3个及以上的奇数台节点来使用Zookeeper的集群模式。

另外引一下本人之前研究Zookeeper的几篇文章:
Zookeeper基础概念
Zookeeper 集群章节之集群搭建
Zookeeper 集群架构、读写机制以及一致性原理(ZAB协议)

最后,希望回答的内容可以帮到你。

zk实现没了解过, 但是个人理解应该是这样的:
在启动的时候, zk节点已经知道这个集群里有多少个节点了(比如说5个), 那么以后假如一个节点挂了, 状态就变成了: 4个节点正常, 1个节点挂了, 超过半数, 可以正常使用.
如果这个时候分区了, 变成两两配对的情况, 那么所有节点的状态应该都是: 2个节点正常, 3个节点挂了, 不足半数, 无法正常使用.

这个时候使用奇数节点的好处就出来了. 如果集群节点总共2n+1个, 那么最多挂n个节点时集群仍旧是可以使用的. 如果使用2n+2个节点, 同样最多只能挂n个节点, 相当于另外一个节点只是浪费了机器、网络、电费等, 却没有提高集群的可用性.

推荐问题
宣传栏