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、集群配置
我们不用复制三个项目,只需要写三份配置文件,再在启动台去配置三个启动类即可:
如上图:
- 创建zoo1.cfg、zoo2.cfg、zoo3.cfg
- 创建zkdata1、zkdata2、zkdata3
- 创建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