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

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

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

在集群启动的进程中,QuorumPeer会按照设置实现差异的推举计策this.electionAlg = createElectionAlgorithm(electionType);

  1. protected Election createElectionAlgorithm(int electionAlgorithm){ 
  2.     Election le=null;    switch (electionAlgorithm) {    case 3: 
  3.         QuorumCnxManager qcm = new QuorumCnxManager(this); 
  4.         QuorumCnxManager.Listener listener = qcm.listener;        if(listener != null){ 
  5.             listener.start(); 
  6.             le = new FastLeaderElection(this, qcm); 
  7.         } else { 
  8.             LOG.error("Null listener when initializing cnx manager"); 
  9.         }        break;    default:        assert false; 
  10.     }    return le; 

假如ClientCnxn是zk客户端中处理赏罚IO哀求的打点器,QuorumCnxManager是zk集群间认真推举进程中收集IO的打点器,在每台处事器启动的时辰,城市启动一个QuorumCnxManager,用来维持各台处事器之间的收集通讯。

对付每一台zk呆板,都必要成立一个TCP的端口监听,在QuorumCnxManager中交给Listener来处理赏罚,行使的是Socket的阻塞式IO(默认监听的端口是3888,是在config文件内里配置的)。在两两彼此毗连的进程中,为了停止两台呆板之间一再地建设TCP毗连,zk拟定了毗连的法则:只应承SID打的处事器主动和其他处事器成立毗连。实现的方法也较量简朴,在receiveConnection中,处事器会比拟与本身成立毗连的处事器的SID,判定是否接管哀求,假如本身的SID更大,那么会断开毗连,然后本身主动去和长途处事器成立毗连。这段逻辑是由Listener来做的,且Listener独立线程,receivedConnection,成立毗连后的表示图:

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

QuorumCnxManager是毗连的管家,详细的TCP毗连交给了Listener,可是对付选票的打点,内部还维护了一系列的行列:

  • recvQueue:动静吸取行列,,用来存放那些从其他处事器吸取到的动静,单独的行列
  • 分组行列(quorumCnxManager中将zk集群中的每台呆板凭证SID单独分组形成行列荟萃):

queueSendMap:动静发送行列,用于生涯待发送的动静。new ConcurrentHashMap

senderWorderMap:发送器荟萃。每个SendWorder动静发送器,都对应一台长途zk处事器,认真动静的发放。

lastMessageSent:最近发送过的动静,凭证SID分组

根基的通讯流程如下:

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

(编辑:河北网)

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

热点阅读