Zookeeper选举Leader源码剖析(一)

目录

 1.源码下载

 2.启动ledaer选举流程


1.启动或leader宕机选举流程

2.客户端与服务端交互流程(NIO或Netty)

3.写入数据的ZAB一致性协议(如何保证消息的顺序性)

4. Watch监听触发机制

 1.源码下载

 https://github.com/apache/zookeeper.git

 从代码切入,从zkServer.sh文件切入 

 

 指定程序参数,启动QuorumPeerMain.java的main函数

 

 第二种启动方式

ZooKeeperMain,加入以下启动参数

 

搭建zookeeper集群,正常打开会提示每一台哪台是leader,哪台是flower

 

 2.启动ledaer选举流程

1. 第一台机器投自己一票发给其他机器,其他机器也会给自己投一票发给其他机器,看哪台zxid大,但第一轮投票选举zxid都是0,所以继续比较myid哪个大,第一轮都投的myid=2的大,优胜者进入下一轮选举

2.myid=1和myid=2的都投的myid为2的机器,确定(2,0)为优胜者

 

 源码入口

  解析配置文件到内存,清理快照文件任务,核心启动流程runFromConfig方法。

默认使用NIO加载配置,也可以使用如下图所示用netty启动

 初始化Qrorum参数,内部使用node对象生成

启动

 

 

 加载netty参数

 

默认 启动jetty,端口8080,运维使用

 

 启动leader选举

 默认server状态:looking

 

 

 看最后的选举算法

 默认跳过,看3的选举算法

 

启动一个选举端口用于监听选票信息 

 

 

发选票的两个线程

 

 

 上面都是一些线程监听的方法,super.start才是真正选举的方法。

 核心选举逻辑:

        1.开始状态:Looking

 

核心选举策略:fastLeaderElection 

 

 更新选票消息,发送消息,在debug时可能跟到sendqueue.offer方法就没了,我们要知道上面还有一个poll方法拿队列里的消息。 

 

 

 

 manager.connectAll:建立socket连接

 

 

猜你喜欢

转载自blog.csdn.net/qq_21575929/article/details/125940403
今日推荐