Leader选举是保证Zookeeper集群数据一致性的关键,只有Leader确定的情况下,集群才可以对外提供服务,通常分为启动时Leader选举和运行时Leader选举。
启动时选举:
首先,每一个节点都会向其他所有节点发出一个投票,投票形式为(myId,ZXID)。由于是全新的集群,ZXID都为0,所以,各个节点的投票形式如:node01为(1,0),node02为(2,0),node03为(3,0);
然后,每个节点将对收到其他机器的投票进行校验:
如果投票有效,则需要与自己的投票进行PK,PK策略:
对于node01来说,接收到node02、node03的投票,先比较node02,node02胜出,将自己选票更新为(2,0),向其他节点发送出去;
node02也接收到了node01、node03的投票,先比较node01,发现自己胜出,不改变投票;
此时,统计票数,发现投node02的节点个数为2,大于集群的半数,所以,会将node02选做leader,其他节点为follower。
运行时选举:
首先,需要生成投票,每个节点仍然是向所有其他节点发出一个投票信息。由于集群运行了一段时间,所有,每个节点的ZXID可能不相同,如:node01为(1,101),node02为(2,100),node03为(3,100);
然后,每个节点收到其他机器的选票要进行PK,策略依旧。
对于node01来说,收到node02、node03的投票,PK发现,都是node01胜出;
node02收到node01、node03的投票,发现也是node01胜出,则更新自己的选票为(1,101);
此时,统计票数,发现投node01的节点个数为2,大于集群的半数,所以,会将node01选做leader,其他节点更新状态为follower。