首页 理论教育 ZooKeeper的选举机制详解

ZooKeeper的选举机制详解

更新时间:2025-01-09 工作计划 版权反馈
【摘要】:全新集群选举以一个简单的例子来说明整个选举的过程:假设有5 台服务器组成的ZooKeeper 集群,它们的Server ID 从1 ~5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上都是一样的。非全新集群选举初始化时是按照上述的说明进行选举的,但是,当ZooKeeper 运行了一段时间之后,有机器宕机重新选举时,选举过程就相对复杂了。③数据Version 相同的情况下,Server ID 大的胜出。根据这个规则选出Leader。

(1)基本概念

①服务器ID:比如有三台服务器,编号分别是1、2、3,编号越大,在选择算法中的权重越大。

②数据ID:服务器中存放的最大数据ID,值越大,说明数据越新,在选举算法中数据越新权重越大。

③逻辑时钟:或称“投票的次数”,同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加,然后与接收到的其他服务器返回的投票信息中的数值相比,根据不同的值作出不同的判断。

④选举状态:

a.LOOKING,竞选状态。

b.FOLLOWING,随从状态,同步Leader 状态,参与投票。

c.OBSERVING,观察状态,同步Leader 状态,不参与投票。

d.LEADING,领导者状态。

⑤选举消息内容:

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

a.服务器ID。

b.数据ID。

c.逻辑时钟。

d.选举状态。

(2)选举流程图

因为每个服务器都是独立的,在启动时均从初始状态开始参与选举,选举机制流程简图如图5.6 所示。

(3)全新集群选举

以一个简单的例子来说明整个选举的过程:假设有5 台服务器组成的ZooKeeper 集群,它们的Server ID 从1 ~5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上都是一样的。假设这些服务器依序启动,试看会发生什么:(www.xing528.com)

①服务器1 启动,此时只有它一台服务器启动了,因为它发出去的信息没有任何响应,所以它的选举状态一直是LOOKING 状态。

图5.6 选举机制流程简图

②服务器2 启动,它与最开始启动的服务器1 进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以ID 值较大的服务器2 胜出。但是,由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3),所以服务器1、服务器2 还是继续保持LOOKING 状态。

③服务器3 启动,根据前面的理论分析,服务器3 成为服务器1、服务器2、服务器3 中的老大,而与上面不同的是,此时有三台服务器(超过半数)选举了它,它成了这次选举的Leader。

④服务器4 启动,根据前面的分析,理论上服务器4 应该是服务器1、服务器2、服务器3、服务器4 中最大的。但是,由于前面已经有半数以上的服务器选举了服务器3,所以它只能接收当从属服务器。

⑤服务器5 启动,与服务器4 一样,做从属服务器。

(4)非全新集群选举

初始化时是按照上述的说明进行选举的,但是,当ZooKeeper 运行了一段时间之后,有机器宕机重新选举时,选举过程就相对复杂了。这时的选举需要加入数据Version、Server ID 和逻辑时钟:

①数据Version:数据新的Version 就大,数据每次更新都会更新Version。

②Server ID:配置的myid 中的值,每个机器都有一个ID。

③逻辑时钟:这个值从“0”开始递增,每次选举对应一个值。

如果在同一次选举中,这个值就应该是一致的;逻辑时钟值越大,说明这一次选举Leader的进程更新,也就是每次选举拥有一个Zxid,投票结果只取Zxid 最新的。

选举的标准就变成:

①逻辑时钟值小的选举结果被忽略,重新投票。

②统一逻辑时钟后,数据Version 大的胜出。

③数据Version 相同的情况下,Server ID 大的胜出。

根据这个规则选出Leader。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈