集群部署
以ZooKeeper 3.4.6为例,来看下多节点ZooKeeper集群如何进行配置部署。官方文档上也有具体的描述。
配置说明
首先,需要提供配置文件,在配置文件中指定具体配置项值。以官方文档描述为例,
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
对于Observer节点,需要增加配置,
peerType=observer
针对此种的各项配置,各参数含义为,
参数 | 说明 |
---|---|
tickTime | ZK节点通过tick来进行心跳、超时判定等时间相关逻辑 |
dataDir | ZK SNAPSHOT存放路径 |
clientPort | ZK客户端访问链接的端口 |
initLimit | Follower初始连接进行同步的时间,按tick计算 |
syncLimit | Follower允许进行同步的时间,按tick计算 |
server.x=[hostname]:nnnnn[:nnnnn] | 每个节点的连接配置,两个端口一个用于节点与Leader连接,一个用于Leader选举 |
更多的配置项,可以在这里找到。
启动实例
准备好配置文件之后,可以通过命令行进行启动,
java -cp zookeeper.jar:lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar:lib/log4j-1.2.15.jar:conf \ org.apache.zookeeper.server.quorum.QuorumPeerMain zoo.cfg
更完整的启动命令可以根据zkServer.sh去进行定制修改。
启动流程
从启动命令可以看到,ZooKeeper实例启动入口为QuorumPeerMain。
QuorumPeerMain执行过程中,首先解析配置文件构建QuorumPeerConfig实例,而后创建QuorumPeer实例。QuorumPeer为ZooKeeper实例核心逻辑实现所在。QuorumPeer首先会从数据目录恢复数据到内存中,而后开始监听配置的端口。
ZooKeeper实例状态由如下枚举例类型定义,
public enum ServerState {
LOOKING, FOLLOWING, LEADING, OBSERVING;
}
刚启动时状态为LOOKING。在LOOKING状态下会根据选举策略触发选主逻辑。ZooKeeper默认的选举策略是FastLeaderElection,其它策略不推荐使用。在选举完成之后,根据决定的角色切换到对应状态,会分别切换到LEADING、FOLLOWING、OBSERVING状态。随后会创建具体的逻辑处理类,对应不同状态,会分别创建,
节点类型 | 客户端连接处理类 |
---|---|
Leader | LeaderZooKeeperServer |
Follower | FollowerZooKeeperServer |
Observer | ObserverZooKeeperServer |
这些实现类的继承关系为,
在上述对象创建之后,不同角色分别调用各自的入口函数,
- Leader.lead()
- Follower.followLeader()
- Observer.observeLeader()
上述函数正常运行之后,ZooKeeper实例启动阶段逻辑就算完成了。