首页 > 技术文章 > zookeeper选举机制

q1359720840 2022-02-14 18:33 原文

zk选举机制

sid:服务器id,用来唯一标识一台zookeeper集群中的机器,每台机器不能重复,和myid一致。

zxid:事务id,zxid是一个事务id,用来标识一次服务器状态的变更。在某一时刻,集群中的每台机器的zxid值不一定完全一致,这和zookeeper服务器对于客户端更新请求,的处理逻辑有关。

epoch:每个leader任期的代号,没有leader时同一轮投票过程中的逻辑时钟值是相同的,每投完一次票这个数据就会增加。

1.服务1启动,发起一次选举,服务器1自己投自己一票,此时服务器1票数一票,不够半数以上3票,选举无法完成,服务器1状态保持为looking。

2.服务器2启动,再发起一次选举,服务器1和2分别投自己一票并交换选举信息,此时服务器1发现服务器2的myid比自己目前投票推举的(服务器1)大,更改选票为推举服务器2,此时服务器1票数0票,服务器2票2票,没有半数以上结果,选举无法完成,服务器1,2状态保持looking。

3.服务器3启动,发起一次选举,此时服务器1和2都会更改选举票为服务器3,此时投票结果:

服务器1为0票,服务器2为0票,服务器3为3票,服务器3票数过半,当选leader,服务器1,2更改状态为following,服务器3为leading。

4.服务器4启动,发起一次选举,此时服务器123已经不是looking状态,不会更改选举信息,交换选票信息结果,服务器3为3票,服务器4为1票,此时服务器4服从多数,更改选举票为服务器3,并更改状态为following。

服务器5启动,同4一样当小弟。

 

1.zookeeper集群中的一台服务器出现以下两个情况之一,就开始进入leader进行选举;

服务器初始化启动。

服务器运行期间无法和leader保持连接。

2.而当一台机器进入leader选举流程时,当前集群也可能会处于以下两种状态;

集群中本来就已经存在leader。

对于第一种已经存在leader的情况下,机器试图去选举leader时,会被告知当前服务器的leader信息,对于该机器来说,仅仅需要和leader机器建立连接,并进行状态同步即可。

集群中确认不 存在leader。

假设zookeeper由五台服务器组成,sid分别为1,2,3,4,5zxid分别为8,8,7,7,此时sid为3的服务器是leader,某一时刻,3和5服务器出现故障,因此开始进行leader选举。

sid为1,2,4的机器投票情况(1,8,1),(1,8,2),(1,7,4)

选举leader规则:1.epoch大的直接胜出,2epoch相同,事务id大的胜出,3事务id相同,服务器id大的胜出。

 

推荐阅读