赞
踩
前面我们分析了zookeeper的启动流程,中间也涉及了很多过程,其中选举就是zookeeper的启动核心过程之一,本篇我们来学习zookeeper的选举流程
经过前面的zookeeper相关的文章,我们也对zookeeper有一定的了解,知道在zookeeper中存在三种服务器角色,分别是Leader,Follower以及Observer,其中Observer仅仅作为一个监控协调者的作用,并不参与zookeeper对外提供服务以及zookeeper的选举,而zookeeper的选举我们从前面的内容也知道,总共可以分为两种,第一种是当整个zookeeper的集群启动后,进行的选举过程,第二种则是在zookeeper运行期间,当出现Leader崩溃的过程时,zookeeper进行的选举操作。接下来我们先从启动的时候触发的选举开始学习
我们在搭建zookeeper的时候往往会有一个配置文件,里面存放一个myid,用来标示集群内不同客户端的机器编号,当至少两台含有myid的机器启动后,就开始进入了zookeeper的集群选举流程
1.每个server发起一个投票
由于当前是刚启动状态,因此每一个服务实例都会默认把自己作为Leader服务器来发起投票,而每一个投票中包含了最基本的选举所需要的元素,例如myid和ZXID,我们将这两个按照选票的方式表示,例如myid为1,ZXID为0,我们将会表示为(1,0),由于每台服务端实例优先都是按照自己是Leader发起投票,那么server1默认生成的选票就是(1,0),server2的选票则是(2,0),以此类推
2.接受到其他服务端实例发来的选票
没台服务端实例都会收到其他服务端实例发来的选票信息,当收到选票后,就会开始校验处理选票的流程
3.校验处理选票
其他服务实例发来的选票,要经过一系列验证,比如是不是本轮投票的选票,是否来自于Looking状态的实例发来的选票,经过校验后,就会和当前实例的选票信息进行pk比较,比较的规则大致如下:
①优先比较ZXID,ZXID不一样的时候,较大的那个选票所在的服务实例作为Leader
②如果两个选票的ZXID相同的话,那么就会比较myid,默认为myid较大的服务实例作为Leader
根据这个规则,我们来看看当server1收到server2的选票后,比较的流程是怎样的,首先两个选票都是第一轮投票选举,所以zxid都是0,接着就要开始比较myid了,server1的myid是1,而server2的myid是2,大于自身的myid,那么server2就应该是Leader,因此server1会更新自己的选票为(2,0),然后下次发送的时候就是发送新的选票信息出去
4.统计每一次选票
每一次投票以后,都会统计所有的投票,判断是否有过半的实例接受到了相同的选票信息,对与当前server1和server2来说,必须这两个实例的选票都一样才可以算是完成了选举流程,而如果是单数的实例的话,只需要达到(实例数 + 1) / 2的服务端实例接受到一样的选票即可。而经过上面的流程以后,只要server1比较完选票,也发出了(2,0)的选票信息,即可完成选举
5.同步服务端实例状态
一旦选举完成,选出了Leader实例,每个服务实例都会更新自身的状态,如果是Follower,就会变为FOLLOWER,如果是Leader则会变成LEADING状态。
除了启动zookeeper集群的时候,一般情况下Leader会一直作为集群中的Leader,即使集群中的Follower挂了或者是新机器实例加入集群中,也不会影响Leader。但是一旦Leader无法响应或者是宕机了,Zookeeper集群将无法对外进行服务,而是进行新一轮的Leader选举,而这个选举的过程与初始化启动集群的选举过程大体上是差不多的,但是有区别的是这个时候每个机器将要从自身的运行状态切换到选举状态
1.更新自身状态
当Leader实例挂了以后,剩下的所有Follower实例都会将自身的服务状态变更为LOOKING,然后进行Leader选举流程
2.一样的选举流程
Leader选举的大体流程都是一样的,这里将不再赘述,当完成选举以后,每个服务端实例按照自身的角色,将自身的状态修改为对应的角色状态,这个时候选举完成,Zookeeper集群恢复对外提供服务。
zookeeper的选举的大概流程我们知道了,但是我们都知道,选举的过程是基于算法的,zookeeper的选举算法有哪些呢?在zookeeper中,提供了三种Leader选举的算法,分别是LeaderElection、UDP版本的FastLeaderElection以及TCP版本的FastLeaderElection三种选举算法。而选举算法,则是可以在zoo.cfg配置文件中的electionAlg属性来指定,这三种选举算法分别对应值为0-3,其中0为LeaderElection算法,使用的是UDP协议实现,1代表UDP版本的FastLeaderElection算法,这种算法是非授权模式,2代表的也是UDP版本的FastLeaderElection算法,不过这种使用的是授权模式,3代表是TCP协议实现的FastLeaderElection算法。
不过需要注意的是,从Zookeeper3.4.X版本开始,Zookeeper官方已经废弃了UDP协议实现的0-2这三种Leader选举算法,仅仅保留了3这一种TCP协议实现的FastLeaderElection算法,这也是为什么上面我们介绍选举的大致流程中不针对每一种选举算法进行分析的原因。
学习了选举的大概流程以后,我们发现整体流程和算法的设计不难,但是具体如何处理常见的问题的?这个时候我们需要深入细节来学习,首先Zookeeper为了处理不同情况,设计了多个服务端的状态,这个状态的定义在org .apache .
zookeeper . server.quorum .QuorumPeer. ServerState 类中,分别如下:
①LOOKING:寻找Leader服务的状态,处于当前状态后,将会进行Leader选举流程
②FOLLOWING:代表当前服务端处于跟随者状态,表明是Follower服务
③LEADING:代表当前服务端处于领导者状态,表明是Leader服务
④OBSERVING:观察者状态,表明是Observer服务
前面我们也提到过,每次发出选票后,选票中包含了基本的元素,即ZXID和myid,而这个选票的定义在 apache.zookeeper.server.quorum.Vote类,代码如下:
final private int version;
final private long id;
final private long zxid;
final private long electionEpoch;
final private long peerEpoch;
我们把常见的几个属性进行说明,如下:
属性 | 说明 |
---|---|
id | 被选举的SID |
zxid | 当前Leader的事物ID |
electionEpoch | 逻辑时钟,解析出来的,当前处于第几轮选举投票,每次进入新一轮投票后,都会加1 |
peerEpoch | 当前被选举的Leader的epoch |
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
最后这里放上我这段时间复习的资料,这个资料也是偶然一位朋友分享给我的,里面包含了腾讯、字节跳动、阿里、百度2019-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。
还有 高级架构技术进阶脑图、高级进阶架构资料 帮助大家学习提升进阶,也可以分享给身边好友一起学习。
一起互勉~
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中…(img-NJSC6utt-1712783366076)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。