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