一、Zookeeper 服务器分类
zk 主要分为 Follower(需要 FollowerZooKeeperServer)、Observer(需要 ObserverZooKeeperServer)、Leader(LeaderZooKeeperServer)。需要明确一点的是,无论是什么角色,它跟前面我们所说的单机版的 Server 端的逻辑差不多。下面先分 Server 然后分角色介绍。
二、各 Server 介绍
看一个整体的类图关系便可明了:
![](https://img.haomeiwen.com/i11345146/8e5b2011419e7351.png)
貌似 FollowerZooKeeperServer、ObserverZooKeeperServer、LeaderZooKeeperServer 只是替换了 Zookeeper 的 processor,其他的基本没太大变化。
三、各角色介绍
1、Leader
Leader 继承自 LearnerMaster。LearnerMaster 使用了 LearnerSyncThrottler,LearnerSyncThrottler 用于限制从领导者到观察者和关注者或从跟随者到观察者的并发同步数。 LearnerHandler对象应在发送同步之前调用beginSync(boolean),并在成功完成或失败之后调用endSync()。
当整个 leader 选举结束时,leader 调用 lead() 开始领导的时候,会有一系列的设置选举时间、选举结束时间、加载数据库等操作,随后创建线程等待 follower 连接。线程类为 LearnerCnxAcceptor,它会根据 slave 的数量创建 LearnerCnxAcceptorHandler 处理,每个 LearnerCnxAcceptorHandler 会 创建 LearnerHandler 来处理真正请求进来的 InputStream。
在 lead() 方法中会进行一个很长的逻辑处理(太长了,有的没看懂),最后会遍历每个 learner(follower 或 observer)发送 ping 心跳。
leader 针对每个 learner 都会创建👆说过的 LearnerHandler,所有与 learner 的通信都在这个类中进行处理。这个类的逻辑也特喵的长,按照注释来说,就是接收并处理每一个节点的连接,并且监听新的连接。
2、Follower
Follower/Observer 都继承自 Learner,Learner 是他们的父类,定义了一些共同的行为。这里我们只以 Follower 为例,Observer 同理。
节点选举结束后成为 follower 后,会调用 followLeader() 方法,然后就会开始连接 leader。此时会创建 LeaderConnector 来连接 leader,它会创建 LearnerSender 发送数据,连接成功后就可以与 leader 同步数据(follower 在 while 循环中)。
网友评论