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启动大致流程

brew service zookeeper 配置文件在哪 zookeeper指定配置文件启动_配置文件

大体流程如下:
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();
    }