说明:zookeeper系列是基于3.6.0版本的
zookeeper通常使用命令工具启动,启动主要就是初始化全部组件,让server能够接收并处理来自client的请求。本文主要结构:java
main入口
咱们通常使用命令行工具来部署zk server,zkServer.sh,这个脚本用来启动中止server,经过不一样的参数和选项来达到不一样的功能。该脚本最后会经过Java执行下面的main方法react
org.apache.zookeeper.server.quorum.QuorumPeerMain#main
无论单机仍是集群都是使用zkServer.sh
这个脚原本启动,只是参数不一样,因此main方法入口也是同样的。因此这个入口方法主要是根据不一样的入参判断是集群启动仍是单机启动。apache
该main方法主要作了如下几件事网络

- 解析配置,若是传入的是配置文件(参数只有一个),解析配置文件并初始化QuorumPeerConfig
- 启动清理文件的线程
- 判断是单机仍是集群
- 集群:只有一个参数,而且配置了多个server
- 单机:上面的条件不知足,通常在启动的使用了如下两种配置的一种
- 使用的是文件配置,可是没有配置多台server
- 命令行配置多个(2-4)参数:port dataDir [tickTime] [maxClientCnxns]
配置解析
配置解析主要有两种状况session
- 使用配置文件
- 使用命令行参数
使用配置文件
使用配置文件的时候是使用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的集群启动流程。命令行