• Zookeeper选主流程


    http://www.thinkyixia.com/2017/11/04/zookeeper-6/
    在Zookeeper集群中,主要分为三者角色,而每一个节点同时只能扮演一种角色,这三种角色分别是:
    (1). Leader 接受所有Follower的提案请求并统一协调发起提案的投票,负责与所有的Follower进行内部的数据交换(同步);
    (2). Follower 直接为客户端服务并参与提案的投票,同时与Leader进行数据交换(同步);
    (3). Observer 直接为客户端服务但并不参与提案的投票,同时也与Leader进行数据交换(同步);observer的作用是为了拓展系统,提高读取速度。

    每个Server在工作过程中有四种状态:
    LOOKING:竞选状态,当前Server不知道leader是谁,正在搜寻。
    LEADING:领导者状态,表明当前服务器角色是leader。
    FOLLOWING:随从状态,表明当前服务器角色是follower,同步leader状态,参与投票。
    OBSERVING,观察状态,表明当前服务器角色是observer,同步leader状态,不参与投票。

    选主机制
    Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。leader选举是保证分布式数据一致性的关键。
    当zk集群中的一台服务器出现以下两种情况之一时,就会开始leader选举。
    (1)服务器初始化启动。
    (2)服务器运行期间无法和leader保持连接。
    而当一台机器进入leader选举流程时,当前集群也可能处于以下两种状态。
    (1)集群中本来就已经存在一个leader。
    (2)集群中确实不存在leader。
    首先第一种情况,通常是集群中某一台机器启动比较晚,在它启动之前,集群已经正常工作,即已经存在一台leader服务器。当该机器试图去选举leader时,会被告知当前服务器的leader信息,它仅仅需要和leader机器建立连接,并进行状态同步即可。
    下面重点看第二种情况,即集群中leader不存在的情况下如何进行leader选举。

    数据模型
    投票信息中包含两个最基本的信息。
    sid:即server id,用来标识该机器在集群中的机器序号。
    zxid:即zookeeper事务id号。ZooKeeper状态的每一次改变, 都对应着一个递增的Transaction id, 该id称为zxid. 由于zxid的递增性质, 如果zxid1小于zxid2, 那么zxid1肯定先于zxid2发生. 创建任意节点, 或者更新任意节点的数据, 或者删除任意节点, 都会导致Zookeeper状态发生改变, 从而导致zxid的值增加.
    以(sid,zxid)的形式来标识一次投票信息。例如,如果当前服务器要推举sid为1,zxid为8的服务器成为leader,那么投票信息可以表示为(1,8)

    规则
    集群中的每台机器发出自己的投票后,也会接受来自集群中其他机器的投票。每台机器都会根据一定的规则,来处理收到的其他机器的投票,以此来决定是否需要变更自己的投票。
    规则如下:
    (1)初始阶段,都会给自己投票。
    (2)当接收到来自其他服务器的投票时,都需要将别人的投票和自己的投票进行pk,规则如下:
    优先检查zxid。zxid比较大的服务器优先作为leader。
    如果zxid相同的话,就比较sid,sid比较大的服务器作为leader。

    举例
    假设当前集群中有5台机器组成。sid分别为1,2,3,4,5。zxid分别为9,9,9,8,8,并且此时sid为2的机器是leader。某一时刻,1和2的服务器挂掉了,集群开始进行选主。
    在第一次投票中,由于无法检测到集群中其他机器的状态信息,因此每台机器都将自己作为被推举的对象来进行投票。于是sid为3,4,5的机器,投票情况分别为(3,9),(4,8),(5,8)
    每台机器把投票发出后,同时也会接收到来自另外两台机器的投票。
    对于server3来说,接收到(4,8),(5,8)的投票,对比后由于自己的zxid要大于收到的另外两个投票,因此不需要做任何变更。
    对于server4来说,接收到(3,9),(5,8)的投票,对比后由于(3,9)这个投票的zxid大于自己,因此需要变更投票为(3,9),然后继续将这个投票发送给另外两台机器。
    对于server5来说,接收到(3,9),(4,8)的投票,对比后由于(3,9)这个投票的zxid大于自己,因此需要变更投票为(3,9),然后继续将这个投票发送给另外两台机器。
    经过第二轮投票后,集群中的每台机器都会再次受到其他机器的投票,然后开始统计投票。判断是否有过半的机器收到相同的投票信息,如果有,那么该投票的sid会成为新的leader。

    机器总数为5台,server3,4,5都收到投票(3,9)。因此server3成为leader。



    作者:运动书生
    链接:https://www.jianshu.com/p/75e48405d678
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    手机号码正则表达式
    POJ 3233 Matrix Power Series 矩阵快速幂
    UVA 11468
    UVA 1449
    HDU 2896 病毒侵袭 AC自动机
    HDU 3065 病毒侵袭持续中 AC自动机
    HDU 2222 Keywords Search AC自动机
    POJ 3461 Oulipo KMP模板题
    POJ 1226 Substrings KMP
    UVA 1455 Kingdom 线段树+并查集
  • 原文地址:https://www.cnblogs.com/tiancai/p/14007174.html
Copyright © 2020-2023  润新知