关于zookeeper集群quarum算法的理解

zookeeper集群个数需要奇数个的原因是最大容错个数下,集群个数为奇数可以节省一个节点的资源。譬如size为3的集群和size为4的集群容错个数都为1,都只能容忍一个节点挂掉,那么3个节省资源。

但是如果集群是如何认定集群的总个数的呢。譬如size为3,集群认为只要有两个有响应就算committed了,但是如果集群挂了一个节点,挂的久了,集群难道不会认为集群的size其实是2而不是3吗?还是这个集群大小一开始就固定了,是3就永远是3,如果挂了一个,集群节点能认识到是挂了一个,但是本来总数是3?那假如我看挂了一个,然后我为了平滑过度,我不重启集群,而是新加入3个节点,让集群总数变为5,那么原来集群的两个老节点如何认识到集群size已经更新为5了呢?

阅读 120
评论 3月6日提问
    1 个回答

    这跟 Quorums 没啥关系,Quorums 是用来做选举的,避免分布式“脑裂”问题,要求半数以上节点投票才能选举。

    首先要知道 ZooKeeper 有个特性,就是只有当集群中有半数以上的节点可用,ZooKeeper 才会对外提供服务;否则你会发现即使还有一些节点是还在正常工作的,但整个集群你从外部已经访问不了了。

    这也就是为啥节点数要奇数个,比如:

    • Node = 3,则半数 Quorums = 2。即集群可以容忍 1 个节点不可用,但还能选举出 1 个 Leader,集群可用;
    • Node = 4,则半数 Quorums = 3。即集群还是可以容忍 1 个节点不可用,但比 Node = 3 多浪费一个节点的资源。

    回到你的问题本身,其实答案很简单,就一句话的事儿。就是选举是当 Leader 挂掉了才开始的,Leader 活的好好的时候,节点加入或退出(挂掉就是一种异常的退出),Leader 是知晓的,它会同步信息给其他节点,使得集群的容量发生变化。

    评论 赞赏
      撰写回答

      登录后参与交流、获取后续更新提醒