ZooKeeper 源码分析
连接建立和会话管理
ZooKeeper的连接与会话就是客户端通过实例化ZooKeeper对象来实现客户端与服务器创建并保持TCP连接的过程。
Watcher
数据存储
Leader 选举
选举相关概念
- 服务器 ID
编号越大在选择算法中的权重越大。比如有三台服务器,编号分别是 1、2、3,其中 3 的那台权重最大。 - 数据 ID
服务器中存放的最大数据 ID。值越大说明数据越新,在选举算法中数据越新权重越大。 - 逻辑时钟
或者叫投票的次数,同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加,然后与接收到的其它服务器返回的投票信息中的数值相比,根据不同的值做出不同的判断。 - 选举状态
LOOKING,竞选状态。
FOLLOWING,随从状态,同步 leader 状态,参与投票。
OBSERVING,观察状态,同步 leader 状态,不参与投票。
LEADING,领导者状态。
zk 集群选举概述
配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点和 redis 是相同的,即对客户端来讲每个服务器都是平等的。
zookeeper 提供了三种集群选举方式:
- LeaderElection
- AuthFastLeaderElection
- FastLeaderElection
默认的算法是 FastLeaderElection,所以这里主要分析它的选举机制。
QuorumPeer
主要看这个类,只有 LOOKING 状态才会去执行选举算法。每个服务器在启动时都会选择自己做为领导,然后将投票信息发送出去,循环一直到选举出领导为止。
1 | public void run() { |
FastLeaderElection
它是 zookeeper 默认提供的选举算法,核心方法如下。可以与本文上面的流程图对照。
1 | public Vote lookForLeader() throws InterruptedException { |
- 判断是否已经胜出
默认是采用投票数大于半数则胜出的逻辑。
选举消息内容
在投票完成后,需要将投票信息发送给集群中的所有服务器,它包含如下内容。
- 服务器 ID
- 数据 ID
- 逻辑时钟
- 选举状态
选举流程简述
目前有 5 台服务器,每台服务器均没有数据,它们的编号分别是 1,2,3,4,5,按编号依次启动,它们的选择举过程如下:
- 服务器 1 启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器 1 的状态一直属于 Looking。
- 服务器 2 启动,给自己投票,同时与之前启动的服务器 1 交换结果,由于服务器 2 的编号大所以服务器 2 胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是 LOOKING。
- 服务器 3 启动,给自己投票,同时与之前启动的服务器 1,2 交换信息,由于服务器 3 的编号最大所以服务器 3 胜出,此时投票数正好大于半数,所以服务器 3 成为领导者,服务器 1,2 成为小弟。
- 服务器 4 启动,给自己投票,同时与之前启动的服务器 1,2,3 交换信息,尽管服务器 4 的编号大,但之前服务器 3 已经胜出,所以服务器 4 只能成为小弟。
- 服务器 5 启动,后面的逻辑同服务器 4 成为小弟。
选举流程
描述 Leader 选择过程中的状态变化,这是假设全部实例中均没有数据,假设服务器启动顺序分别为:A,B,C。
如果规模为 5 的集群只起来其中的 3 台服务器,这时会进行选举吗
不会,ZooKeeper 更倾向于保持一致性,如果配置中的部分服务器不可用,那么整个集群都是不可用的。
参考
ZooKeeper 服务器的启动流程
- 【分布式】Zookeeper 服务端启动
- 【分布式】Zookeeper 的服务器角色
- 【Zookeeper】源码分析之服务器(一)
- 【Zookeeper】源码分析之服务器(二)之 ZooKeeperServer
- 【Zookeeper】源码分析之服务器(三)之 LeaderZooKeeperServer
- 【Zookeeper】源码分析之服务器(四)之 FollowerZooKeeperServer
- 【Zookeeper】源码分析之服务器(五)之 ObserverZooKeeperServer
ZooKeeper 客户端
Watcher
- zookeeper 中 Watcher 通知机制的一点理解
- 【Zookeeper】源码分析之 Watcher 机制(一)
- 【Zookeeper】源码分析之 Watcher 机制(二)之 WatchManager
- 【Zookeeper】源码分析之 Watcher 机制(三)之 ZooKeeper
Leader 选举
- 【分布式】Zookeeper 的 Leader 选举
- 【Zookeeper】源码分析之 Leader 选举(一)
- 【Zookeeper】源码分析之 Leader 选举(二)之 FastLeaderElection
持久化
- 【分布式】Zookeeper 数据与存储
- 【Zookeeper】源码分析之持久化(一)之 FileTxnLog
- 【Zookeeper】源码分析之持久化(二)之 FileSnap
- 【Zookeeper】源码分析之持久化(三)之 FileTxnSnapLog
通信(通信协议、序列化、会话、请求处理)
- 【分布式】Zookeeper 序列化及通信协议
- 【Zookeeper】源码分析之序列化
- 【分布式】Zookeeper 会话
- 【分布式】Zookeeper 请求处理
- 【Zookeeper】源码分析之请求处理链(一)
- 【Zookeeper】源码分析之请求处理链(二)之 PrepRequestProcessor
- 【Zookeeper】源码分析之请求处理链(三)之 SyncRequestProcessor
- 【Zookeeper】源码分析之请求处理链(四)之 FinalRequestProcessor
- 【Zookeeper】源码分析之网络通信(一)
- 【Zookeeper】源码分析之网络通信(二)之 NIOServerCnxn
- 【Zookeeper】源码分析之网络通信(三)之 NettyServerCnxn