美文网首页Zookeeper
Zookeeper之启动流程源码分析(单机模式)

Zookeeper之启动流程源码分析(单机模式)

作者: love111 | 来源:发表于2020-06-01 09:52 被阅读0次

启动项配置

启动类org.apache.zookeeper.server.quorum.QuorumPeerMain


image.png
image.png

org.apache.zookeeper.server.quorum.QuorumPeerMain#main


image.png
org.apache.zookeeper.server.quorum.QuorumPeerMain#initializeAndRun

配置文件数据加载到QuorumPeerConfig中

org.apache.zookeeper.server.quorum.QuorumPeerConfig#parse
加载配置文件数据到cfg


image.png

org.apache.zookeeper.server.quorum.QuorumPeerConfig#parseProperties
加载数据到QuorumPeerConfig参数中


image.png

开启一个定时清理任务用来清除日志和快照

DatadirCleanupManager


image.png

org.apache.zookeeper.server.DatadirCleanupManager#start
开启一个定时器处理
snapRetainCount表示保存快照的数量,snapDir快照目录,dataLogDir数据日志目录


image.png

以非分布式启动(单机模式)

image.png

调用到org.apache.zookeeper.server.ZooKeeperServerMain#main
开启ZooKeeper服务端,args参数是配置文件


image.png

org.apache.zookeeper.server.ZooKeeperServerMain#initializeAndRun
这里又解析一遍配置类,这次放入到ServerConfig类


image.png

以ServerConfig配置文件启动

org.apache.zookeeper.server.ZooKeeperServerMain#runFromConfig
1、创建MetricsProvider


image.png

2、创建FileTxnSnapLog快照日志工具类


image.png
3、JvmPauseMonitor创建JVM暂停监控线程
image.png
4、创建ZooKeeperServer类

设置ZooKeeperServer属性,jvmPauseMonitor、txnLog、tickTime、minSessionTimeout(4000)、maxSessionTimeout(40000ms)、listenBacklog
5、注册ZooKeeperServerShutdownHandler


image.png
当输入shutdown命令时,shutdownLatch.await()阻塞方法解除阻塞,调用shutdown()
image.png
org.apache.zookeeper.server.ZooKeeperServerMain#shutdown
停止服务实例
image.png
6、开启adminServer服务管理
可以通过:ip:8080/commands访问
image.png
7、ServerCnxnFactory创建和启动

zookeeper服务端数据接收的线程模型就是在这里创建并启动的


image.png

①、configure
org.apache.zookeeper.server.NIOServerCnxnFactory#configure


image.png
numSelectorThreads=1 Selector选择器数量,numWorkerThreads=8工作线程数量,workerShutdownTimeoutMS=5000ms
image.png
image.png

把SelectorThread线程放入到selectorThreads线程集合中
ServerSocketChannel服务端NIO开启Socket。包括创建ServerSocketChannel对象,bind绑定端口,设置非阻塞configureBlocking
创建acceptThread接受连接线程


image.png
AcceptThread线程注册了SelectionKey.OP_ACCEPT可接受连接事件,所以这个线程用来处理连接事件
②、startup
org.apache.zookeeper.server.ServerCnxnFactory#startup
image.png
org.apache.zookeeper.server.NIOServerCnxnFactory#startup
image.png
org.apache.zookeeper.server.NIOServerCnxnFactory#start
创建workerPool工作线程池,numWorkerThreads=8。开启selectorThreads选择器线程
image.png

开启接受连接线程acceptThread,开启expirerThread线程


image.png
③、startdata 加载zk数据到datatree中
org.apache.zookeeper.server.ZooKeeperServer#startdata
image.png
org.apache.zookeeper.server.ZooKeeperServer#loadData
从zkDb数据库中设置zxid
image.png
清除死了的sessions会话
image.png
打快照
image.png
image.png
org.apache.zookeeper.server.ZooKeeperServer#takeSnapshot(boolean)
把当前zkDb的dataTree,可以理解为当前zk数据库的数据节点dataTree,dataTree是一个java对象
image.png
org.apache.zookeeper.server.persistence.FileTxnSnapLog#save
序列化数据到文件中
image.png
④、zks.startup
org.apache.zookeeper.server.ZooKeeperServer#startup
创建会话跟踪器sessionTracker并启动
image.png
设置请求过滤链并启动
org.apache.zookeeper.server.ZooKeeperServer#setupRequestProcessors

依次是PrepRequestProcessor是firstProcessor第一个、SyncRequestProcessor、FinalRequestProcessor的顺序


image.png
开启流控线程RequestThrottler
org.apache.zookeeper.server.ZooKeeperServer#startRequestThrottler
image.png
注册jmxServerBean和jmxDataTreeBean
org.apache.zookeeper.server.ZooKeeperServer#registerJMX
image.png
开启jvmPauseMonitor线程,这里为null
org.apache.zookeeper.server.ZooKeeperServer#startJvmPauseMonitor
image.png
registerMetrics、
image.png
8、secureCnxnFactory启动,这里不存在
image.png
9、containerManager容器管理并启动
image.png

总结:

zookeeper单机服务端启动的核心就是初始化并启动数据接收线程模型。
acceptThread用来接收客户端连接,selectorThreads用来把连接的客户端的读写处理。
初始化了请求过滤链RequestProcessors包括PrepRequestProcessor、SyncRequestProcessor、FinalRequestProcessor
初始化了流控线程RequestThrottler
日志及快照数据的加载的处理等过程

相关文章

网友评论

    本文标题:Zookeeper之启动流程源码分析(单机模式)

    本文链接:https://www.haomeiwen.com/subject/fnljzhtx.html