当前位置:   article > 正文

Zookeeper之Leader选举_zppkeeper leader

zppkeeper leader

1.Leader选举概述

Leader选举是zookeeper最重要的技术之⼀,也是保证分布式数据⼀致性的关键所在。
当Zookeeper集群中的⼀台服务器出现以下两种情况之⼀时,需要进⼊Leader选举。
(1) 服务器初始化启动。
(2) 服务器运⾏期间⽆法和Leader保持连接。

2.Leader选举

2.1 服务器启动时期的Leader选举

若进⾏Leader选举,则⾄少需要两台机器,这⾥选取3台机器组成的服务器集群为例。在集群初始化阶段,当有⼀台服务器Server1启动时,其单独⽆法进⾏和完成Leader选举,当第⼆台服务器Server2启动时,此时两台机器可以相互通信,每台机器都试图找到Leader,于是进⼊Leader选举过程。选举过程如下:
(1) 每个Server发出⼀个投票
由于是初始情况,Server1(假设myid为1)和Server2(假设myid为2)都会将⾃⼰作为Leader服务器来进⾏投票,每次投票会包含所推举的服务器的myid和ZXID,使⽤(myid, ZXID)来表示,此时Server1的投票为(1, 0), Server2的投票为(2, 0),然后各⾃将这个投票发给集群中其他机器。
(2) 接受来⾃各个服务器的投票
集群的每个服务器收到投票后,⾸先判断该投票的有效性,如检查是否是本轮投票、是否来⾃LOOKING状态的服务器。
(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来说,不需要更新⾃⼰的投票。
(4) 统计投票
每次投票后,服务器都会统计所有投票,判断是否已经有过半的机器接收到相同的投票信息。对于Server1和Server2服务器来说,都统计出集群中已经有两台机器接受了(2, 0)这个投票信息。这⾥我们需要对“过半”的概念做⼀个简单的介绍。所谓“过半”就是指⼤于集群机器数量的⼀半,即⼤于或等于(n/2+1)。对于这⾥由3台机器构成的集群,⼤于等于2台即为达到“过半”要求。那么,当Server1和Server2都收到相同的投票信息(2, 0)的时候,即认为已经选出了Leader。
(5) 改变服务器状态
⼀旦确定了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选举。
(1) 变更状态
Leader挂后,余下的⾮Observer服务器都会将⾃⼰的服务器状态变更为LOOKING,然后开始进⼊Leader选举过程。
(2) 每个Server会发出⼀个投票
在运⾏期间,每个服务器上的ZXID可能不同,此时假定Server1的ZXID为123, Server3的ZXID为122;在第⼀轮投票中, Server1和Server3都会投⾃⼰,产⽣投票(1, 123), (3, 122),然后各⾃将投票发送给集群中所有机器。
(3) 接收来⾃各个服务器的投票
集群的每个服务器收到投票后,⾸先判断该投票的有效性,如检查是否是本轮投票、是否来⾃LOOKING状态的服务器。
(4) 处理投票。
针对每⼀个投票,服务器都需要将别⼈的投票和⾃⼰的投票进⾏PK, PK规则如下
· 优先检查ZXID。 ZXID⽐较⼤的服务器优先作为Leader。
· 如果ZXID相同,那么就⽐较myid。 myid较⼤的服务器作为Leader服务器。
  现在我们来看Server1和Server3实际是如何进⾏投票处理的。对于Server1来说,它⾃⼰的投票是(1,123),⽽接收到的投票为(3, 122)。很显然,Server1的ZXID更大,那么不更新自己的投票;对于Server3来说,接收到的投票的ZXID大于自己,于是更新自己的投票为(1, 123),然后重新将投票发出去
(5) 统计投票。
每次投票后,服务器都会统计所有投票,判断是否已经有过半的机器接收到相同的投票信息。对于Server1和Server3服务器来说,都统计出集群中已经有两台机器接受了(1, 123)这个投票信息。这⾥我们需要对“过半”的概念做⼀个简单的介绍。所谓“过半”就是指⼤于集群机器数量的⼀半,即⼤于或等于(n/2+1)。对于这⾥由3台机器构成的集群,⼤于等于2台即为达到“过半”要求。那么,当Server1和Server3都收到相同的投票信息(1, 123)的时候,即认为已经选出了Leader。
(6) 改变服务器的状态。
⼀旦确定了Leader,每个服务器就会更新⾃⼰的状态:如果是 Follower,那么就变更为FOLLOWING,如果是Leader,那么就变更为LEADING。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/957198
推荐阅读
相关标签
  

闽ICP备14008679号