ZooKeeper_14_Leader选举

来源:互联网 发布:jira linux 破解版 编辑:程序博客网 时间:2024/04/30 07:23

Leader选举


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


参数介绍:

myid:同SID,用来唯一标示一台ZooKeeper集群中的机器,每台机器不能重复,配置文件配置。

ZXID:事务ID,用来唯一标示一次服务器状态的变更。集群中每台机器的ZXID都是不一样的,这和ZooKeeper服务器对于客户端"更新请求"的处理逻辑有关。




服务器启动时期的Leader选举

我们默认ZooKeeper服务器最少两台,要是只有一台,还玩屁个Leader选举呀..


咱们假设有三台ZooKeeper服务器,启动了其中两台时:server1(myid:1)、server2(myid:2)、server3(myid:3)

在服务器集群初始化阶段,两台服务器启动之后,互相能进行通信之后,每台机器都试图找到一个Leader,于是便进入了Leader选举流程。


1. 每个Server会发出一个投票

由于是初始,对于server1 和 server2 来说,都会将自己作为leader服务器来进行投票(就是自己投给自己)

每次投票包含的基本参数有:所推举的服务器的myid和ZXID

我们以(myid,ZXID)来表示.

因为是初始化阶段,server1和server2都会投给自己,即server1投票(1,0)、server2投票(2,0)

然后给自将这个投票发给集群中其他所有的机器。


2. 接收来自各个服务器的投票

每个服务器都会接收来自其他服务器的投票。

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


3. 处理投票

在接收到来自其他服务器的投票后,针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK,PK规则如下:

a. 优先检查ZXID。ZXID比较大的服务器优先作为Leader

b. 如果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)。

对于这里由三台机器构成的集群,大于等于2台即为达到"过半"要求。

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


5. 改变服务器状态

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

如果是Leader,那么久变更为LEADING。




服务器运行期间的Leader选举

zookeeper集群正常运行中,一旦选出一个Leader,那么所有服务器的集群角色一般不会发生变化。


也就是说,leader服务器将一直作为集群的Leader,即使集群中有非leader角色的机器挂了或者有新机器加入,不会影响leader机器角色。


但是一旦Leader所在的机器挂了,那么整个集群将暂时无法对外服务,而是进入新一轮的Leader选举。

服务器运行期间的Leader选举和启动时期的Leader选举基本过程是一致的。


我们依旧假设有三台机器,server1、server2、server3,当前的Leadeer是server2,假设某一时刻,leader挂了...╮(╯▽╰)╭


1. 变更状态

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


2. 每个Server会发出一个投票

这个过程中,需要生成投票信息(myid,ZXID)。

因为是运行期间,因此每个服务器上的ZXID可能不太一样,我们假设server1的ZXID:123、server3的ZXID:122

第一轮投票,server1和server3都是投给自己,即分别产生投票(1,123)和(3,122)

然后各自将这个投票发送给集群中所有的机器。


3. 接收来自各个服务器的投票


4. 统计投票

投票期的处理,和服务器启动期间的处理规则是一致的。

这个栗子中,server1的ZXID为123,server3的ZXID为122,很明显,server1会成为leader


5. 改变服务器状态


算法分析暂时不看


原创粉丝点击