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。
此时双方的投票箱结果为:
代码语言:txt复制服务器1,获0票;
服务器2,获2票;
并没有超过票数过半的机器。选举依然无法完成,此时服务器2的状态仍为looking
- 服务器3
先投自己1票,将自己的选票结果同步给服务器1、服务器2。 服务器1和服务器2 ,发现服务器3的sid编号比自己还大,所以赶紧进行改票,都投给了服务器3。
此时投票箱的结果为:
代码语言:txt复制服务器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