五分钟搞懂zookeeper选举机制

ZooKeeper是开源分布式应用协调服务Google的Chubby实现开源,是的Hadoop和Hbase重要组成部分。它是为分布式应用程序提供一致性服务的软件,包括配置维护、域名服务、分布式同步、组服务等。

下面简单说明一下这篇文章。zookeeper默认选举机制

zookeeper提供三种方式:

LeaderElection

AuthFastLeaderElection

FastLeaderElection (默认)

一、ZooKeeper架构
图片[1]-五分钟搞懂zookeeper选举机制-子云社区

?

二、简述选举过程

目前有三台服务器,每台服务器都没有数据,其编号分别为1、2、3,按编号依次启动,其选择过程如下:
服务器1启动,投票给自己,然后发送投票信息。由于其他机器尚未启动,它无法收到反馈信息。服务器1的状态一直属于Looking(选举状态)。
服务器2启动并投票给自己。同时,与之前启动的服务器1交换结果。由于服务器2号较大,服务器2获胜。此时,投票人数仅超过一半,因此服务器2成为leader,服务器1成为follower。
服务器3启动并投票给自己,并与之前启动的服务器1和2交换信息。虽然服务器3的数量很大,但服务器2以前赢了,所以服务器3只能成为follower。

三、选举机制中的概念

Serverid:服务器ID

例如,有三服务器,分别是1、2、3。

选择算法中的权重越大。

Zxid:数据ID

存储在服务器中的最大数据ID.

值越大,数据越新,选举算法中算法中的权重越大。

Epoch:逻辑时钟

或者说投票的次数,同一轮投票过程中的逻辑时钟值是相同的。每次投票后,数据都会增加,然后根据不同的值做出不同的判断,与收到的其他服务器返回的投票信息中的值进行比较。

Server状态:选举状态

LOOKING,竞选状态。

FOLLOWING,跟随状态,同步leader状态,参加投票。

OBSERVING,观察状态,同步leader状态,不参加投票。

LEADING,领导者状态。

?

四、选举新闻内容

在投票完成后,需要将投票信息发送给集群中的所有服务器,它包含如下内容:

服务器ID

数据ID

逻辑时钟

选举状态

五、选举过程详细说明

1、首先,开始选举阶段,每个阶段Server读取自身的zxid。

2、发送投票信息

a、每个Server第一轮都会投票给自己。

b、投票信息包括:选举:leader的Serverid,Zxid,Epoch。Epoch会随着选举轮数的增加而增加。

3、接收投票信息

a、如果服务器2收到服务器1的数据(服务器1处于选举状态(LOOKING?状态)

1)逻辑时钟值的判断:

a)如果发送逻辑时钟Epoch大于当前的逻辑时钟。首先,更新这个逻辑时钟Epoch,同时清空本轮逻辑时钟收集的其他逻辑时钟server选举数据。然后,判断是否需要更新当前的选举leader?Serverid。判断规则rules?judging:保存的zxid最大值和leader?Serverid判断。先看数据。zxid,数据zxid大者胜出;其次,再判断;leader?Serverid,leader?Serverid大胜者;然后将自己最新的选举结果(即上述三个数据)(leader?Serverid,Zxid,Epoch)广播给其他server)

b)如果发送逻辑时钟Epoch小于当前的逻辑时钟。解释对方server相对较早的Epoch在这里,本机只需要三种数据(leader?Serverid,Zxid,Epoch)发过去。

c)如果发送逻辑时钟Epoch等于当前的逻辑时钟。然后根据上述判断规则rules?judging来选举leader?,然后将最新的选举结果(即上述三个数据)(leader??Serverid,Zxid,Epoch)广播给其他server)。

2)判断服务器是否收集了所有服务器的选举状态:如果是,根据选举结果设置自己的角色(FOLLOWING还是LEADER),退出选举的过程是。

最后,如果您没有收到未收集到所有服务器的选举状态:您也可以根据上述过程判断最新选举leader是否有超过一半的服务器支持,如果是,试试200ms内部接收数据。如果没有新数据,说明大家都默认了这个结果,也设置了角色退出选举的过程。

b、?如果接收到的服务器1处于其他状态(FOLLOWING或者LEADING)。

a)逻辑时钟Epoch将数据保存到当前的逻辑时钟recvset。此时Server已经处于LEADING状态,说明这个时候server已投票选出结果。如果此时接收服务器声称自己是leader,?然后判断是否有一半以上的服务器选举,如果是,则设置选举状态退出选举过程。

b) 这是一个与当前逻辑时钟不一致的消息,这表明在另一个选举过程中已经有了选举结果,因此增加了选举结果outofelection集中,然后根据outofelection来判断是否可以结束选举,如果可以也是保存逻辑时钟,设置选举状态,退出选举过程。