加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

zk集群运行过程中,服务器选举的源码剖析

发布时间:2018-12-18 06:35:16 所属栏目:业界 来源:猿人课堂
导读:在zk处事器集群启动进程中,经QuorumPeerMain中,不仅会建设ZooKeeperServer工具,同时会天生QuorumPeer工具,代表了ZooKeeper集群中的一台呆板。在整个呆板运行时代,认真维护该呆板的运行状态,同时会按照环境提倡Leader推举。下图是 《从PAXOS到ZOOKEEP
副问题[/!--empirenews.page--]

在zk处事器集群启动进程中,经QuorumPeerMain中,不仅会建设ZooKeeperServer工具,同时会天生QuorumPeer工具,代表了ZooKeeper集群中的一台呆板。在整个呆板运行时代,认真维护该呆板的运行状态,同时会按照环境提倡Leader推举。下图是 《从PAXOS到ZOOKEEPER漫衍式同等性道理与实践》的处事器启动流程。

QuorumPeer是一个独立的线程,维护着zk呆板的状态。

  1. @Overridepublic synchronized void start() { 
  2.     loadDataBase(); 
  3.     cnxnFactory.start();         
  4.     startLeaderElection();    super.start(); 

本次首要先容的是推举相干的内容,至于其他操纵可以看其他博客。之后的行文都是从startLeaderElection中衍生出来的。

zk集群运行进程中,处事器推举的源码分解

zk集群运行进程中,处事器推举的源码分解

根基观念:

SID:处事器ID,用来标示ZooKeeper集群中的呆板,每台呆板不能一再,和myid的值一向

ZXID:事宜IDVote: 选票,详细的数据布局后头有

Quorum:过半呆板数

推举轮次:logicalclock,zk处事器Leader推举的轮次

处事器范例:

在zk中,引入了Leader、Follwer和Observer三种脚色。zk集群中的全部呆板通过一个Leader推举进程来选定一台被称为Leader的呆板,Leader处事器为客户端提供读和写处事。Follower和Observer都可以或许提供读处事,独一的区别在于,Observer呆板不参加Leader推举进程,也不参加写操纵的过半写乐成计策。因此,Observer存在的意义是:在不影响写机能的环境下晋升集群的读机能。

处事器状态:

+ LOOKING:Leader推举阶段+ FOLLOWING:Follower处事器和Leader保持同步状态+ LEADING:Leader处事器作为主历程率领状态。+ OBSERVING:调查者状态,表白当前处事器是Observer,不参加投票

推举的目标就是选择出吻合的Leader呆板,由Leader呆板抉择事宜性的Proposal处理赏罚进程,实现类两阶段提交协议(详细是ZAB协议)

QuorumPeer维护集群呆板状态

QuorumPeer的职责就是不绝地检测当前的zk呆板的状态,执行对应的逻辑,简朴来说,就是按照处事所处的差异状态执行差异的逻辑。删除了一部门逻辑后,代码如下:

  1. @Overridepublic void run() {     
  2. setName("QuorumPeer" + "[myid=" + getId() + "]" + 
  3.             cnxnFactory.getLocalAddress());      
  4. try {         
  5. while (running) {             
  6. switch (getPeerState()) {             
  7. case LOOKING:                
  8. LOG.info("LOOKING");                 
  9. try {                     
  10.     setBCVote(null);                           setCurrentVote(makeLEStrategy().lookForLeader()); 
  11.                 }  
  12. catch (Exception e) {                     
  13. LOG.warn("Unexpected exception", e);                   setPeerState(ServerState.LOOKING); 
  14.           }                 
  15.                 break;             
  16. case OBSERVING:                 
  17. try {                     
  18. LOG.info("OBSERVING");                    setObserver(makeObserver(logFactory));                    observer.observeLeader(); 
  19.                 } catch (Exception e) {                    LOG.warn("Unexpected exception",e );                         
  20.                 } finally {                     
  21. observer.shutdown();                     
  22. setObserver(null);                     
  23. setPeerState(ServerState.LOOKING); 
  24.                 }                 
  25. break;             
  26. case FOLLOWING:                 
  27. try {                     
  28. LOG.info("FOLLOWING");                    setFollower(makeFollower(logFactory));                    follower.followLeader(); 
  29.  } catch (Exception e) {                     
  30. LOG.warn("Unexpected exception",e); 
  31.                 } finally {                     
  32. follower.shutdown();                     
  33. setFollower(null);                     
  34. setPeerState(ServerState.LOOKING); 
  35.                 }                 
  36. break;             
  37. case LEADING:                 
  38. LOG.info("LEADING");                 
  39. try {                     
  40. setLeader(makeLeader(logFactory));                     
  41. leader.lead();                     
  42. setLeader(null); 
  43.                 } catch (Exception e) {                    LOG.warn("Unexpected exception",e); 
  44.                 } finally {                     
  45. if (leader != null) {                         
  46. leader.shutdown("Forcing shutdown");                        setLeader(null); 
  47.                     }                     
  48. setPeerState(ServerState.LOOKING); 
  49.                 }            
  50. break; 
  51.             } 
  52.         } 
  53.     } finally {         
  54. LOG.warn("QuorumPeer main thread exited"); 
  55.     } 

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读