2.紧接着会创建Zookeeper中的数据存储管理器–FileTxnSnaplog类,此类作为最上层的,提供了一系列了操作数据文件的接口,其中包括操作事务日志和操作快照的接口,而创建当前类实例会根据zoo.cfg中的dataDir以及dataLogDir参数进行构建
3.同样根据解析出来的zoo.cfg配置文件中的tickTime以及session的会话时间来设置对应参数,并且会根据zookeeper.serverCnxnFactory参数来确定启动Zookeeper的网络连接工厂是基于Netty的还是基于jdk自身的Nio工厂
4.确定工厂类型后,Zookeeper会开始初始化一个Thread,作为整个Zookeeper运行过程中的主线程,并且开始初始化ServerCnxnFactory实例
5.当ServerCnxnFactory实例构建完毕后,开始运行对应的run方法中的业务逻辑,此时由于连接工厂已经创建,端口其实已经对外开放了,但是Zookeeper此时还未完成启动过程,还无法对外处理请求
6.开始恢复Zookeeper的数据,将从事务日志以及之前保存的快照进行数据恢复
7.数据恢复完成后,Zookeeper开始构建会话管理器–SessionTracker,此类主要负责管理Session,在创建的时候,将e xpirationlnterval, nextExpirationTime
和 sessionsWithTimeout进行计算以及配置,并且会计算出每一个Session对应的SessionID,并且在运行过程中会负责Session的会话超时检测等
8.创建完毕后,Zookeeper会初始化对应的请求过滤链,而在Zookeeper中请求的过滤链使用了责任链模式,其中处理的顺序流程主要是PrepRequestProessor->SyncRequestProessor->FinalRequestProessor三个请求处理器,至此Zookeeper的初始化流程已经做完
注册提供服务
当Zookeeper的初始化流程完成后,服务器已经开始到就绪状态了,只需要将对应的信息注册以后即可对外提供服务了,此阶段的流程大概如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X77NEEsQ-1630943228105)(assets/1583930342471.png)]
可以看到此阶段中,Zookeeper只需要将JMX服务注册,以及当前相关实例注册完毕,即可完成单机启动流程,此时的Zookeeper已经正常提供服务了
集群模式启动流程
集群模式的启动过程很多和单机模式是一样的,但是由于集群模式下,会有Leader机器选举以及数据同步的过程,因此Zookeeper的集群模式启动过程要复杂的多,而整个集群的启动过程,大体可以分为五个部分,分别是预处理、初始化、Leader选举、Leader与Follower交互以及Leader与Follower启动,其中预处理过程几乎与单机模式一样,唯一的区别在于解析zoo.cfg中的连接配置,判断启动模式为集群模式,开始进入集群模式的初始化操作流程而已,因此,我们从集群模式的初始化开始
初始化
初始化过程大体和单机模式差不多,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lWzg90WQ-1630943228107)(assets/1584026509382.png)]
1.创建并初始化ServerCnxnFactory
2.创建Zookeeper中的数据文件管理器FileTxnSnaplog
3.在集群模式下,会去创建QuorumPeer实例,Quorum是集群模式下特有的对象,属于Zookeeper的托管者,此类的作用是在运行期间,会不停的检测当前服务器实例的状态,并且在需要选举的时候发起选举
4.创建Zookeeper中的内存数据库ZKDatabase实例,用来记录会话记录以及DataTree和事物日志
5.QuorumPeer实例作为托管者,会在启动过程中,将核心组件信息注册上去,包括之前创建的ZKDatabase、FileTxnSnaplog以及服务器列表信息,选举算法等
6.开始恢复数据
7.数据恢复完成后,开始启动ServerCnxnFactory中的主线程,运行run方法,开始执行服务器选举相关的操作
Leader选举
选举阶段的流程大概如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IbMd1Xxo-1630943228108)(assets/1584027094269.png)]
1.Zookeeper解析zoo.cfg配置文件中的 electionAlg属性,来确定进行选举的算法是哪一种,在Zk中有三种选举算法,分别是 LeaderElection 、 AuthFastLeaderElection 和 FastLeaderElection,分别对应数值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进行交互,进行数据同步等操作,此阶段的流程大致如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RRvSNMr1-1630943228110)(assets/1584028273019.png)]
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解析出epoch_of_learner,和Leader自身的epoch_of_leader进行比较,如果发现Leader的epoch_of_leader比较小,则会更新Leader的epoch:
尾声
最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。
CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》
进阶学习视频
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)