☆:节点一到节点五的myid分别是1,2,3,4,5

zookeeper对leader的选举往往分为两个方面,细分的话可以分为三个方面

第一个是zookeeper集群第一次启动,另一种是非第一次启动,而非第一次启动又分为leader存活状态和非存活状态。

一、第一次启动选举

zookeeper特点是,只要节点有半数以上存活就能正常工作,因此其选举机制达到半数就能选出leader。

选取机制:

1.当第一台节点启动之后,该节点首先投自己一个选票,然后把总票数与节点数(5)的一半(2.5)作对比,此时1不大于2.5,因此取消选票,变更状态为 looking;

2.当第二台节点上线,所有节点都投自己一票,发现各自总票数都不大于2.5,此时节点1发现节点2的myid是大于自己的,所以他把自己的选票转投节点2,此时节点2总票数为2不大于2.5,因此取消选票,节点1和2都变更状态为looking;

3.当第三台节点上线,所有节点都投自己一票,发现各自总票数都不大于2.5,此时节点1和节点2发现节点3的myid是大于他们的,所以节点1和2把自己的选票转投节点3,此时节点3总票数为3大于总节点数5的一半(2.5)的,此时选出leader为节点3的zookeeper,节点1和2都变为follower;

4.当第四台节点上线,此时1、2节点都无选票了,节点4只有一张选票,而节点3有3张,少数选票服从多数,因此节点4变更为follower;

5.第五台节点和第四台一样的道理

二、非第一次启动选举

1)leader存活情况

此时的状态是正常状态,只有某个follower与leader断开连接,无法接受其指令和消息数据 ,当他要举行选举的时候,会被告知集群中存在leader,你只是断开连接了,对于他来说,它只要重新与leader建立连接,恢复数据,同步状态就行

2)leader真正不存活的情况

每个节点在运行时都有如下的三个id(epoch,zxid,sid),epoch是leade任期时id(选举一次为一期),zxid是事务id,sid就是其myid,当某时刻leader宕机后,首先考察存活节点的epoch id,epoch最大的选举为leader,如果epoch都相同,则看其事务id  zxid ,选举zxid最大的为leader,如果zxid都相同,则看其sid,就是节点的myid,myid大的为leader。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐