zookeeper源码 — 一、单机启动
说明:zookeeper系列是基于3.6.0版本的
zookeeper一般使用命令工具启动,启动主要就是初始化所有组件,让server可以接收并处理来自client的请求。本文主要结构:
- main入口
- 配置解析
- 组件启动
main入口
我们一般使用命令行工具来部署zk server,zkServer.sh,这个脚本用来启动停止server,通过不同的参数和选项来达到不同的功能。该脚本最后会通过Java执行下面的main方法
org.apache.zookeeper.server.quorum.QuorumPeerMain#main
不管单机还是集群都是使用zkServer.sh
这个脚本来启动,只是参数不同,所以main方法入口也是一样的。所以这个入口方法主要是根据不同的入参判断是集群启动还是单机启动。
该main方法主要做了以下几件事
- 解析配置,如果传入的是配置文件(参数只有一个),解析配置文件并初始化QuorumPeerConfig
- 启动清理文件的线程
- 判断是单机还是集群
- 集群:只有一个参数,并且配置了多个server
- 单机:上面的条件不满足,一般在启动的使用了以下两种配置的一种
- 使用的是文件配置,但是没有配置多台server
- 命令行配置多个(2-4)参数:port dataDir [tickTime] [maxClientCnxns]
配置解析
配置解析主要有两种情况
- 使用配置文件
- 使用命令行参数
使用配置文件
使用配置文件的时候是使用QuorumPeerConfig
来解析配置的
- 先校验文件的合法性
- 配置文件是使用Java的properties形式写的,所以可以通过Properties.load来解析
- 将解析出来的key、value赋值给对应的配置
使用命令行参数
直接在命令指定对应的配置,这种情况只有在单机的时候才会使用,包含以下几个参数
- port,必填,sever监听的端口
- dataDir,必填,数据所在的目录
- tickTime,选填
- maxClientCnxns,选填,最多可处理的客户端连接数
组件启动
zookeeper包含的主要组件有
- FileTxnSnapLog:管理FileTxLog和FileSnap
- ZooKeeperServer:维护一个处理器链表processor chain
- NIOServerCnxnFactory:管理来自客户端的连接
- Jetty,用来通过http管理zk
zookeeper维护了自己的数据结构和物理文件,而且要接收并处理client发送来的网络请求,所以在zookeeper启动的时候,要做好下面的准备工作
- 初始化FileTxnSnapLog,创建了FileTxnLog实例和FIleSnap实例,并保存刚启动时候DataTree的snapshot
- 启动adminServer
- 启动NIOServerCnxnFactory
- 从解析出的配置中配置NIOServerCnxnFactory
- 初始化网络连接管理类:NIOServerCnxnFactory
- 初始化:WorkerService:用来业务处理的线程池
- 线程启动:
SelectorThread(有多个):处理网络请求,write和read
AcceptThread:用来接收连接请求,建立连接,zk也支持使用reactor多线程,accept线程用来建立连接,selector线程用来处理read、write
ConnectionExpirerThread:关闭超时的连接,所有的session都放在org.apache.zookeeper.server.ExpiryQueue#expiryMap
里面维护,这个线程不断从里面拿出超时的连接关闭
- 启动ZookeeperServer,主要是用来创建SessionTrackerImpl,这个类是用来管理session的
总结
单机模式部署较为简单,一般在开发、测试环境使用,由于单机环境需要的组件少,启动过程也较为简单,主要是解析传入的参数,然后启动对应的网络组件和请求处理组件,后面紧接着我们看下zk的集群启动流程。