Zookeeper原理篇-Zookeeper启动流程分析

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

5.当ServerCnxnFactory实例构建完毕后,开始运行对应的run方法中的业务逻辑,此时由于连接工厂已经创建,端口其实已经对外开放了,但是Zookeeper此时还未完成启动过程,还无法对外处理请求

6.开始恢复Zookeeper的数据,将从事务日志以及之前保存的快照进行数据恢复

7.数据恢复完成后,Zookeeper开始构建会话管理器–SessionTracker,此类主要负责管理Session,在创建的时候,将e xpirationlnterval, nextExpirationTimesessionsWithTimeout进行计算以及配置,并且会计算出每一个Session对应的SessionID,并且在运行过程中会负责Session的会话超时检测等

8.创建完毕后,Zookeeper会初始化对应的请求过滤链,而在Zookeeper中请求的过滤链使用了责任链模式,其中处理的顺序流程主要是PrepRequestProessor->SyncRequestProessor->FinalRequestProessor三个请求处理器,至此Zookeeper的初始化流程已经做完

注册提供服务

当Zookeeper的初始化流程完成后,服务器已经开始到就绪状态了,只需要将对应的信息注册以后即可对外提供服务了,此阶段的流程大概如下:

可以看到此阶段中,Zookeeper只需要将JMX服务注册,以及当前相关实例注册完毕,即可完成单机启动流程,此时的Zookeeper已经正常提供服务了

集群模式启动流程

集群模式的启动过程很多和单机模式是一样的,但是由于集群模式下,会有Leader机器选举以及数据同步的过程,因此Zookeeper的集群模式启动过程要复杂的多,而整个集群的启动过程,大体可以分为五个部分,分别是预处理初始化Leader选举Leader与Follower交互以及Leader与Follower启动,其中预处理过程几乎与单机模式一样,唯一的区别在于解析zoo.cfg中的连接配置,判断启动模式为集群模式,开始进入集群模式的初始化操作流程而已,因此,我们从集群模式的初始化开始

初始化

初始化过程大体和单机模式差不多,如下:

1.创建并初始化ServerCnxnFactory

2.创建Zookeeper中的数据文件管理器FileTxnSnaplog

3.在集群模式下,会去创建QuorumPeer实例,Quorum是集群模式下特有的对象,属于Zookeeper的托管者,此类的作用是在运行期间,会不停的检测当前服务器实例的状态,并且在需要选举的时候发起选举

4.创建Zookeeper中的内存数据库ZKDatabase实例,用来记录会话记录以及DataTree和事物日志

5.QuorumPeer实例作为托管者,会在启动过程中,将核心组件信息注册上去,包括之前创建的ZKDatabase、FileTxnSnaplog以及服务器列表信息,选举算法等

6.开始恢复数据

7.数据恢复完成后,开始启动ServerCnxnFactory中的主线程,运行run方法,开始执行服务器选举相关的操作

Leader选举

选举阶段的流程大概如下:

1.Zookeeper解析zoo.cfg配置文件中的 electionAlg属性,来确定进行选举的算法是哪一种,在Zk中有三种选举算法,分别是 LeaderElectionAuthFastLeaderElectionFastLeaderElection,分别对应数值0-3,不过从3.4的版本开始,zk仅支持FastLeaderElection选举算法,其他两种被废弃了。同样的,在选举的初始化阶段,zk会根据自身服务器ID、lastLoggedZxid和当前服务器的epoch初始化一个选举的票据

2.选举初始化准备好以后,开始注册JMX服务

3.前面创建好的QuorumPeer实例会不断检测当前的服务器状态,在正常情况下,QuorumPeer的状态应该是LOOKING,才会开始进行选举操作

4.开始进行选举操作,简单来说,zk中一般是ZXID最大的机器成为Leader,如果ZXID一样,SID越大的则成为Leader。(zk的详细选举流程,则在后续的文章中分析)

Leader与Follower交互

当选举出Leader机器以后,其他的机器则会开始与Leader进行交互,进行数据同步等操作,此阶段的流程大致如下:

1.不同角色(Leader和Follower)的zookeeper服务器在选举完毕后,会开始进入各自角色的主流程

2.在Zookeeper集群运行期间,Leader服务器需要和其他的服务器保持连接确定集群的机器存活情况,zk创建LearnerCnxAcceptor实例用来负责处理所有的非Leader机器的连接请求

3.非Leader服务器在启动完毕后,会从选举的结果中找到集群的Leader,并且尝试进行连接

4.Leader的LearnerCnxAcceptor实例在接受到非Leader机器的请求后,会创建LearnerCnxHandler实例,每个实例会对应一个Leader与非Leader机器的连接,负责对应服务器之间的消息通信处理以及数据同步操作

5.当非Leader机器与Leader服务器建立连接后,非Leader机器就会将自己的信息发送给Leader,此过程的数据称之为LearnerInfo,其中包括了当前服务器的SID以及最大的ZXID

6.Leader收到LearnerInfo消息后,从中解析出SID和ZXID,然后根据ZXID解析出epochoflearner,和Leader自身的epochofleader进行比较,如果发现Leader的epochofleader比较小,则会更新Leader的epoch:

  1. epoch_of_leader = epoch_of_learner + 1

然后继续等待其他机器的LearnerInfo消息,直到半数以上,即可确定整个集群中的epoch值了

7.在确定了epoch以后,Leader将该信息发送给所有的非Leader机器,此消息称之为LEADERINFO

8.Follower机器在收到Leader发送的LEADERINFO消息后,解析出消息中的epochZXID,然后响应给Leader一个ack

9.Leader收到ack以后,就可以开始与该Follower机器进行数据同步过程了

10.整个集群中如果超过半数的Follower机器完成了和Leader之间的数据同步过程,这个时候集群实例就已经可以提前启动对外提供服务

Leader和Follower启动

集群模式下的Zookeeper在完成了Leader与Follower服务器之间的交互流程后,也开始进入到了启动注册的阶段,此阶段和单机模式流程几乎相同,首先是创建并且启动会话管理器,然后初始化Zookeeper中的请求处理链,接着Zookeeper开始注册JMX服务,当注册完毕后,整个集群的启动完成,此时Zookeeper的集群也可以对外开始提供服务了

我的面试宝典:一线互联网大厂Java核心面试题库

以下是我个人的一些做法,希望可以给各位提供一些帮助:

整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!

image

283页的Java进阶核心pdf文档

Java部分:Java基础,集合,并发,多线程,JVM,设计模式

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

image

还有源码相关的阅读学习

image

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
ONrk9-1714772300931)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 25
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值