zookeeper源码分析:选举流程和请求处理
2024-09-03 07:07:57
集群启动:
- QuorumPeerMain. runFromConfig()
- quorumPeer.start();
- loadDataBase();
- cnxnFactory.start(); //网络通信交互
- startLeaderElection();//启动选举类
- super.start();
- quorumPeer.run()
- case LOOKING:
- new ReadOnlyZooKeeperServer() //选举期间启用只读服务器,
- FastLeaderElection.start() //设置启动投票的后台线程
- setCurrentVote(makeLEStrategy().lookForLeader()); while循环
- case LEADING: new LeaderZooKeeperServer().lead();
- case LOOKING:
case LOOKING:快速选举
- FastLeaderElection.start()
- sendqueue = new LinkedBlockingQueue<ToSend>();//发出的投票队列
- recvqueue = new LinkedBlockingQueue<Notification>();//收到的投票对列
- this.messenger = new Messenger(manager);//投票消息后台服务线程
- new WorkerSender(manager); //开启投票的发送线程
- new WorkerReceiver(manager);//开启投票的接收线程
- FastLeaderElection.lookForLeader():
- sendNotifications
- 比较epoch
- totalOrderPredicate//对两个投票进行比较,规则是:选举期数 > zxid > serverid
- recvset.put(n.sid, new Vote(n.leader, n.zxid, n.electionEpoch, n.peerEpoch));/收集选票
- termPredicate//判断是否已经选出leader
- case LEADING: termPredicate
- ReadOnlyZooKeeperServer.startup()
- Zookeeper.startup
- createSessionTracker();//session管理类
- setupRequestProcessors();//子类重写的方法,设置request处理责任链
case LEADING:
请求处理
- NIOServerCnxnFactory.start()
- setupRequestProcessors
- PrepRequestProcessor
- ProposalRequestProcessor
- CommitProcessor
- ToBeAppliedRequestProcessor
- FinalRequestProcessor
- ProposalRequestProcessor.run()
- LearnerHandler.run();//leader初始化的时候,每accept一个connection,就会生成一个follower专门的LearnerHandler用于处理事务
- CommitProcessor.processRequest(request);// LinkedList queuedRequests,是已经发出的提议,要等待收到过半服务器ack的请求队列
- Leader.propose(request);//向所有的folllower发送提案
- Leader.processAck(this.sid, qp.getZxid(), sock.getLocalSocketAddress());
- p.ackSet.add(sid); //对于一个特定的提案,每个follower反馈的ACK信息
- if (self.getQuorumVerifier().containsQuorum(p.ackSet)){ //超过半数
toBeApplied.add(p);//用于 ToBeAppliedRequestProcessor处理
commit(zxid);//提交给集群中所有成员
zk.commitProcessor.commit(p.request);//提交给commitProcessor处理,LinkedList committedRequests,是已经收到过半服务器ack的请求队列,以为着该请求可以被提交了。
}
4. CommitProcessor.run();//匹配queuedRequests和committedRequests中的请求,并交给nextProcessor处理。
5. ToBeAppliedRequestProcessor.processRequest(request);//交给nextProcessor处理,如果toBeApplied中的第一个元素与request的zxid相等,则可以移除toBeApplied队首元素
最新文章
- BZOJ1298[SCOI2009]骰子的学问
- 转:Android开发:使用JNI读取应用签名
- 酷狗 KRC 文件的解析
- Loadrunner在场景中添加多个负载机报错:Action.c(38): Error -26488: Could not obtain information about submitted解决方法
- C语言语法之运算符及优先级
- iOS8中添加的extensions总结(四)——Action扩展
- SqlCommandBuilder类是如何构建T-Sql语句
- 使用cmd命令打开Python文件式程序方法
- Java微信公众平台开发_02_启用服务器配置
- Linux下创建软链接
- 作为一个零基础的新手,如何系统的自学Java和JavaEE开发技术?
- Counting Sort(Java)
- VC++ 字符串Dword、LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR
- 阿里云搭建JAVA WEB环境(SQL Server + TomCat + 配置域名)
- CodeChef - AMLEX-Poetic word
- Find the peace with yourself
- pycharm使用技巧 + 调试程序-12
- cudnn 安装步骤
- Google 翻译(中英,英中)
- SFML从入门到放弃(3) 视角和碰撞检测