ZooKeeper中Leader选举流程

1、ZooKeepter节点状态

LOOKING:寻找Leader状态,处于该状态需要进行选举流程

LEADING:领导者状态,处于该状态的节点说明是角色已经是Leader

FOLLOWING:跟随者状态,表示Leader已经选举出来,当前节点角色是follower

OBSERVER:观察者状态,表明当前节点角色是observer(不参与投票)

2、事务ID

ZooKeeper状态的每次变化都接收一个ZXID(ZooKeeper事务ID)形式的标记。ZXID是一个64位的数字,由Leader统一分配,全局唯一,不断递增。ZXID展示了所有的ZooKeeper的变更顺序。每次变更会有一个唯一的ZXID,如果ZXID1小于ZXID2说明ZXID1在ZXID2之前发生。

3、初始化时的选举流程(三台服务器)

说说zookeeper的leader选举 zookeeper leader选举过程_初始化


a:zk1启动,一台服务器无法进行leader选举,zk2启动时,此时两台机器可以相护通信,每台都试图找到leader,于是进入leader选举过程。选举过程开始。

b:每个server发出一个投票。由于时初始情况,zk1和zk2都会将自己作为leader服务器来进行投票,每次投票会包含所推举的服务器的myid和zxid,使用(myid,zxid)来表示,此时的zk1的投票为(1,0),zk2的投票为(2,0),然后各自将这个投票发给集群中的其他机器。

c:接受来自各个服务器的投票。集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否是本轮投票、是否来自LOOKING状态的服务器。

d:处理投票。针对每一个投票,服务器都需要将别人的投票和自己的投票进行比较,规则如下:

• 优先检查ZXID。zxid比较大的服务器优先做leader

• 如果zxid相同,那么就比较myid。myid较大的服务器作为leader服务器

对于zk1而言,他的投票时(1,0),接收zk2的投票为(2,0),首先会比较两者的zxid,均为0,再比较myid,此时zk2的myid最大,于是zk2胜。zk1更新自己的投票为(2,0),并将投票重新发送给zk2。

e:统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接受到相同的投票信息,对于zk1、zk2而言,都统计出集群中已经有两台机器接受了(2,0)的投票信息,此时便认为已经选出zk2作为leader。

f:改变服务器状态。一单确定了leader,每个服务器就会更新自己的状态,如果时follower,那么就变更为FOLLOWING,如果是leader,就变更为LEADING。当新的ZooKeeper节点zk3启动时,发现已经有leader了,不再选举,直接将状态从LOOKING改为FOLLOWING。