Zookeeper服务端源码解析

目录

一  服务端入口

二 服务端初始化——参数解析

 三 服务端初始化——过期快照删除

四 服务端初始化——通信初始化


一  服务端入口

    如何找到入口函数呢?可以从启动脚本入手,ZK的启动命令是 zkServer.sh start,因此打开该脚本一探究竟。(哭了,这个脚本还挺长。。。。。)如何快速找到入口函数了?启动脚本后面跟了一个start参数,因此在脚本中搜索关键字可以快速定位到入口函数,如图1.1所示:

图1.1 启动脚本局部 

    再定位到java的启动命令,可以发现跟了一个$ZOOMAIN参数,这个参数就是入口函数,在脚本中搜索$ZOOMAIN参数,最终定位到服务端入口函数为如图1.2所示:

图1.2 入口函数

    入口函数:org.apache.zookeeper.server.quorum.QuorumPeerMain,PS:不需要对脚本很懂,只需要对启动逻辑有个初步的认识,就能轻松找到启动函数

二 服务端初始化——参数解析

    在原代码中搜索QuorumPeerMain,如图2.1所示:

图2.1 main函数

    从代码中可看出,初始化和启动方法为main.initializeAndRun(args),进入到方法内部,第一步就是读取配置文件,如图2.2所示:

 图2.2 initializeAndRun 

     这个参数能够从启动脚本找到,该参数就是$ZOOCFG,如图2.3所示。该参数的值为zoo.cfg配置文件的路径,在部署ZK之前,都会去配置zoo.cfg文件,这个大家应该很熟悉了。

图2.3 $ZOOCFG

    进入到 config.parse(args[0])内部,这个方法比较简单,大体分为三个步骤,如图2.4所示:

    1.读取配置文件;2.加载配置文件中的内容;3.对配置文件中的内容进行解析。重点看一看parseProperties(cfg)的内容。

 图2.4 parse

    parseProperties(cfg)函数的内容很长,但其实逻辑很简单,就是从zoo.cfg配置文件中,以KV键值对的形式读取配置文件中的内容,在代码可以发现,常用的配置参数如dataDir, clientPort等,如图2.5所示:

 图2.5 parseProperties

    在 parseProperties的末尾,发现了一个重要的函数setupQuorumPeerConfig(zkProp, true),这个函数初始化服务id,客户端端口号等,如图2.6,2.7所示:

 图2.6 setupQuorumPeerConfig 

 图2.7 setupQuorumPeerConfig实现内容

    在部署ZK集群的时候,我们都知道需要为每一个节点设置一个myId, 进入setupMyId一探究竟这个myId究竟是个啥?如图2.8所示,首先可以看到,myId是从dataDir这个配置信息中获取到的(dataDir这个值是在zoo.cfg中配置的),读取到myId后,将myId进行解析赋值给了serverId,原来myId就是服务器ID

图2.8 setupMyId 

 三 服务端初始化——过期快照删除

     回到initializeAndRun方法,解析完配置文件后,接下来是启动定时清理过期快照功能。整个流程如图3.1所示:

 图3.1 过期快照清理流程

     快照清理管理类DatadirCleanupManager中有两个参数,snapRetainCount和purgeInterval。snapRetainCount默认为3,表示至少保留的快照数量为3个;purgeInterval默认为0,表示默认不会开启清理快照的功能。

    进入purgeMgr.start函数,可知当purgeInterval<0时,函数直接return, 即不会开启定时清理快照的功能。如果purgeInterval大于0,就会进入下一步,初始化PurgeTask。PurgeTask继承了TimerTask,最终通过scheduleAtFixedRated定时执行PurgeTask覆写的run方法,执行清理快照。

四 服务端初始化——通信初始化

    回到initializeAndRun方法,过期快照方法执行完毕后,接下来在集群模式下会执行runFromConfig方法,会执行相关通信初始化操作。大体步骤如图4.1所示:

  图4.1 通信初始化1

     进入runFromConfig方法后,首先是获取根据是否启动安全通信的方式来获取对应的通信工厂,进入ServerCnxnFactory.createFactory方法可以获取到一个重要信息:即ZK采用的默认通信方式为NIO。

    在ServerCnxnFactory.createFactory方法中可知通信工厂的名称zookeeper.serverCnxnFactory这个参数的具体含义在zookeeper-docs模块的zookeeperAdmin.md文件中,从该文件对serverCnxnFactory的描述描述可知,默认是采用的基于NIO的通信方法,也可以设置为采用netty的安全的通信方式。

    获取到通信工厂后,进入configure法进行端口号的绑定等相关设置。如图4.2所示。这里默认采用的是NIO的方式,因此进入NIOServerCnxnFactory中的configure法,在该方法中可以看到,对端口号进行了绑定。客户端端口号默认为2181,在配置文件zoo.cfg可以指定客户端的具体端口号,同时将通信方式设置为了非阻塞模式。

 图4.2 通信初始化2

    在runFromConfig后面会对quorumPeer实例的属性进行赋值,这个实例就表示一个ZK节点,集群中有几个节点就对应几个quorumPeer实例。通过调用quorumPeer.start()将节点运行。

五 服务端启动总结

 图5.1 服务端启动总结

 附Zookeeper入门学习视频:

https://www.bilibili.com/video/BV1to4y1C7gw     

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值