zookeeper选举是按照Paxos算法进行选举的,这个算法也成为半数选举机制
1、基础概念
SID:服务器ID。用来唯一标识一台ZooKeeper集群中的机器,每台机器不能重复,和myid一致。
ZXID:事务ID。ZXID是一个事务ID,用来标识一次服务器状态的变更。在某一时刻,集群中的每台机器的ZXID值不一定完全一致,这和 ZooKeeper服务器对于客户端“更新请求”的处理逻辑有关。
Epoch:每个Leader任期的代号。没有Leader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加。
LOOKING:选举中,正在寻找Leader
FOLLOWING:随从状态,同步leader状态,参与投票
Leader:领导者,差不多是master,在zookeeper中只有leader才有写的权限,following只有读的权限
OBSERVING:观察者状态,不同leader状态,不参与投票
2、选择的规则
- Zookeeper集群中只有超过半数以上的服务器启动,集群才能正常工作;
- 在集群正常工作之前,myid小的服务器给myid大的服务器投票,直到集群正常工作,选出Leader;
- 选出Leader之后,之前的服务器状态由Looking改变为Following,以后的服务器都是Follower。
- 如果集群没有Leader(非全新选举),Epoch大的服务器当选leader;
如果Epoch相等,比较ZXID(事物ID),事物ID大的,当选leader;
如果Epoch相等,ZXID相等,则比较myId(服务器id),服务器id大的当选Leader,服务器id是不重复;
3、举例解释:
三台服务器举例:默认至少获取2票才可以选举成Leading
1、第一台服务器启动后,开始选举,默认给自己投一票,由于没有其他服务器启动,按照选举过半原则,此时第一台服务器处于竞选状态(Looking)
2、第二台服务器启动后,开始给自己投一票,然后跟第一台服务器交换信息,此时第一台服务器发现自己的SID小于第二台SID,此时第一台服务器投票第二台服务器,第二台服务器也投票自己,这个时候第二台机器获取票数大于一半,此时第二台服务器变更为leading,第一台服务器变更为following
3、第三台服务器启动后,开始给自己投票,然后跟第一台服务器和第二台服务器交换信息,发现两台服务器都不是竞选状态(Looking),这个时候第三台服务器一票,第二台服务器两票,少数服从多数此时第三台服务器变更为following
五台服务器举例:默认至少获取3票才可以选举成leading
1、第一台服务器启动后,开始选举,默认给自己投一票,由于没有其他服务器启动,按照选举过半原则,此时第一台服务器处于竞选状态(Looking)
2、第二台服务器启动后,开始给自己投一票,然后跟第一台服务器交换信息,此时第一台服务器发现自己的SID小于第二台SID,此时第一台服务器投票第二台服务器,第二台服务器也投票自己,这个时候获取的票数还是不够,此时第一台和第二台状态都修改成竞选状态(Looking)
3、第三台服务器启动后,开始给自己投一票,这个时候跟第一台服务器和第二台服务器交换信息,第二台服务器看到第三台服务器SID比自己大,因此前两台服务器也投第三台服务器一票,因此获取三票,这个时候第三台服务器状态为Leading,其他两台修改成following
4、当第四台和第五台服务器启动后,发现前三台服务器状态不是竞技状态后,遵循少数服从多数因此状态修改成following