ZK@3.8源码-10-集群模式
1 调试配置
为了调试方便,先配置集群启动的调试面板。
1.1 调试面板
1.2 配置文件
配置文件内容如下:
cfg
1 |
|
2 入口
java
1 |
|
3 QuorumPeer组件
3.1 类图
从类图可以看出QuorumPeer很纯粹,就是一个Java线程,上面也分析过会在start()方法的最后调用父类的start(),最终当线程被CPU调度之后回调到当前类的run()
方法,因此先看start()方法再看run()方法。
3.2 start()方法
首先,集群是单机的集合,因此之前看过的那些组件核心作用还是不会变的,这是相同点。
不同点在于:
- 集群如何选主对外提供服务
- 集群间数据如何同步
- 集群Master崩溃了如何恢复
其实也就是ZAB协议是如何实现的:
- 崩溃恢复
- 原子广播
java
1 |
|
带着这些问题重点关注集群启动过程。
从代码可以看出:
- 集群模式中核心类是QuorumPeer,不再是ZooKeeperServer
- 依然要先加载恢复内存数据
- 额外多了一些校验
- epoch是配合集群Master角色出现的机制
- 对外客户端提供服务都是走网络,因此要前置化启动网络通信,网络通信组件依然以Netty的实现NettyServerCnxn为例,这儿监听的是2181对外暴露的端口,不是给内部节点使用的
- 选主
这些组件的使用几乎与之前分析过的一样,不一样的地方也可以直接跳过,不是重点,下面开始跟进startLeaderElection()
方法。
3.3 startLeaderElection()方法
java
1 |
|
java
1 |
|
这个地方出现了3个组件:
- QuorumCnxManager
- 核心组件
- 负责整个选主过程的网络通信
- Listener
- 是Thread的派生,本质是个线程
- 在run()方法中负责监听投票端口
- FastLeaderElection
- 选主算法
- 启动开始进行投票选主
- 上面Listener组件已经监听等待Socket的连接和发送,这边负责启动Socket的连接和发送
3.4 run()方法
先只关注集群启动时候,当前服务器还是LOOKING状态,触发上面组件FastLeaderElection
进行选主。
java
1 |
|
ZK@3.8源码-10-集群模式
https://bannirui.github.io/2023/03/08/ZK-3-8源码-10-集群模式/