目录
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连接