zookeeper- 集群 leader 选举
服务器状态
每一个在集群环境中的 zookeeper 服务器节点,都有一个服务器状态,描述集群中处于的角色或包含的信息,分别有 4 种:
looking:寻找 leader 状态。当服务器处于该状态时,它会认为当前集群中没有 leader,故进入 leader 选举状态。
leading: 领导者状态。表明当前服务器角色是 leader。
following: 跟随者状态。表明当前服务器角色是 follower。
observing:观察者状态。表明当前服务器角色是 observer。
服务器启动时期的 leader 选举
在集群的初始化阶段,只有一台 zookeeper 服务器节点启动时,一个节点无法进行 leader 选举,当有第二台服务器启动时,此时两台机器可以相互通信,每台机器都试图找到 leader,于是进入 leader 选举过程。过程如下:
每个 server 发出一个投票。最开始的时候,为选举 leader 服务器来进行投票,每次投票会包含所推举的服务器的 myid 和 zxid,此时 server1 的投票为(1, 0),server2 的投票为(2, 0),然后各自将这个投票发给集群中其他机器。
集群中的每台服务器接收来自集群中其他服务器的投票。
处理投针对每一个投票,服务器都需要将别人的投票和自己的投票进行处理,处理规则:
首先检查 zxid。zxid 比较大的服务器优先选举为 leader。
如果 zxid 相同,那么就比较 myid。myid 较大的服务器被选为 leader 服务器。
对于 Server1 而言,它的投票是(1, 0),接收 Server2 的投票为(2,0),首先会比较两者的 zxid,均为 0,再比较 myid,此时 server2 的 myid 最大,于是更新自己的投票为(2, 0),然后重新进行投票,对于 server2 而言,无须更新自己的投票,只是需要再次向集群中所有机器发出上一次投票信息即可。
进行投票统计。每次投票以后,服务器都会统计投票信息,判断是否已经有过半机器接受到相同的投票信息,对于 server1、server2 而言,都统计出集群中已经有两台机器接受了(2, 0)的投票信息,此时便认为已经选出了 leader
改变服务器状态。一旦确定了 leader,每个服务器就会更新自己的状态,如果是 follower,那么就变更为 following,如果是 leader,就变更为 leading。
版权声明: 本文为 InfoQ 作者【zarmnosaj】的原创文章。
原文链接:【http://xie.infoq.cn/article/4f48da0ab075dd17d178bc0e7】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论