zookeeper启动过程中,配置文件很重要,所以该篇文章会先说明配置文件,然后分析源码
配置文件分析
单机模式启动
修改配置文件conf/zoo.cfg
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
说明:
- tickTime
zookeeper客户端与zookeeper的心跳时间间隔(单位毫秒),最小的session超时时间是tickTime的两倍。 - dataDir
用来存放zookeeper内存数据库的快照,还有除非特殊指定,用来保存更新到数据库的事务日志。 - clientPort
监听客户端连接的端口
配置完成之后,可以启动zk
bin/zkServer.sh start
集群模式启动
单机模式比较容易做研究与测试。但是生产环境应该用集群模式。
集群下所有机器的配置文件都是一样的。配置文件跟单机模式类似,不过有些不一样。
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
- initLimit
follower服务器与leader服务器,初始连接时能容忍的最多心跳数 - syncLimit
follower服务器与leader服务器,请求和应答之间能容忍的最多心跳数 - server.N=zk_host:port1:port2
N:服务器编号,zk_host:zk的ip地址,port1:zk服务通信端口,port2:zk选举端口
源码分析
zk启动大致流程
大体流程如下:
1.执行zk的主类QuorumPeerMain
2.读取解析zk配置文件zoo.cfg
3.启动一个timer定时清理zk日志文件
4.初始化quorumPeer对象,并启动quorumPeer线程
PurgeTask定时器说明:
zk启动的时候会启动一个定时器,定时清理日志,通过配置 autopurge.snapRetainCount 和 autopurge.purgeInterval 这两个参数能够实现定时清理了。这两个参数都是在zoo.cfg中配置的。
# 指定清理频率,单位是小时,默认是0,表示不开启自己清理功能。
autopurge.purgeInterval=6
# 和上面的参数搭配使用,指定需要保留的文件数目,默认是保留3个。
autopurge.snapRetainCount=5
日志说明:
zookeeper主要存放了两类文件,一个是snapshot和log,前者是内存数的快照,后者类似mysql的binlog,将所有与修改数据相关的操作记录在log中,两类文件的目录可在配置文件中指定。
真正的主流程在QuorumPeer里面
该类继承了Thread,所以启动的时候会异步启动一个QuorumPeer线程。下面是QuorumPeer异步的处理步骤。
@Override
public synchronized void start() {
loadDataBase(); // 把数据从文件load到内存
cnxnFactory.start(); // 启动网络管理器
startLeaderElection(); // 开始选举
super.start();
}