Zookeeper学习:Leader选举

Zookeeper的Leader选举是其保持分布式一致性的重要环节。在服务器启动时,至少需要两台机器参与选举,通过比较(myid, ZXID)进行投票,ZXID较大或myid较大的服务器优先成为Leader。服务器在接收到其他投票后会进行有效性和PK规则判断,并统计投票以达到“过半”共识。在服务器运行期间,如果Leader挂掉,剩余服务器会再次进行选举,确保集群正常运行。" 11550535,1328607,处理RAC中CRS未知状态的两种方法,"['Oracle RAC', 'Cluster Ready Services', '故障处理']

1. Leader选举概述

Leader选举是zookeeper最重要的技术之一,也是保证分布式数据一致性的关键所在。

当Zookeeper集群中的一台服务器出现以下两种情况之一时,需要进入Leader选举。

  • 服务器初始化启动。
  • 服务器运行期间无法和Leader保持连接。

2. 服务器启动时期的Leader选举

若进行Leader选举,则至少需要两台机器,这里选取3台机器组成的服务器集群为例。在集群初始化阶段,当有一台服务器Server1启动时,其单独无法进行和完成Leader选举,当第二台服务器Server2启动时,此时两台机器可以相互通信,每台机器都试图找到Leader,于是进入Leader选举过程。选举过程如下

2.1 每个Server发出一个投票

由于是初始情况,Server1(假设myid为1)和Server2(假设myid为2)都会将自己作为Leader服务器来进行投票,每次投票会包含所推举的服务器的myid和ZXID,使用(myid,ZXID)来表示,此时Server1的投票为(1,0),Server2的投票为(2,0),然后各自将这个投票发给集群中其他机器

2.2 接受来自各个服务器的投票

集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否是本轮投票、是否来自LOOKING状态的服务器。

2.3 处理投票

针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK,PK规则如下

  • 优先检查ZXID。ZXID比较大的服务器优先作为Leader。
  • 如果ZXID相同,那么就比较myid。myid较大的服务器作为Leader服务器。

现在我们来看Server1和Server2实际是如何进行投票处理的。对于Server1来说,它自己的投票是(1,0),而接收到的投票为(2,0)。首先会对比两者的ZXID,因为都是0,所以无法决定谁是Leader。接下来会对比两者的myid,很显然,Server1发现接收到的投票中的myid是2,大于自己,于是就会更新自己的投票为(2,0),然后重新将投票发出去。而对于Server2来说,不需要更新自己的投票

2.4 统计投票

每次投票后,服务器都会统计所有投票,判断是否已经有过半的机器接收到相同的投票信息。对于Server1和server2服务器来说,都统计出集群中已经有两台机器接受了(2,0)这个投票信息。这里我们需要对 “过半” 的概念做一个简单的介绍。所谓"过半"就是指大于集群机器数量的一半,即大于或等于(n/2+1)。对于这里由3台机器构成的集群,大于等于2台即为达到"过半"要求。

那么,当Server1和Server2都收到相同的投票信息(2,0)的时候,即认为已经选出了Leader。

2.5 改变服务器状态

一旦确定了Leader,每个服务器就会更新自己的状态∶如果是Follower,那么就变更为FOLLOWING,如果是Leader,那么就变更为LEADING

3. 服务器运行时期的Leader选举

在Zookeeper集群正常运行过程中,一旦选出一个Leader,那么所有服务器的集群角色一般不会再发生变化——也就是说,Leader服务器将一直作为集群的Leader,即使集群中有非Leader机器挂了或是有新机器加入集群也不会影响Leader。但是一旦Leader所在的机器挂了,那么整个集群将暂时无法对外服务,而是进入新一轮的Leader选举。服务器运行期间的Leader选举和启动时期的Leader选举基本过程是一致的。

我们还是假设当前正在运行的Zookeeper机器由3台机器组成,分别是Server1、Server2和Server3,当前的Leader是Server2。假设在某一个瞬间,Leader挂了,这个时候便开始了Leader选举。

3.1 选举过程

  1. 变更状态
    Leader挂后,余下的非Observer服务器都会将自己的服务器状态变更为LOOKING,然后开始进入Leader选举过程。

  2. 每个Server会发出一个投票
    在运行期间,每个服务器上的ZXID可能不同,此时假定Server1的ZXID为123,Server3的ZXID为122;在第一轮投票中,Server1和Server3都会投自己,产生投票(1,123),(3,122),然后各自将投票发送给集群中所有机器。

  3. 接收来自各个服务器的投票,与启动时过程相同

  4. 处理投票。与启动时过程相同,此时,Server1将会成为Leader

  5. 统计投票。与启动时过程相同

  6. 改变服务器的状态。与启动时过程相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值