服务器启动时期的Leader选举
(1)每个Server发出一个投票。由于是初始情况,每个Server都会将自己作为Leader服务器来进行投票,
每次投票会包含锁推荐的服务器的myid和ZXID,使用(myid,ZXID)表示,此时Server1的投票为(1,0),
Server2的投票为(2,0),然后各自将投票信息发给集群中的其他机器。
(2)接收来自各个服务器的投票。集群中的每个服务接收到投票后,
首先判断该投票的有效性,如检查是否是本轮投票、是否来自LOOKING状态的服务器。
(3)处理投票。针对每个投票,服务器都需要将别的服务器投票和自己的投票进行PK,PK规则如下
优先检查ZXID。ZXID比较大的服务器优先作为Leader。
如果ZXID相同,那么就比较myid。myid较大的服务器作为Leader服务器。
对于Server1而言,它的投票是(1,0),接收Server2的投票为(2,0),首先会比较两者的ZXID,均为0,再比较myid,
此时Server2的myid最大,于是跟新自己的投票为(2,0),然后重新投票,对于Server2而言,其无需更新自己的投票,
只是再次向集群中的所有机器发出上一次投票信息即可。
(4)统计投票。每次投票后,服务器都会统计投票信息,判断是否有过半服务器接收的相同的投票信息,
对于Server1、Server2而言,都统计出集群中已经有两台机器接收了(2,0)的投票信息,此时便认为已经选出Leader.
(5)改变服务器状态。一旦确定Leader,每个服务器就会更新自己的状态,
如果是Follower,那么就变更为FOLLOWING,如果是Leader,就变更为LEADING
服务器运行期间的Leader选举
前提:Leader服务器宕机,集群在选举出新的Leader之前无法提供服务,而是进入新一轮的Leader选举:
(1)变更状态 当Leader挂掉后,余下的非Observer服务器都会将自己的服务器状态变更为LOOKING,然后开始进入Leader选举流程。
(2)每个Server会发出一个投票 在这个过程中,需要生成投票信息(myid,ZXID)。因为是运行时期,因此每个服务器的ZXID可能不同,我们假设Server1的ZXID为123,
而Server3(Server2挂掉了)的ZXID为122。在第一轮投票中,Server1和Server3都会投自己,即分别产生投票(1,123)和(3,122),然后各自将投票信息发给集群中的所有机器。
(3)接收来自各个服务器的投票。
(4)处理投票 对于投票的处理同启动时期一致。
(5)统计投票
(6)改变服务器状态