集群部署

以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

针对此种的各项配置,各参数含义为,

参数说明
tickTimeZK节点通过tick来进行心跳、超时判定等时间相关逻辑
dataDirZK SNAPSHOT存放路径
clientPortZK客户端访问链接的端口
initLimitFollower初始连接进行同步的时间,按tick计算
syncLimitFollower允许进行同步的时间,按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状态。随后会创建具体的逻辑处理类,对应不同状态,会分别创建,

节点类型客户端连接处理类
LeaderLeaderZooKeeperServer
FollowerFollowerZooKeeperServer
ObserverObserverZooKeeperServer

这些实现类的继承关系为,

在上述对象创建之后,不同角色分别调用各自的入口函数,

  • Leader.lead()
  • Follower.followLeader()
  • Observer.observeLeader()

上述函数正常运行之后,ZooKeeper实例启动阶段逻辑就算完成了。