Zookeeper之启动流程源码分析(单机模式)
启动项配置
启动类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
日志及快照数据的加载的处理等过程