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 选举过程
-
变更状态
Leader挂后,余下的非Observer服务器都会将自己的服务器状态变更为LOOKING,然后开始进入Leader选举过程。 -
每个Server会发出一个投票
在运行期间,每个服务器上的ZXID可能不同,此时假定Server1的ZXID为123,Server3的ZXID为122;在第一轮投票中,Server1和Server3都会投自己,产生投票(1,123),(3,122),然后各自将投票发送给集群中所有机器。 -
接收来自各个服务器的投票,与启动时过程相同 -
处理投票。与启动时过程相同,此时,Server1将会成为Leader -
统计投票。与启动时过程相同 -
改变服务器的状态。与启动时过程相同
Zookeeper的Leader选举是其保持分布式一致性的重要环节。在服务器启动时,至少需要两台机器参与选举,通过比较(myid, ZXID)进行投票,ZXID较大或myid较大的服务器优先成为Leader。服务器在接收到其他投票后会进行有效性和PK规则判断,并统计投票以达到“过半”共识。在服务器运行期间,如果Leader挂掉,剩余服务器会再次进行选举,确保集群正常运行。"
11550535,1328607,处理RAC中CRS未知状态的两种方法,"['Oracle RAC', 'Cluster Ready Services', '故障处理']
278

被折叠的 条评论
为什么被折叠?



