Zookeeper集群的选举机制

      ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    在Zookeeper集群中节点的角色分为三种,分别为:Leader,Follower,Observer.

Leader服务器是Zookeeper集群工作的核心,主要作用是:

 1:事务请求的唯一调度和处理者,保证集群事务处理的顺序性;

 2:集群内部各个服务器的调度者

Follower服务器是Zookeeper集群的跟随者,主要作用是:

1:处理客户端的非事务请求(读的请求),转发事务请求给Leader服务器;

2:参与事务请求Proposal的投票;

3:参与Leader选举的投票。

Observer是集群中的观察者,主要作用是:

1:观察Zookeeper集群的最新状态变化并且将这些状态同步过来,对其非事务请求可以进行独立处理,对于事务请求,则会转发给Leader服务器进行处理;

2:Observer不会参与任何形式的投票,包括事务请求Proposal的投票和Leader选举投票。

为什么要进行Leader选举?

首先Leader的主要作用是保证分布式数据一致性,即每个节点的存储的数据同步。

什么情况下需要进行Leader选举?

1:服务器初始化启动;

2:服务器运行期间无法和Leader保持连接,Leader节点崩溃,逻辑时钟崩溃。

针对发生Leader选举的两种情况,Zookeeper集群的选举机制有两种,下面我们详细的介绍一下针对这两种情况的选举机制。

1:服务器初始化启动

Zookeeper集群的选举机制_第1张图片

   Zookeeper由于其自身的性质,一般建议选取奇数节点搭建分布式服务器集群。我们以3个节点组成的服务器集群为例,说明服务器初始化时的选举过程。启动第一台安装Zookeeper的节点时,无法单独进行选举,启动第二台的时候,两节点之间进行通信,开始选举Leader。

(1):集群中的每个Server投出一票。首先它们选自己为Leader,投票的内容为(SID,ZXID)。SID即Server的id(安装Zookeeper时配置文件中所配置的myid);ZXID即事务id(集群中每个节点的更新程度,ZXID越大代表Server对Znode的操作越新)。由于服务器初始化,每个Server上的Znode为0,所以Server1投的票为(1,0),Server2为(2,0)。两个Server将各自投票发给集群中的其他机器。

(2):每个Server接收来自其他Server的投票。集群中的每个Server先判断投票有效性。例如:检查是不是本轮的投票,是不是来自Looking状态的服务器的投票。

(3):对接收到的投票进行处理

   首先对比ZXID,ZXID大的服务器优先选为Leader;

   若ZXID相同,在初始化的时候,每个Server的ZXID都为0.在这种情况下就会比较myid,myid大的选出来做Leader。

   对于Server1而言,它接收到的投票为(2,0),因为自身的票为(1,0),根据上面的规则进行比较之后Server1就会选择Server2为Leader,将自己的投票更新为(2,0)。而Server2接收到的投票为Server1的(1,0)由于比自己的投票小所以Server2的投票不变,Server1和Server2将再次投票,投出的票都为(2,0)。

(4):统计投票,每次投票之后,服务器都会统计投票信息,如果判定某个Server有过半的票数投它,那么该Server将会作为Leader。对于Server1和Server2而言,第二次投票的时候可以统计出有两台机器接收到了(2,0)的投票信息,则选出Server2为Leader。

(5):选出Leader之后会改变服务器状态,Leader服务器的状态更新为Leading,Follower将状态修改为Following。

 服务器初始化状态的选举机制到此结束。

2:服务器运行期间的Leader选举

  Zookeeper集群的选举机制_第2张图片

 

      Zookeeper运行期间,如果有新的Server加入,或者非Leader的Server宕机,那么Leader将会同步数据到新的Server或者寻找其他备用Server替代宕机的Server.若Leader宕机,此时集群暂停对外服务,开始在内部选举新的Leader。假设当前集群中有Server1,Server2,Server3三台服务器,Server2为当前集群的Leader,由于意外情况Server2宕机了,便开始进入选举的状态。具体的选举过程如下:

(1):首先变更状态,其他的非Observer服务器将自己的状态修改为Looking,然后开始进入Leader的选举;

(2):每个Server发出一个(SID,ZXID),由于次集群已经运行过,所以每个Server上的ZXID可能不同。假设Server1的ZXID为245,Server3的为111,第一轮投票中Server1和Server3都投自己分别为(1,245),(3,122)将自己的票发送给集群中的所有机器。

(3):每个Server接收到其他Server的投票,下来的步骤与初始化的投票处理规则相同(初始选举机制步骤(3)再次发起投票直到统计到某个Server的投票数超过半数即选举出Leader,然后执行初始化步骤(5))。

  服务器运行期间的Leader选举到此结束。

你可能感兴趣的:(java-zookeeper)