集群启动:

  1. QuorumPeerMain. runFromConfig()
  2. quorumPeer.start();
    • loadDataBase();
    • cnxnFactory.start();          //网络通信交互
    • startLeaderElection();//启动选举类
    • super.start();
  3. quorumPeer.run()
    • case LOOKING:   

      • new ReadOnlyZooKeeperServer()   //选举期间启用只读服务器,
      • FastLeaderElection.start()  //设置启动投票的后台线程
      • setCurrentVote(makeLEStrategy().lookForLeader()); while循环
    • case LEADING:        new LeaderZooKeeperServer().lead();

case LOOKING:快速选举

  1. FastLeaderElection.start()

    • sendqueue = new LinkedBlockingQueue<ToSend>();//发出的投票队列
    • recvqueue = new LinkedBlockingQueue<Notification>();//收到的投票对列
    • this.messenger = new Messenger(manager);//投票消息后台服务线程
      • new WorkerSender(manager); //开启投票的发送线程
      • new WorkerReceiver(manager);//开启投票的接收线程
  2. FastLeaderElection.lookForLeader():
    • sendNotifications
    • 比较epoch
    • totalOrderPredicate//对两个投票进行比较,规则是:选举期数 > zxid > serverid
    • recvset.put(n.sid, new Vote(n.leader, n.zxid, n.electionEpoch, n.peerEpoch));/收集选票
    • termPredicate//判断是否已经选出leader
  3. case LEADING: termPredicate
  4. ReadOnlyZooKeeperServer.startup()
    • Zookeeper.startup
    • createSessionTracker();//session管理类
    • setupRequestProcessors();//子类重写的方法,设置request处理责任链

case LEADING:

请求处理

  1. NIOServerCnxnFactory.start()
  2. setupRequestProcessors
    1. PrepRequestProcessor
    2. ProposalRequestProcessor
    3. CommitProcessor
    4. ToBeAppliedRequestProcessor
    5. FinalRequestProcessor
  3. ProposalRequestProcessor.run()
    1. LearnerHandler.run();//leader初始化的时候,每accept一个connection,就会生成一个follower专门的LearnerHandler用于处理事务
    2. CommitProcessor.processRequest(request);// LinkedList queuedRequests,是已经发出的提议,要等待收到过半服务器ack的请求队列
    3. Leader.propose(request);//向所有的folllower发送提案
    4. Leader.processAck(this.sid, qp.getZxid(), sock.getLocalSocketAddress());
    5. p.ackSet.add(sid); //对于一个特定的提案,每个follower反馈的ACK信息
    6. 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队首元素

最新文章

  1. BZOJ1298[SCOI2009]骰子的学问
  2. 转:Android开发:使用JNI读取应用签名
  3. 酷狗 KRC 文件的解析
  4. Loadrunner在场景中添加多个负载机报错:Action.c(38): Error -26488: Could not obtain information about submitted解决方法
  5. C语言语法之运算符及优先级
  6. iOS8中添加的extensions总结(四)——Action扩展
  7. SqlCommandBuilder类是如何构建T-Sql语句
  8. 使用cmd命令打开Python文件式程序方法
  9. Java微信公众平台开发_02_启用服务器配置
  10. Linux下创建软链接
  11. 作为一个零基础的新手,如何系统的自学Java和JavaEE开发技术?
  12. Counting Sort(Java)
  13. VC++ 字符串Dword、LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR
  14. 阿里云搭建JAVA WEB环境(SQL Server + TomCat + 配置域名)
  15. CodeChef - AMLEX-Poetic word
  16. Find the peace with yourself
  17. pycharm使用技巧 + 调试程序-12
  18. cudnn 安装步骤
  19. Google 翻译(中英,英中)
  20. SFML从入门到放弃(3) 视角和碰撞检测

热门文章

  1. harbor私有仓库
  2. Vue基础组件
  3. zencart目录结构
  4. kotlin面向对象之抽象类、继承、多态
  5. crt0.o
  6. Redis的部署使用文档
  7. vue的组件创建和使用
  8. 《python cookbook》学习笔记
  9. qq在线咨询
  10. TTTTTTTTTTTTT 树的直径 Codeforces Beta Round #14 (Div. 2) D. Two Paths