用大白话给你解释Zookeeper的选举机制

点击关注"爱笑的架构师"程序员

右上角"设为星标"好文章不错过web

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

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

人类选举的基本原理

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

咱们每一个人或多或少都经历过几回选举,在投票的过程当中可能会遇到这样几种状况:微信

状况1:本身与几个候选人都比较熟,你会将票投给你认为能力比较强的人架构

熟人选举

状况2:本身也是候选人,而且与其余几个候选人都不熟,这个时候你确定想着要去拉票,由于以为本身才是最厉害的人呀,全部人都应该把票投给我。可是遗憾的是在拉票的过程当中,你发现别人比你强,你开始自卑了,最终仍是把票投给了本身认为最强的人。app

本身参与选举

全部人都投完票以后,最后从投票箱中进行统计,得到票数最多的人当选。框架

思惟导图

在整个投票过程当中咱们能够提炼出四个最核心的概念:编辑器

  • 候选人能力:投票的基本原则是选最强的人。
  • 遇强改投:若是后面发现更强的人能够改投票。
  • 投票箱:全部人的票都会放在投票箱。
  • 领导者:得票最多的人即为领导者。

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

Zookeeper选举的基本原理

注意若是 Zookeeper 是单机部署是不须要选举的,集群模式下才须要选举。

Zookeeper 的选举原理和人类选举的逻辑相似,套用一下人类选举的四个基本概念详细解释一下Zookeeper。

  • 我的能力

如何衡量 Zookeeper 节点我的能力?答案是靠数据是否够新,若是节点的数据越新就表明这个节点的我的能力越强,是否是感受很奇怪,就是这么定的!

在 Zookeeper 中一般是以事务id(后面简称zxid)来标识数据的新旧程度(版本),节点最新的zxid越大表明这个节点的数据越新,也就表明这个节点能力越强。

zxid 的全称是 ZooKeeper Transaction Id,即 Zookeeper 事务id。

  • 遇强改投

在集群选举开始时,节点首先认为本身是最强的(即数据是最新的),而后在选票上写上本身的名字(包括zxidsid),zxid 是事务id,sid 惟一标识本身。

紧接着会将选票传递给其余节点,同时本身也会接收其余节点传过来的选票。每一个节点接收到选票后会作比较,这我的是否是比我强(zxid比我大),若是比较强,那我就须要改票,明明别人比我强,我也不能厚着脸皮对吧。

  • 投票箱

与人类选举投票箱稍微有点不同,Zookeeper 集群会在每一个节点的内存中维护一个投票箱。节点会将本身的选票以及其余节点的选票都放在这个投票箱中。因为选票是互相传阅的,因此最终每一个节点投票箱中的选票会是同样的。

  • 领导者

在投票的过程当中会去统计是否有超过一半的选票和本身选择的是同一个节点,即都认为某个节点是最强的。一旦集群中有超过半数的节点都认为某个节点最强,那该节点就是领导者了,投票也宣告结束。

什么场景下 Zookeeper 须要选举?

当 Zookeeper 集群中的一台服务器出现如下两种状况之一时,须要进入 Leader 选举

(1)服务器初始化启动。

(2)服务器运行期间 Leader 故障。

启动时期的 Leader 选举

假设一个 Zookeeper 集群中有5台服务器,id从1到5编号,而且它们都是最新启动的,没有历史数据。

集群刚启动选举过程

假设服务器依次启动,咱们来分析一下选举过程:

(1)服务器1启动

发起一次选举,服务器1投本身一票,此时服务器1票数一票,不够半数以上(3票),选举没法完成。

投票结果:服务器1为1票。

服务器1状态保持为LOOKING

(2)服务器2启动

发起一次选举,服务器1和2分别投本身一票,此时服务器1发现服务器2的id比本身大,更改选票投给服务器2。

投票结果:服务器1为0票,服务器2为2票。

服务器1,2状态保持LOOKING

(3)服务器3启动

发起一次选举,服务器一、二、3先投本身一票,而后由于服务器3的id最大,二者更改选票投给为服务器3;

投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数(3票),服务器3当选Leader

服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING

(4)服务器4启动

发起一次选举,此时服务器1,2,3已经不是LOOKING 状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3。

服务器4并更改状态为FOLLOWING

(5)服务器5启动

与服务器4同样投票给3,此时服务器3一共5票,服务器5为0票。

服务器5并更改状态为FOLLOWING

最终的结果

服务器3是 Leader,状态为 LEADING;其他服务器是 Follower,状态为 FOLLOWING

运行时期的Leader选举

在 Zookeeper运行期间 Leader非 Leader 各司其职,当有非 Leader 服务器宕机或加入不会影响 Leader,可是一旦 Leader 服务器挂了,那么整个 Zookeeper 集群将暂停对外服务,会触发新一轮的选举。

初始状态下服务器3当选为Leader,假设如今服务器3故障宕机了,此时每一个服务器上zxid可能都不同,server1为99,server2为102,server4为100,server5为101

集群 Leader 节点故障

运行期选举与初始状态投票过程基本相似,大体能够分为如下几个步骤:

(1)状态变动。Leader 故障后,余下的非 Observer 服务器都会将本身的服务器状态变动为LOOKING,而后开始进入Leader选举过程

(2)每一个Server会发出投票。

(3)接收来自各个服务器的投票,若是其余服务器的数据比本身的新会改投票。

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

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

话很少说先来一张图:

运行器 Leader 故障后选举流程

(1)第一次投票,每台机器都会将票投给本身。

(2)接着每台机器都会将本身的投票发给其余机器,若是发现其余机器的zxid比本身大,那么就须要改投票从新投一次。好比server1 收到了三张票,发现server2的xzid为102,pk一下发现本身输了,后面果断改投票选server2为老大。

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

敲黑板了,这些概念是面试必考的。

(1)Server id(或sid):服务器ID

好比有三台服务器,编号分别是1,2,3。编号越大在选择算法中的权重越大,好比初始化启动时就是根据服务器ID进行比较。

(2)Zxid:事务ID

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

(3)Epoch:逻辑时钟

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

(4)Server状态:选举状态

LOOKING,竞选状态。

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

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

LEADING,领导者状态。

总结

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

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

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

(4)在运行期选举还可能会遇到脑裂的状况,你们能够自行学习。


- END -


闲聊:最近雷架常常回复读者的疑问,有时候一不当心就写了800字,这么有责任感的雷架大家肯定不勾搭一下?😄 微信搜索 smileCoder1024 添加我的微信,须要加群能够备注”加群“

好文推荐(点击可阅读):

做者简介:

你们好,我是"爱笑的架构师"公号做者,你能够叫我"雷架"。

读过几年书:华中科技大学硕士毕业;

浪过几个大厂:华为、网易百度……

一直坚信技术能改变世界,愿保持初心,加油技术人!

据说点个在看就有好运气~

没有什么比天天有成长进步更高兴的事情

本文分享自微信公众号 - 爱笑的架构师(DancingOnYourCode)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索