Zookeeper选举机制

一、选举机制介绍

zookeeper是按照Paxos算法进行选举的,这个算法也称之为半数选举机制。
所有节点都有投票权,当一个几点票数过半,这个节点就是leader。
zookeeper机制规定,当有新的节点加入时,没有选举出leader时之前票数作废,重新投票。
leader产生后,其他节点投票给leader。

1)半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。

2)Zookeeper虽然在配置文件中并没有指定Master和Slave。但是,Zookeeper工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部的选举机制临时产生的。

二、全新(第一次启动)的集群选举机制

第一次启动的集群,无数据状态下的选举

举个例子:假设有五台服务器组成的Zookeeper集群,它们的myid从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的。选举流程如下:

在这里插入图片描述

共五人参加选举,第一轮只能选自己,获得选票大于半数时或者为半数以上时,
成为leader.5的半数是2.5,半数以上是3,所以投票结果=3时,就胜出,成为leader)
回合一:

A启动,开始第一轮选举,A选择自己.

第一轮投票结果:[(A-->A)]

A只获得一票,此时只有它一台服务器启动了,它发出去的报文没有任何响应,,进入LOOKING(竞选状态)。

回合二:

B启动起来,投票给自己,告诉其他人,并接收到A的(第一回合)投票信息;
此时,A接收到B的(第二回合)投票信息,A知道进入第二回合了,重新投票,由于B的myid大,所以A投给了B.

第二轮投票结果:[(A-->B),(B-->B)]

B获得两票,但是仍小于3,所以A,B进入LOOKING(竞选状态)。

回合三:

C启动起来,投票给自己,告诉其他人,并接收到了A和B的(第二回合)投票信息
此时,AB也接收到了C的投票信息,一看第三回合了,重新投票,由于C的myid最大,
A,B就将自己的一票都给了C.

第三轮投票结果:[(A-->C),(B-->C),(C-->C)]
C获得三票,3为半数以上,所以C称为leader.

剩下回合,由于C获得的票数已经超过半数,已经称为leader,所以D和E的投票是不能改变现实的,只能成为跟随者.

=============有人可能会疑问,D的leader比C大啊,他们应该都选D啊?=================
不要误解了,当集群中没有leader的时候,大家在新的回合会将自己的一票投给myid大的节点,
但是如果已经有了leader,那在新的回合将不会改变他们的投票信息

三、非全新(数据恢复)的集群启动

初始化的时候,是按照上述的说明进行选举的,但是当zookeeper运行了一段时间之后,有机器down掉,重新选举时,选举过程就相对复杂了。

需要加入数据id、leader id和逻辑时钟。
数据id(zxid):数据新的id就大,数据每次更新都会更新id。
myid:就是我们配置的myid中的值,每个机器一个。
逻辑时钟(epoch):这个值从0开始递增,每次选举对应一个值,也就是说: 如果在同一次选举中,那么这个值应该是一致的 ; 逻辑时钟值越大,说明这一次选举leader的进程更新.

选举的标准就变成: 
1. 逻辑时钟小的选举结果被忽略,重新投票 
2. 统一逻辑时钟后,数据id大的胜出 
3. 数据id相同的情况下,leader id大的胜出

根据这个规则选出leader。
  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值