关于zookeeper:Zookeeper-的选举机制也不过如此

42次阅读

共计 2371 个字符,预计需要花费 6 分钟才能阅读完成。

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 票,投票箱票数不过半,选举无奈实现。此时服务器 - 1 的状态为looking

  2. 服务器 2

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

此时单方的投票箱后果为:

服务器 1,获 0 票;服务器 2,获 2 票;

并没有超过票数过半的机器。选举仍然无奈实现,此时服务器 2 的状态仍为looking

  1. 服务器 3

先投本人 1 票,将本人的选票后果同步给服务器 1、服务器 2。服务器 1 和服务器 2,发现服务器 3 的 sid 编号比本人还大,所以连忙进行改票,都投给了服务器 3。

此时投票箱的后果为:

服务器 1,获 0 票;服务器 2,获 2 票;服务器 3,获 3 票;

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

  1. 服务器 4

先投本人 1 票,同步本人选票时,发现服务器 1、2、3 曾经不是 looking 状态了,于是获得投票箱后果,将本人的选票改投给服务器 3,本人的状态更改为following

  1. 服务 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

正文完
 0