Zookeeper 的选举机制也不过如此!

Zookeeper 是一个分布式服务框架,主要是用来解决分布式应用中遇到的一些数据管理问题如:统一命名服务状态同步服务集群管理分布式应用配置项的管理等。

我们可以简单把 Zookeeper 理解为分布式家庭的大管家,那么管家团队是如何选出Leader的呢?好奇吗,接下来带领大家一探究竟。

人类选举的基本原理

讲解 Zookeeper 选举过程前先来介绍一下人类的选举。

我们每个人或多或少都经历过几次选举,在投票的过程中可能会遇到这样几种情况:

情况1:自己和候选人熟,将票投给你认为能力强的那个人;

情况2:自己也是候选人,会想着拉票,但是发现别人能力比你强,就将自己的票投给别的候选人。

所有人投票完后,统计投票箱中票数最多的候选人,当选领导。

在整个投票过程中我们可以提炼出四个最核心的概念:

候选人能力:投票的基本原则是选最强的人。

遇强改投:如果后面发现更强的人可以改投票。

投票箱:所有人的票都会放在投票箱。

领导者:得票最多的人即为领导者。

从人类选举的原理我们来简单推导一下Zookeeper的选举原理。

Zookeeper选举的基本原理

如果zookeeper是单机部署,不是集群模式,那么不存在选举的问题。

zookeeper 的选举和人类选举基本一样,借用上面说的4个核心概念,来说说选举的基本原理。

候选人能力

zookeeper 通过 sid 和zxid (事物ID) 来证明自己的能力强弱。

zxid 的全称是 ZooKeeper Transaction Id,即 Zookeeper 事务id。 数据的最新版本号 , 数据越大说明能力越强。

sid , 我们自定义的服务器编号ID,值越大证明能力越大。

遇强改投

在选举的时候,每台zookeeper 节点都会认为自己是最强的,会先投票给自己(选票上包含sid、zxid)。

然后将选票传递给集群中的每个节点,同时自己也会接收其他节点发过的选票。节点接收到选票后,会判断选票上节点的能力强弱,如果发现比自己强,那么就进行改票,把自己的选票投给能力强的。然后在传递给集群中的每个节点。

投票箱

与人类选举不同,zookeeper 集群中,每个节点都会维护一份投票箱。 因为每个节点的选票都会同步给每个集群中的节点,所以投票箱的结果都是一致的。

领导者

投票的过程中,只要发现票数有超过一半的节点,领导就选择成功,投票也就宣告结束。

什么场景下 Zookeeper 需要选举?

当zookeeper 集群中有一台机器发生以下场景,就会进行选举。

机器启动

机器运行期间leader宕机

机器启动选举

假设5台zookeeper依次启动,sid的编号依次为1-5。

服务器1

先投自己1票,投票箱票数不过半,选举无法完成。此时服务器-1的状态为looking

服务器2

先投自己1票,将自己的选票结果同步给服务器1。 服务器1 发现服务器2的sid编号比自己大,于是进行改票,把自己的选票投给了服务器2,并同步给服务器2。

此时双方的投票箱结果为:

服务器1,获0票;

服务器2,获2票;

并没有超过票数过半的机器。选举依然无法完成,此时服务器2的状态仍为looking

服务器3

先投自己1票,将自己的选票结果同步给服务器1、服务器2。 服务器1和服务器2 ,发现服务器3的sid编号比自己还大,所以赶紧进行改票,都投给了服务器3。

此时投票箱的结果为:

服务器1,获0票;

服务器2,获2票;

服务器3,获3票;

发现有票数过半的机器,于是服务器3,当仁不让成了leader。此时更改服务器1、2的状态为following,服务器3为leading

服务器4

先投自己1票,同步自己选票时,发现服务器1、2、3 已经不是looking状态了,于是取得投票箱结果,将自己的选票改投给服务器3,自己的状态更改为following

服务5

同服务器4 一致。

最终的结果是:服务器3是leader,其他全是follow。

机器运行期间leader宕机选举

zookeeper运行期间,当leader 宕机,整体会对外暂停服务提供,触发新的一轮选举。触发新选举的时候,每台txid可能都不一样的。还是以刚才上面的案例进行分析,假设服务器3 leader 宕机,txid为分别为, 服务器1(99),服务器2(102),服务器4(100),服务器5(101)。

投票的过程和初始化的基本类似,主要为以下几个步骤:

1)状态变更,除Obsever状态的其他服务器全部变更为looking,然后进行leader的选举过程

2)每个服务器先投自己一票,然后同步选票

3)每个服务器都会收到各个服务器的投票,如果发现有txid比自己大的,会进行改票

4)处理和统计投票,每一轮投票结束后都会统计投票,超过半数即可当选。

5)改变服务器的状态,宣布当选

直接看图:

很显然,最后服务器2 被当选为新的leader。

选举机制中涉及到的核心概念

sid(服务器ID、serverId)

服务器编号,编号越大,在选举leader时权重越大。

zxid (事物ID)

数据的版本号,数值越大数据越新,在选举leader算法中,越大权重越大咯

Epoch(逻辑时钟)

也叫投票的次数,同一轮投票过程中的逻辑时钟值是相同的,每投完一次票这个数据就会增加。

Server状态(选举状态)

looking:竞选状态。

following:随从状态,同步leader状态,参与投票。

observing:观察状态,同步leader状态,不参与投票。

leading:领导者状态。

总结

(1)Zookeeper 选举会发生在服务器初始状态和运行状态下。

(2)初始状态下会根据服务器sid的编号对比,编号越大权值越大,投票过半数即可选出Leader。

(3)Leader 故障会触发新一轮选举,zxid 代表数据越新,权值也就越大。

(4)在运行期选举还可能会遇到脑裂的情况,大家可以自行学习。

来源:https://4m.cn/zmR0u

- END -

你可能感兴趣的:(Zookeeper 的选举机制也不过如此!)