ZK服务启动流程源码剖析


ZK服务启动流程源码剖析

流程图

ZK启动入口分析

启动入口类:QuorumPeerMain
该类是 zookeeper 单机/集群的启动入口类,是用来加载配置、启动 QuorumPeer (选举相关)线程、创建 ServerCnxnFactory 等,我们可以把代码切换到该类的主方法( main )中,从该类的主方法开始分析, main 方法代码分析如下:

在这里插入图片描述
上面main方法虽然只是做了初始化配置,但调用了 initializeAndRun() 方法,
initializeAndRun() 方法中会根据配置来决定启动单机Zookeeper还是集群Zookeeper,源码如下:

在这里插入图片描述

如果启动单机版,会调用 ZooKeeperServerMain.main(args); ,如果启动集群版,会调用QuorumPeerMain.runFromConfig(config);

单机版启动流程

启动流程概览图:
概览图
调用链路图:
在这里插入图片描述

1)单机启动入口

按照上面的源码分析,我们找到 ZooKeeperServerMain.main(args) 方法,其中在 initializeAndRun 方法中执行初始化操作,并运行Zookeeper服务。main如下图:

在这里插入图片描述

2)配置文件解析

initializeAndRun() 方法会注册JMX,同时解析 zoo.cfg 配置文件,并调用 runFromConfig()方法启动Zookeeper服务,源码如下:
在这里插入图片描述

3)单机启动主流程

runFromConfig 方法是单机版启动的主要方法,该方法会做如下几件事:
在这里插入图片描述
方法源码如下:
在这里插入图片描述

集群版启动

概览图:
在这里插入图片描述

1、集群配置

我们不用复制三个项目,只需要写三份配置文件,再在启动台去配置三个启动类即可:
在这里插入图片描述

在这里插入图片描述
如上图:

  1. 创建zoo1.cfg、zoo2.cfg、zoo3.cfg
  2. 创建zkdata1、zkdata2、zkdata3
  3. 创建3个myid,值分别为1、2、3

配置3个启动类,如下图:
在这里插入图片描述

2、集群启动流程分析

程序启动,运行流程启动集群模式,如下图:
在这里插入图片描述
QuorumPeerMain中runFromConfig() 调用了 quorumPeer.start()启动服务,如下代码:
在这里插入图片描述
quorumPeer.start() 方法代码如下:
在这里插入图片描述
quorumPeer.start() 方法启动的主要步骤:
在这里插入图片描述
startLeaderElection()开启Leader选举方法做了2件事,首先创建初始化选票选自己,接着创建选举投票方式,源码如下:
在这里插入图片描述
createElectionAlgorithm()创建选举算法只有第3种,其他2种均已废弃,方法源码如下:
在这里插入图片描述
这个方法创建了以下三个对象:
①、创建QuorumCnxManager对象
②、QuorumCnxManager.Listener
③、FastLeaderElection


文章作者: fFee-ops
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 fFee-ops !
评论
  目录