当前位置: 首页 > 后端技术 > Java

蚂蚁面试官:Zookeeper的选举流程是怎样的?我当场就傻眼了,..

时间:2023-04-01 23:26:43 Java

stackmanager面试经常会遇到面试官问Zookeeper的选型原则。我心想,问这些问题有什么用吗?不要让我造火箭!每次面试都只知道大概的思路,不去深究具体的过程,所以在面试的时候无法打动面试官,总是很吃亏。所以这篇文章总结了要点,希望对大家顺利完成面试有所帮助。.有一点要说的是,Zookeeper的工作原理和选举过程可能大部分人在工作中用不到,但是多了解一点对自己有好处,以免求职面试被面试官打压。Zookeeper也是后端主流的分布式协调框架。很多流行的框架都直接或间接依赖于它,比如Dubbo、ElasticJob、Kafka等,所以掌握ZK的选举过程也是很有必要的。本文将以通俗易懂的方式进行,ZK小白也能看懂。另外我也整理了Zookeeper系列的主流面试题和参考答案,关注公众号Java技术栈回复关键词“面试”刷题。基本概念在理解选举之前,需要先了解Zookeeper的一些基本概念。集群机器ID集群机器ID指的是myid,它是每个集群机器中的一个编号文件,代表ZooKeeper集群服务器的标识,手动生成,全局唯一。TransactionIDTransactionID指的是zxid。Zookeeper会为每个更新请求分配一个事务ID。是一个64位的数字,由Leader统一分配。它在全球范围内是独一无二的,并且还在不断增加。可以在一个节点的状态信息中查看最新的交易ID信息。集群服务器角色Zookeeper集群服务器有以下三种角色:1.Leader(主)2.Follower(从,参与投票)3.Observer(观察者,不参与投票)集群服务器状态Zookeeper集群服务器有以下4种states:1.LOOKING是寻找Leader状态。当服务器处于该状态时,表示当前集群没有Leader,因此会进入Leader选举状态。2.FOLLOWING追随者状态,表示当前服务器角色为Follower。3.LEADING领导者状态,表示当前服务器角色是Leader。4.OBSERVING观察者状态,表示当前服务器角色为观察者。选举方式Zookeeper提供了3种选举方式:LeaderElectionAuthFastLeaderElectionFastLeaderElection(最新默认)选举场景Zookeeper会在以下场景进行选举:1.Zookeeper集群启动初始化时进行选举2.Zookeeper集群leader失联时重新选举。选举前提1.Zookeeper服务器处于LOOKING选举状态。这个时候就说明Zookeeper服务器集群处于无领导状态。此外,观察员国不能参与选举投票。2、Zookeeper集群规模至少要有3台机器以上。集群规则为:2N+1台机器,N>0,即至少需要3台机器,因为ZK集群的机制是只要一半以上的节点正常,集群就可以提供服务通常情况下。只有当ZK节点过多,只有一半或不到一半的节点可以工作时,集群才会失败。如下分析所示:3个节点的集群可以挂掉1个节点(Leader可以获得2个投票>1.5)2个节点的集群不能挂掉任何一个节点(Leader可以获得1个投票<=1)所以你知道为什么至少有3个ZK集群吗?3、Zookeeper集群需要2台或以上的机器相互通信。只有2台服务器通信才能进行选举。只启动一台服务器时无法进行选举,因为只有服务器之间通信才能同步投票结果。选举过程1.集群初始选举Zookeeper会在集群启动时进行选举。这里以3台服务器为例:servermyidzxidzk110zk220zk330依次启动3台服务器zk1、zk2、zk3。初始时交易ID全为0。大选过程:1.初始投票服务器启动后,每个服务器都会为自己投一票,每票都会包含投票服务器的myid和zxid,表示为服务器的形式(myid,zxid)。投票结果为:zk1(1,0),zk2(2,0),zk3(3,0)2.同步投票结果集群内服务器投票后,会将自己的投票结果同步到集群内其他服务器.3、检查投票的有效性每个服务器在收到选票后都会检查选票的有效性,比如:是否是本轮投票,是否是来自处于LOOKING状态的服务器的选票等4.投票比较将在投票服务器之间进行。规则如下:先查zxid,大的server先成为leader。如果zxid相同,则myid大的server为leader。例如:zk1和zk2进行比较,此时zk2获胜,zk1更新自己的投票为:zk1(2,0)5.统计投票结果每轮投票比较后,统计投票结果以确认是否超过一半的机器获得相同的投票结果。如果是,则选举一个Leader,否则继续投票。在这一轮选举中,zk1和zk2都得到了相同的投票结果(2,0),2指的是zk2,超过半数的机器(2>3/2),所以zk2成为了本次的投票结果一轮选举。领导者。所以,即使启动了zk3,因为集群已经有了Leader,所以选举结束,zk3不再参与选举,后面进来的都是小弟。6、更改服务器状态一旦选出Leader,每台服务器都会更新自己的状态:zk1>>>FOLLOWINGzk2>>>LEADINGZk3>>>FOLLOWING2,当集群无法与服务器保持正常连接时,重新选举ZookeeperLeader在运行过程中,即如果Leader挂了,或者Leader服务器出现故障,会进行新一轮的Leader选举。这里还是以3台服务器为例:servermyidzxidzk1(Follower)10zk2(Leader)20zk3(Follower)30如果作为初选的Leaderzk2挂掉了,集群会暂停对外服务,进行新的Leader选举。换届选举流程:1.状态变化由于之前的leaderLeader不可用,所有的Follower服务器都需要从FOLLOWING状态变为LOOKING状态,才能开始新一轮的Leader选举。2.开始投票投票逻辑与初始开始一致。默认情况下,zk1和zk3在第一轮投票中依然会投给自己,而zk2挂了就不能投票了。第一轮投票的结果是:zk1(1,66),zk3(3,28),zk1和zk3各得一票,假设zk1的交易ID比zk3大一点。3.同步投票结果同步投票逻辑与初始启动一致。4.检查投票有效性检查投票逻辑是否与初始启动一致。5.处理投票处理投票逻辑与初始启动一致。这个时候比较zk1和zk3。根据规则,由于zk1的交易ID较大,zk1获胜,zk3也更新自己的投票为:zk3(1,28)6.统计投票结果统计投票逻辑与初始启动一致。在这一轮选举中,zk1和zk3都获得了相同的投票结果zk1,并且超过一半的机器(2>3/2),因此zk1成为了这一轮选举的领导者。7、更改服务器状态,更改状态逻辑与初始启动一致。总结所以,我们可以得出结论,当Zookeeper集群按照myid从小到大初始化时,在超过半数机器投票的情况下,myid最大的就是Leader。知道了这条定律,我们就可以使用不同的簇大小。计算谁是Leader。集群初始化时:1)集群中有3台机器,myid第二大的服务器为Leader;2)集群中有4台机器,myid第三大的服务器为Leader;3)集群中有5台机器,第三大myid所在的服务器为Leader;3)集群中有6台机器,第四大myid所在的服务器为Leader;.....集群重选时,根据myid和zxid的大小来决定,zxid大的优先成为Leader。总之,谁得到过半数服务器的支持,谁就是老大。Zookeeper的选举过程你了解了吗?这只是选举过程的粗略版本。实际的选举过程要复杂得多。有兴趣的可以深入研究源码。好了,今天的分享就到这里。稍后栈长会分享更多有趣的Java技术和最新的技术资料。关注公众号Java技术栈第一时间推送。我也会分享主流的Zookeeper面试题和参考答案。全部搞定后在公众号后台回复关键词“面试”刷题。最后,如果觉得我的文章对你有用,动动你的小手,送给正在看的人,转发吧,原创不易,楼主需要你的鼓励。版权声明:本文为公众号《Java技术栈》原创,原创不易,转载或引用本文内容请注明出处,抄袭者一律举报+投诉,并保留追究权利法律责任。近期热点文章推荐:1.1,000+Java面试题及答案(2021最新版)2.别在满屏的if/else中,试试策略模式,真的很好吃!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!