启动项配置
启动类org.apache.zookeeper.server.quorum.QuorumPeerMain


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

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

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

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

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

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

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

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

以ServerConfig配置文件启动
org.apache.zookeeper.server.ZooKeeperServerMain#runFromConfig
1、创建MetricsProvider

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

3、JvmPauseMonitor创建JVM暂停监控线程

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

当输入shutdown命令时,shutdownLatch.await()阻塞方法解除阻塞,调用shutdown()

org.apache.zookeeper.server.ZooKeeperServerMain#shutdown
停止服务实例

6、开启adminServer服务管理
可以通过:ip:8080/commands访问

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

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

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


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

AcceptThread线程注册了SelectionKey.OP_ACCEPT可接受连接事件,所以这个线程用来处理连接事件
②、startup
org.apache.zookeeper.server.ServerCnxnFactory#startup

org.apache.zookeeper.server.NIOServerCnxnFactory#startup

org.apache.zookeeper.server.NIOServerCnxnFactory#start
创建workerPool工作线程池,numWorkerThreads=8。开启selectorThreads选择器线程

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

③、startdata 加载zk数据到datatree中
org.apache.zookeeper.server.ZooKeeperServer#startdata

org.apache.zookeeper.server.ZooKeeperServer#loadData
从zkDb数据库中设置zxid

清除死了的sessions会话

打快照


org.apache.zookeeper.server.ZooKeeperServer#takeSnapshot(boolean)
把当前zkDb的dataTree,可以理解为当前zk数据库的数据节点dataTree,dataTree是一个java对象

org.apache.zookeeper.server.persistence.FileTxnSnapLog#save
序列化数据到文件中

④、zks.startup
org.apache.zookeeper.server.ZooKeeperServer#startup
创建会话跟踪器sessionTracker并启动

设置请求过滤链并启动
org.apache.zookeeper.server.ZooKeeperServer#setupRequestProcessors
依次是PrepRequestProcessor是firstProcessor第一个、SyncRequestProcessor、FinalRequestProcessor的顺序

开启流控线程RequestThrottler
org.apache.zookeeper.server.ZooKeeperServer#startRequestThrottler

注册jmxServerBean和jmxDataTreeBean
org.apache.zookeeper.server.ZooKeeperServer#registerJMX

开启jvmPauseMonitor线程,这里为null
org.apache.zookeeper.server.ZooKeeperServer#startJvmPauseMonitor

registerMetrics、

8、secureCnxnFactory启动,这里不存在

9、containerManager容器管理并启动

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