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