前面已经介绍过Zookeeper的基础知识以及ZAB协议的一些概念,其中ZAB协议中关键性的发现步骤,也就是Leader选举机制是如何完成的,在这里简单介绍一下。
关于各个节点的角色,在之前ZAB协议中已经介绍,这里不过多介绍。
sid: ServerID表明为被推举的Leader的唯一标识,等同于MyId。
zxid: 表明被推举的Leader事务ID,也就是服务提供期间内,执行数据更新事务操作的自增ID。
electionEpoch: 逻辑时钟,表明为一次选举的周期的id,每次新的选举该值自增+1,用来判断选举投票是否为同一选举轮次。
peerEpoch: 被推举Leader节点的选举轮次Epoch。
state: 当前服务节点的状态
每台机器在启动时,都会创建一个QuorumCnxManager来负责管理节点之间的选举投票通信。
QuorumCnxManager内部维护了一系列队列用来管理待发送的消息和收到的消息以及消息的发送器,并且负责管理与其他所有节点通信连接(socket)。
QuorumCnxManager维护的队列与集合:
1、消息发送队列(queueSendMap):为其他所有节点分别维护一个消息发送队列,队列之间互不影响。
2、消息接受队列(recvQueue):一个统一的消息接收队列,负责保存接收到的消息。
3、发送器集合(senderWorkerMap): 为其他节点分配一个消息发送器,负责消息的发送。
4、最后一条发送的消息 (lastMessageSent):存储最近发送的一条消息,如果发送队列为空,则取出该消息再次发送。
QuorumCnxManager管理通信连接:
为了节点之间能够互相进行选举的通信,所以所有节点之间都要两两建立连接,QuorumCnxManager创建一个ServerSocket监听3888通信端口(选举通信端口),然后持续接收其他节点的连接建立请求。
为避免连接重复建立,zk中规定只有sid较大的向sid较小的创建连接请求,当收到连接请求时,判断sid比自身小,则断开本次连接,然后自己主动发起连接建立请求。一旦连接建立,就会根据远程服务器的SID来创建相应的消息发送器SendWorker和消息接收器RecvWorker,并启动他们。
QuorumCnxManager消息发送器和消息接收器:
由于创建连接时为每个远程服务器分别创建了SendWorker和RecvWorker,所以对于消息的接收,直接由RecvWorker从TCP连接中取出放入消息接收队列recvQueue即可。
对于消息的发送,只要不断的从该远程服务器的消息发送队列queueSendMap中取出一条消息发送即可,如果发送队列为空,则获取最后一次发送的信息再次发送,这里为了防止远程服务器接收消息前或接收消息后服务器挂掉后导致消息没有处理。Zookeeper能够保证接收方在处理消息时,会对重复消息进行正确的处理。
首先要确定的是,Leader选举是什么时候发起的?
首先在ZK集群启动时还没有Leader节点出现,此时触发Leader选举。
其次在集群对外提供服务期间,如果Leader节点发生宕机或者出现网络分区,无法与其他节点进行通信,那么此时触发新一轮Leader选举。
根据上面提到的选举触发时机,结合下图从实例中了解选举过程。
如上图所示,集群一共三个节点,在服务器初始化阶段,所有节点的zxid都为0(因为还没有处理过客户端事务请求),此时节点状态为LOOKING状态发生了Leader选举阶段。
也就是当出现Leader节点无法与其他节点通信的时候,此时触发新一轮的Leader选举,此时选举轮次Epoch+1,然后按照初始化流程的选举步骤一样,发起Leader选举。
与初始化选举不同的是,此时由于已经对外提供了一段时间服务,所以首先将自己的服务器状态变更为LOOKING,然后由于各个节点的Zxid不同,按照 优先选举ZXID最大的,如果相同选举SID最大的 规则进行选举。
在一个新节点加入集群时,分为两种情况,一种是当前Leader已经选出,另一种是当前Leader还未选举。
vote_sid:接收到的投票中所推举Leader服务器的SID。
vote_zxid:接收到的投票中所推举Leader服务器的ZXID。
self_sid:当前服务器自己的SID。
self_zxid:当前服务器自己的ZXID。
通过上面四个属性,可以满足如下四个规则:
之前已经介绍过QuorumCnxManager如何处理选票的通信,这里不过多介绍。 首先明确选举算法最重要的四个概念:
FastLeaderElection算法核心流程:
整个算法流程分为10个步骤:
通过如上的介绍,已经比较清晰了解了ZK的选举机制与选举算法的实现流程,比较简单的总结就是 谁Zxid大选谁,zxid相同谁服务器编号大选谁。
本文参考:
从Paxos到Zookeeper分布式一致性原理与实践。