您的位置:首页 > 其它

zookeeper Leader选举算法分析

2017-06-07 14:51 281 查看
Zookeeper集群Leader选举算法分析

详细说明了一个zk集群如何进行leader选举

当zk集群中有一台服务器出现以下2种情况时, 整个集群则会进入Leader选举.

1. 服务器初始化启动

2. 服务器运行期间无法和leader保持链接

当一台机器进入Leader选举流程时, 当前集群可能会处于以下2种状态

1. 集群中本身就存在一个leader

2. 集群中目前不存在leader

下面从第一种情况开始分析(集群中本身就存在一个leader).

由于集群已经存在Leader, 当该机器尝试选举leader时, 会被告知当前leader的信息, 对于该机器来说, 只需要和leader建立连接, 进行状态同步.

 第二种情况(集群中leader不存在情况),如何进行leader选举.

通常有2种情况会出现Leader不存在情况,

1. 整个集群刚初始化启动, 此时尚无Leader产生

2. 集群运行期间, Leader服务器down掉.

此2种情况, 都会造成集群需要选举leader, 此时集群状态为"LOOKING",指的是正在尝试选举leader,当一台机器处于"LOOKING"状态时, 它回向所有其他服务器发送消息, 这个消息就是"投票".

投票消息中包含2个基本信息,

1. SID: 被推荐服务器的sid

2. ZXID: 被推荐服务器的事物id

下面以(SID,ZXID)来标识一次投票信息, e.g.

当前服务器要推举Sid为1, zxid为8的服务器成为leader, 则他本次投票信息可表示(1,8)

假设当前zk集群有5台服务器, sid分别为1, 2, 3,4,5, zxid分别为9,9,9,8,8. 而此时sid为2的服务器为leader.

某一刻, sid为1和2所在机器出现故障, 集群处于无leader情况, 开始进行leader选举.

第一次投票, 由于无法检测到集群中其他机器信息, 每台机器都将自己作为推举对象进行投票,

投票结果为:(3,9),(4,8),(5,8)

变更投票

完成上一次投票之后,基于如下筛选规则进行下一轮选举, 便于描述此筛选规则,首选定义如下术语.

vote_sid:接收到的投票中所推举leader服务器的sid

vote_zxid:接受到的投票中所推举leader服务器的zxid

self_sid:当前服务器自己的sid

self-zxId:当前服务器自己的zxid

每次收到的投票处理, 都是一个对(vote_id,vote_zxid)和(self_sid,self_zxid)对比的过程.

leader_

if vote_zxid>self_zxid
leader_ = vote_

if vote_zxid<self_zxid
leader_=self_

if vote_zxid=self_zxid{
if(vote_sid>self_sid)
leader_=vote_
if(vote_sid<self_sid)
leader_=self
}

根据如上规则, 得出该集群的投票变更过程:



经过第二轮投票后, 如果一台机器收到了超过半数的相同的票数,则这个投票对应的机器成为新leader.

最终结果, 确定server3为leader.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: