Zookeeper选举机制
概念
SID:服务器ID。用来唯一标识一台Zookeeper集群中的机器,每台机器不能重复,和myid一致。
ZXID:事务ID。用来标识一次服务器状态的变更。在某一时刻,集群中的每台机器的ZXID值不一定完全一致,这和Zookeeper服务器对于客户端”更新请求“的处理逻辑有关。
Epoch:每个Leader任期的代号。没有Leader时间同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加。
1. 集群第一次启动
假设Zookeeper集群有5个节点,其节点的myid依次分别为1,2,3,4,5
第一台Zookeeper启动,将自己的一票投给自己,由于自己的票数(1)没有大于集群节点的一半,则第一台Zookeeper进入Looking状态;
第二台Zookeeper启动,将自己的一票投给自己,由于集群中有多台服务器,则第二台与其他的几台(第一台)进行交换选票,最后将所有选票投给myid最大的那台服务器(第二台),由于自己的票数(2)没有大于集群节点的一半,则第二台Zookeeper也进入Looking状态;
第三台Zookeeper启动,将自己的一票投给自己,由于集群中有多台服务器,则第二台与其他的几台(第一台、第二台)进行交换选票,最后将所有选票投给myid最大的那台服务器(第三台),由于自己的票数(3)大于集群节点的一半,则第三台Zookeeper被选举为leader,其余服务器置为follower。
第四台Zookeeper启动,由于集群中已经存在leader,则自动置为follower。
第五台Zookeeper启动,由于集群中已经存在leader,则自动置为follower。
2. 集群非第一次启动
假设Zookeeper集群有5个节点,其节点的myid依次分别为1,2,3,4,5,作为leader的3和follower的5宕机了。则需要进行leader选举。
其中1、2、4的(Epoch,ZXID,SID)分别是
(1,8,1)(1,8,2)(1,7,4)
根据选举Leader规则:
- Epoch大的直接选举为leader
- Epoch相同,事务id大的选举为leader
- 事务id相同,服务器id大的选举为leader
故选举 2 为leader