加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

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

发布时间:2018-12-18 07:52:50 所属栏目:外闻 来源:猿人课堂
导读:副标题#e# 在zk服务器集群启动过程中,经QuorumPeerMain中,不光会创建ZooKeeperServer对象,同时会生成QuorumPeer对象,代表了ZooKeeper集群中的一台机器。在整个机器运行期间,负责维护该机器的运行状态,同时会根据情况发起Leader选举。下图是 《从PAXOS

在集群启动的过程中,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集群运行过程中,服务器选举的源码剖析

(编辑:源码网)

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

热点阅读