ZK_04Zookeeper集群Leader选举源码剖析
2023-05-17 10:15:11 0 举报
Zookeeper集群Leader选举源码剖析
作者其他创作
大纲/内容
ManagedUtil.registerLog4jMBeans()注册 log4j JMX mbeans
父类.start找父类的run 方法,父类没没实现run,则看自己的run 时间
sid < self.getId()
接受连接
System.getProperty(ZOOKEEPER_SERVER_CNXN_FACTORY)
sw.start()启动选票发送器线程
选举端口监听接受选举使用普通socket(BIO)
QuorumCnxManager.Listener是个Thread类
wsThread.start()运行发送选票线程
while (running)死循环
NettyServerCnxnFactory.start(通过Netty实现)
main.initializeAndRun(args)初始化并运行
sid > self.getId()开始接受选票线程
WorkerReceiver
manager.haveDelivered()判断堆里是否有值
makeLEStrategy().lookForLeader()
集群
config.parse(args[0])解析配置文件
recvQueue.add(msg)将收到的选票丢入recvQueue
runFromConfig(config)
quorumPeer.start()
ZOOKEEPER_SERVER_CNXN_FACTORY就是zookeeper.serverCnxnFactory因此如果使用netty 需要加启动参数-Dzookeeper.serverCnxnFactory =org.apache.zookeeper.NettyserverCnxnFactory
在接受选票的时候就给发送机选票的机器建立一个发送器线程来发选票使用并启动发送线程
(electionType)默认传值3
DatadirCleanupManager清理快照任务
messenger.start()
getPeerState()获取节点的状态,开始启动都是lookING然后则进行选票
connectOne(sid)当前中继器主动发送socket连接到发送选票id较小的机器上
logicalclock.incrementAndGet()逻辑时钟选举周期+1(原子类)
SendWorker.run()
是LOOKING构建选票
din.readLong
Listener.run
(ServerCnxnFactory) Class.forName(serverCnxnFactoryName) .getDeclaredConstructor().newInstance()反射初始化server服务工厂类
myid节点的标志idgetLastLoggedZxid()更新事务的最后一次idgetCurrentEpoch())选举周期
loadDataBase()载入配置文件中的数据
如果发送选票的机器id小于当前机器则关闭,为了防止相互重复建立socket连接(双向的),zk不允许id小的机器连接id大的机器
startLeaderElection()
FastLeaderElection.lookForLeader()
switch (getPeerState())获取节点状态
设置一个默认的选举类型3
adminServer.start()
QuorumConnectionReqThread.run
WorkerSender
ss = new ServerSocket()ss.bind(addr) client = ss.accept()
sendNotifications()如果没有收到足够的通知,则发送更多通知
QuorumPeerMain服务端启动主类
receiveConnection(client)接受连接
startServerCnxnFactory() cnxnFactory.start()
bootstrap.bind(localAddress).syncUninterruptibly().channel()绑定端口启动netty 关联channel
getInitLastLoggedZxid
启动内嵌的jetty服务,默认端口8080,用来查看服务端状态信息
setElectionType(config.getElectionAlg())
getQuorumPeer()获取服务节点对象
sendqueue.offer(notmsg)给其他参与投票的节点发送选票到发送队列
queueSendMap.get(sid)取出发送选票队列send(b)发送选票
sendNotifications()构建选票
manager.connectAll()处理新通知尝试与每台服务器建立连接
QuorumPeer.run(()
节点状态类型LOOKING(启动默认)FOLLOWINGLEADINGOBSERVING
super.start();
wrThread.start()运行接受选票线程
LOOKING选举状态
默认选举策略是3
args.length == 1 && config.isDistributed()集群还是单机
listener.start()启动选举监听
rw.start()启动选票发送器线程
RecvWorker.run()
设置配置文件参数setMyidsetInitLimit设置内存数据库(一些默认节点都是这里)setZKDatabase
sid == self.getId()这是个bug一般不可能发生
createCnxnManager()初始化选举数据管理器
ZooKeeperServerMain.main(args)
调度自动清除任务来管理快照和相应事务日志的清理。它保留最新的“autopurge.snapRetainCount”数量的快照和相应的事务日志
self.getElectionAddress().getPort()绑定的端口是配置文件里选举的端口列如127.0.0.1:2888:38883888是选举端口
closeSocket(sock)关闭连接
阅读源码思路:1.先使用;2.抓主线:画出源码主流程图,切勿一开始就陷入源码的细枝末节,否则会把自己绕晕;3.画图做笔记:总结框架的一些核心功能点,从这些功能点入手深入到源码的细节,边看源码边画源码走向图,并对关键源码的理解做笔记,把源码里的闪光点都记录下来,后续借鉴到工作项目中;4.整合总结:所有功能点的源码都分析完后,回到主流程图再梳理一遍;小提示:1.中间件的中的jmx的类的代码都可以先不用看都是监听2.分支代码不要陷入太深,if如果return了就先不看3.Secure,SSL第一遍看代码安全类的权限累的先跳过
createElectionAlgorithm(electionType)创建选举算法
单机
0 条评论
下一页