Zookeeper Leader选举分析

一、基本概念

        SID:服务器ID,SID是一个数字,用来标识Zookeeper集群中的一台机器,每台机器不能重复,并且和myid文件中数字一致。
        ZXID:事务ID,用来标识一次服务器状态的变更,在某一时刻,集群中的每台机器的ZXID不一定完全一致。
        Vote:投票,Leader的选举通过投票的方式实现,当集群中的机器检测不到Leader时,就会开始尝试进行投票选举。
        Quorum:过半机器数,集群中过半的机器数,quorum=(n/2+1)。

二、选举过程概述

        Zookeeper集群运行过程中,在两种情况下会进行Leader选举,一是Zookeeper服务刚启动时,二是Leader崩溃或者网络等原因无法与其他服务器保持联系时。
        服务启动时的Leader选举
        1.每个server发出一个投票。
                由于是初始情况,因此都会将自己做为Leader服务器进行投票,每次投票包含最基本的元素:所推举的服务器的myid和ZXID。然后将投票发送给集群中的其他所有机器。
        2.接收来自各个服务器的投票:
                每个服务器都会收到来自其他服务器的投票,每个服务器在接收到投票后,首先会判断投票的有效性,包括检查是否是本轮投票,是否来自LOOKING状态的服务器。
        3.处理投票。
    在接收到来自其他服务器的投票后,针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK,PK规则如下:a)优先检查ZXID,ZXID比较大的服务器优先做为Leader;b)如果ZXID相同,则比较myid,myid比较大服务器做为Leader服务器。
        4.统计投票。
                每次投票后,服务器会统计所有投票,判断是否已经有过半的机器接收到相同的投票信息。
        5.改变服务器状态。
                一旦确定了Leader,每个服务器都会更新自己的状态,如果是Follower就变更为FOLLOWING,如果是Leader就变更为LEADING。

        服务运行期间的Leader选举
        1.状态变更。
                当Leader崩溃或失联之后,余下的Follower服务器都会将自己的状态变更为LOOKING,然后开始Leadere选举流程。
        2..每个server发出一个投票。
        3.接收来自各个服务器的投票。
        4.处理投票。
        5.统计投票。
        6.改变服务器状态。

三、算法分析

        前面提到有两种情况会进行选举,与此同时,在一台机器进入选举流程时,集群可能处于两种状态:a)集群中已经存在一个Leader;b)集群中不存在Leader。在第一种情况下,当机器视图进行选举的时候,会被告知当前Leader的信息,因此,仅需要和Leader建立连接并进行状态同步即可。而在第二种情况下,会真正进行Leader选举。
        当集群中的机器为LOOKING状态时,会向集群中所有其他机器发送消息,即投票。当接收到其他机器的投票后,会对投票做变更。
        vote_sid:接收到的投票中所推举的Leader服务器的SID。
        vote_zxid:接收到的投票中所推举的Leader服务器的ZXID。
        self_sid:当前服务器自己的SID。
        self_zxid:当前服务器自己的ZXID。
        投票变更规则:
        1.如果vote_zxid大于self_zxid,就认可当前收到的投票,并再次将该投票发送出去。
        2.如果vote_zxid小于self_zxid,就坚持自己的投票不做变更。
        3.如果vote_zxid等于self_zxid,就对比SID。如果vote_sid大于self_sid,就认可当前收到的投票,并再次将该投票发送出去。
        4.如果vote_zxid等于self_zxid,并且vote_sid小于self_sid,就坚持自己的投票不做变更。
        投票变更后,会再次进行投票。当第二次投票后,集群中每台机器会再次收到投票,然后进行统计,如果一台机器获得了超过半数相同的投票,那么这个投票对应的SID机器即为Leader。



猜你喜欢

转载自blog.csdn.net/asty9000/article/details/80232572