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