在集群启动过程中,或Leader 宕机后,集群就进入了恢复模式。恢复模式中最重要的阶段就是Leader选举
Leader选举中的基本概念
serverId
这是zk集群中服务器的唯一标识,也称为sid,其实质就是zk中配置的myid。例如有三个zk服务器,那么编号分别就是1、2、3。
逻辑时钟
逻辑时钟,Logicalclock,是一个整型数,该概念在选举时称为“logicalclock”,而在选举结束后称为epoch。即epoch 和 logicalclock 是同一个值,在不同的情况下的不同名称。
Leader选举算法
在集群启动过程中的Leader选举过程(算法)与Leader断连后的选举过程稍微有一些区别,但基本相同。
集群启动中的Leader选举
若进行Leader选举,则至少需要两台主机,这里以三台主机构成的集群为例。
在集群的初始化阶段,当第一台服务器Server-1启动时,其会给自己投票,然后发布自己的投票结果。投票包含所推举的服务器的myid 和ZXID,使用(myid,ZXID)来表示,此时的Server-1的投票为(1,0)。由于其他机器还没启动所以它收不到反馈信息,Server-1的状态一直处于Looking,即非服务状态。
当第二台服务器Server-2启动时,此时两台机器可以相互通信,每台机器都试图找到Leader,选举过程如下:
- 每个Server发出一个投票。此时Server-1的投票为(1,0),Server-2的投票为(2,0),然后各自将这个投票发送给集群中的其他机器。
- 接收来自各个服务器的投票。集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否本轮投票、是否来自LOOKING状态的服务器。
- 处理投票。针对每一个投票,服务器都需要将别人与自己的投票进行pk,pk规则如下:
- 优先检查zxid。zxid比较大的服务器优先作为Leader。
- 如果zxid相同,那么就比较myid。myid较大的服务器作为Leader服务器。
对于Server-1而言,它的投票(1,0),接收到Server-2的投票为(2,0)。其首先会比较两者的zxid,均为0,再比较myid,此时Server-2的myid最大,于是Server-1更新自己的投票为(2,0),然后重新投票。对于Server-2而言,其无需更新自己的投票,只是再次向集群中的所有服务器发出上一次投票信息即可。
- 统计投票。每次投票后,服务器会统计投票信息,判断是否已有过半服务器接收到相同的投票信息。对于Server-1、Server-2而言,都统计出集群中已经有两台主机接收了(2,0)的投票信息,此时便认为已经选出了新的Leader,即Server-2。
- 改变服务器状态。一旦确定了Leader,每个服务器就会更新自己的状态,如果是Follower,就变为Following,如果是Leader,就变为Leading。
- 添加主机。在新的Leader选举出来后Server-3启动,其想发出新一轮的选举。但由于当前集群中各个主机的状态并不是Looking,而是各司其职的正常服务,所以其只能以Follower的身份加入到集群中。
宕机后的Leader选举
在zookeeper运行期间,Leader与非Leader服务器各司其职,即便当有非Leader服务器宕机或新加入时也不会影响Leader。但若是Leader服务器挂了,那么整个集群将暂停对外服务,进入新一轮的Leader选举,其过程和启动时的Leader选举过程基本一致。
假设正在运行的有Server-1、Server-2、Server-3,当前Leader为Server-2,若某一时刻Server-2挂了,此时便开始了新一轮的Leader选举。过程如下:
- 变更状态。Leader挂后,余下的非Observer服务器都会讲自己的状态变更为Looking(原状态:Following),然后开始进入Leader选举过程。
- 每个Server会发出一个投票,仍然会首先投自己。不过,在运行期间每个服务器上的zxid可能是不同,此时假设Server-1的zxid为111,Server-3的zxid为333,在第一轮投票中,Server-1和Server-3都会投给自己,产生投票(1,111)、(3,333),然后各自将投票发送给集群中的其他服务器。
- 接收来自各个服务器的投票。与启动时过程相同。集群的每个服务器收到投票后,首先判断该投票的有效性。
- 处理投票。与启动时过程相同。
- 统计投票。与启动时过程相同。对于Server-1、Server-2而言,都统计出集群中已经有两台主机接收了(3,333)的投票信息,此时便认定选出了新的Leader,即Server-3。
- 改变服务器的状态。同启动时过程一样。一旦确定了Leader,每个服务器就会更新自己的状态。Server-1变更为Following,Server-3变更为Leading。