一. 前言
出于对集群选举流程的好奇 , 所以把 Zookeeper 源码拉下来跑了一下 , 这篇文档对这个过程做一个简单的记录.
要想看懂任何源码 , 第一步就是要跑起来 . 这一篇主要介绍 , 如果快速的跑源码 ,同时简单介绍其中的关键点 , 便于处理
二 . 源码的运行
2.1 主启动流程
// Step 1 : Git 拉取
https://github.com/apache/zookeeper.git
// Step 2 : 本地运行 (Intellij)
1. 找到 zookeeper-server 子模块
2. 找到 对应的启动类
3. 通过命令启动项目
// PS : 这里查看了 Zookeeper 运行包 (ZkServer.cmd)的内容 , 决定先采用相同的方式启动 >>>>
setlocal
call "%~dp0zkEnv.cmd"
set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
echo on
call %JAVA% "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*
endlocal
复制代码
2.2 其他启动类
进入源码可以看到很多其他的启动类 , 这里查阅了一下 API Doc , 大概了解了一下
2.3 源码的主要逻辑
源码的主要入口类为 QuorumPeerMain , 而其他的类会由 QuorumPeerMain 发起调用 (例如 : ) , 这里提供一个简单的调用流程图 >>>
二 . 启动流程
来简单看一下 QuorumPeerMain 启动时做了什么 :
3.1 QuorumPeerMain 简介
当使用该类的main()方法启动程序时,第一个参数被用作配置文件的路径 , 配置文件中可以包含如下信息 :
- dataDir : ZooKeeper数据所在目录。
- dataLogDir : ZooKeeper事务日志存放目录。
- clientPort : 用于与客户端通信的端口。
- tickTime : 一个滴答的持续时间,单位为毫秒。这是ZooKeeper中的基本时间单位。
- initLimit : 跟踪者等待与leader初始同步的最大节拍数。
- syncLimit : 跟踪者等待来自leader的消息(包括心跳)的最大节拍数。
- server.id : 这是具有给定id的服务器将用于仲裁协议的主机:port[:port]。
# 以下是我的配置
tickTime=2000
initLimit=10
syncLimit=5
dataDir=D:\\java\\workspace\\git\\zookee