了解一下Zookeeper的Leader选举
一、Leader选举概述Leader选举是ZooKeeper中最重要的技术之一,也是保证分布式数据一致性的关键所在。在本节中,我们将先从整体上来对ZooKeeper的Leader选举进行介绍。二、Leader选举2.1 服务器启动时期的Leader选举2.1.1 什么时候进行Leader选举需要注意的一点是,隐式条件便是ZooKeeper的集群规模至少是2台机器,这里我们以3台机器组成的...
一、Leader选举概述
Leader选举是ZooKeeper中最重要的技术之一,也是保证分布式数据一致性的关键所在。
二、Leader选举
2.1 服务器启动时期的Leader选举
2.1.1 什么时候进行Leader选举
需要注意的一点是,隐式条件便是ZooKeeper的集群规模至少是2台机器,这里我们以3台机器组成的服务器集群为例。在服务器集群初始化阶段,当有一台服务器(我们假设这台机器的myid为1,因此称其为Server1)启动的时候,它是无法完成Leader选举的,是无法进行Leader选举的。当第二台机器(同样,我们假设这台服务器的myid为2,称其为Server2)也启动后,此时这两台机器已经能够进行互相通信,每台机器都试图找到一个Leader,于是便进入了Leader选举流程。
2.1.2 Leader选举过程
- 每个Server会发出一个投票。由于是初始情况,因此对于Server1和Server2来说,都会将自己作为Leader服务
器来进行投票,每次投票包含的最基本的元素包括:所推举的服务器的myid 和ZXID,我们以(myid, ZXID)的形式来表示。因为是初始化阶段,因此无论是Serverl还是Server2,都会投给自己,即Serverl的投票为(1, 0),Server2 的投
票为(2,0),然后各自将这个投票发给集群中其他所有机器。. - 接收来自各个服务器的投票。每个服务器都会接收来自其他服务器的投票。集群中的每个服务器在接收到投票
后,首先会判断该投票的有效性,包括检查是否是本轮投票、是否来自LOOKING状态的服务器。 - 处理投票。
在接收到来自其他服务器的投票后,针对每一个投票,服务器都需要将别人的投票和自己的投票进行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来说,不需要更新自己的投票信息,只是再一次向集群中所有机器发出上一次投票信息即可。 - 统计投票。
每次投票后,服务器都会统计所有投票,判断是否已经有过半的机器接收到相同的投票信息。对于Server1和Server2服务器来说,都统计出集群中已经有两台机器接受了(2, 0)这个投票信息。这里我们需要对“过半”的概念做一个简单的
介绍。所谓“过半”就是指大于集群机器数量的一半,即大于或等于(n/2+1)。对于这里由3台机器构成的集群,大于等于2台即为达到“过半”要求。
那么,当Server1和Server2都收到相同的投票信息(2,0)的时候,即认为已经选出了Leader。 - 改变服务器状态。
一旦确定了Leader, 每个服务器就会更新自己的状态:如果是Follower, 那么就变更为FOLLOWING,如果是Leader,那么就变更为LEADING。
2.2 服务器运行期间的Leader选举
在ZooKeeper集群正常运行过程中,一旦选出一个Leader,那么所有服务器的集群角色一般不会再发生变化,也就是说,Leader服务器将一直作为集群的Leader, 即使集群中有非Leader集群挂了或是有新机器加入集群也不会影响Leader。但是一旦Leader所在的机器挂了,那么整个集群将暂时无法对外服务,而是进入新一轮的Leader选举。服务器运行期间的Leader选举和启动时期的Leader选举基本过程是一致的。
我们假设当前正在运行的ZooKeeper服务器由3台机器组成,分别是Server1、Server2和Server3,当前的Leader是Server2。假设在某一个瞬间,Leader 挂了,这个时候便开始了Leader选举。
- 变更状态。
当Leader挂了之后,余下的非Observer服务器都会将自己的服务器状态变更为LOOKING,然后开始进人Leader选举流程。 - 每个Server会发出一个投票。
在这个过程中,需要生成投票信息(myid, ZXID)。 因为是运行期间,因此每个服务器上的ZXID可能不同,我们假定Server的ZXID为123,而Server3的ZXID为122。在第一轮投票中,Serverl 和Server3都会投自己,即分别产生投票(1,123)和(3,122),然后各自将这个投票发给集群中所有机器。 - 接收来自各个服务器的投票。
- 处理投票。
对于投票的处理,和上面提到的服务器启动期间的处理规则是一致的。在这个例子里面,由于Server1的ZXID为123, Server3的ZXID为122, 那么显然, Server1会成为Leader. - 统计投票。
- 改变服务器状态。
更多推荐
所有评论(0)