zoukankan      html  css  js  c++  java
  • 分布式学习笔记(三)-分布式选举

    为什么要有分布式选举

         在一个分布式集群中负责对其他节点的协调和管理,其他节点都必须听从主节点的安排。主节点的存在,就可以保证其他节点的有序运行,以及数据库集群中的写入数据在每个节点上的一致性。这里的一致性是指,数据在每个集群节点中都是一样的,不存在不同的情况。选举的作用就是选出一个主节点,由它来协调和管理其他节点,以保证集群有序运行和节点间数据的一致性。
     

    分布式选举的算法

    • 长者为大:Bully算法
        节点的角色有两种:普通节点和主节点。初始化时,所有节点都是平等 的,都是普通节点,并且都有成为主的权利。但是,当选主成功后,有且仅有一个节点成为主节点,其他所有节点都是普通节点。当且仅当主节点故障或与其他节点失去联系后,才会重新选主。
      • 选举过程  
        • 3种消息  
          • Election消息,用于发起选举  
          • Alive消息,对Election消息的应答  
          • Victory消息,竞选成功的主节点向其他节点发送的宣誓主权的消息  
      • 原则:“长者为大”,意味着它的假设条件是,集群中每个节点均知道其 他节点的 ID
        • 集群中每个节点判断自己的 ID 是否为当前活着的节点中 ID 最大的,如果是,则直接 向其他节点发送 Victory 消息,宣誓自己的主权;
        • 如果自己不是当前活着的节点中 ID 最大的,则向比自己 ID 大的所有节点发送 Election 消息,并等待其他节点的回复;
        • 若在给定的时间范围内,本节点没有收到其他节点回复的 Alive 消息,则认为自己成为主节点,并向其他节点发送 Victory 消息,宣誓自己成为主节点;若接收到来自比自己 ID 大的节点的 Alive 消息,则等待其他节点发送 Victory 消息;
        • 若本节点收到比自己 ID 小的节点发送的 Election 消息,则回复一个 Alive 消息,告知 其他节点,我比你大,重新选举。

            

      • 优点:举速度快、算法复杂度低、简单易实现。
      • 缺点:
        • 需要每个节点有全局的节点信息,因此额外信息存储较多
        • 任意一个比当前主节点 ID 大的新节点或节点故障后恢复加入集群的时候,都可能会触发重新选举,成为新的主节点,如果该节点频繁退出、加入集群,就会导致频繁切主。 
    • 民主投票:Raft算法
         Raft 算法是典型的多数派投票选举算法,其选举机制与我们日常生活中的民主投票机制类似,核心思想是“少数服从多数”。也就是说,Raft 算法中,获 得投票最多的节点成为主。
      • 集群节点的3种角色  
        • Leader:主节点,同一个时刻只有一个Leader,负责协调和管理其他节点  
        • Canidate:候选者,每一个节点都可以成为Candidate,节点在该角色下才可以被选为新Leader;  
        • Follower:Leader的跟随者,不可以发起选举  
      • 选举流程  
        1. 初始化时,所有节点均为 Follower 状态。
        2. 开始选主时,所有节点的状态由 Follower 转化为 Candidate,并向其他节点发送选举请求。
        3. 其他节点根据接收到的选举请求的先后顺序,回复是否同意成为主。这里需要注意的是,在每一轮选举中,一个节点只能投出一张票。若发起选举请求的节点获得超过一半的投票,则成为主节点,其状态转化为 Leader,
        4. 其他节点的状态则由 Candidate 降为 Follower。Leader 节点与 Follower 节点之间会 定期发送心跳包,以检测主节点是否活着。
        5. 当 Leader 节点的任期到了,即发现其他服务器开始下一轮选主周期时,Leader 节点的状态由 Leader 降级为 Follower,进入新一轮选主。

            

      • 优点:具有选举速度快、算法复杂度低、易于实现的优点
      • 缺点:要求系统内每个节点都可以相互通信,且需要获得过半的投票数才能选主成功,因此通信量大。 该算法选举稳定性比 Bully 算法好,这是因为当有新节点加入或节点故障恢复后,会触发选主,但不一定会真正切主,除非新节点或故障后恢复的节点获得投票数过半,才会导致切主。
     
    • 具有优先的民主投票:ZAB(Zookeeper Atomic Broadcast)算法
        ZAB(ZooKeeper Atomic Broadcast)选举算法是为 ZooKeeper 实现分布式协调功能而 设计的。相较于 Raft 算法的投票机制,ZAB 算法增加了通过节点 ID 和数据 ID 作为参考 进行选主,节点 ID 和数据 ID 越大,表示数据越新,优先成为主。相比较于 Raft 算法, ZAB 算法尽可能保证数据的最新性。所以,ZAB 算法可以说是对 Raft 算法的改进。
      • 集群节点的3种角色  
        • Leader:主节点  
        • Follower:跟随者节点  
        • Observer:观察者,无投票权  
      • 集群中的节点4种状态  
        • Looking 状态,即选举状态。当节点处于该状态时,它会认为当前集群中没有 Leader, 因此自己进入选举状态。  
        • Leading 状态,即领导者状态,表示已经选出主,且当前节点为 Leader。  
        • Following 状态,即跟随者状态,集群中已经选出主后,其他非主节点状态更新为Following,表示对 Leader 的追随。  
        • Observing 状态,即观察者状态,表示当前节点为 Observer,持观望态度,没有投票权和选举权。  
      • 选举过程  
        • 投票过程中,每个节点都有一个唯一的三元组 (server_id, server_zxID, epoch),其中 server_id 表示本节点的唯一 ID;server_zxID 表示本节点存放的数据 ID,数据 ID 越大表示数据越新,选举权重越大;epoch 表示当前选取轮数,一般用逻辑时钟表示。  
        • ZAB 算法选主的原则:server_zxID 最大者 成为 Leader;若 server_zxID 相同,则 server_id 最大者成为 Leader。  
          ZAB 选举算法的核心是“少数服从多数,ID 大的节点优先成为主”,因此选举过程中通过 (vote_id, vote_zxID) 来表明投票给哪个节点,其中 vote_id 表示被投票节点的 ID, vote_zxID 表示被投票节点的服务器 zxID  
     
    第一步:当系统刚启动时,3 个服务器当前投票均为第一轮投票,即 epoch=1,且 zxID 均为 0。此时每个服务器都推选自己,并将选票信息 <epoch, vote_id, vote_zxID> 广播出
    第二步:根据判断规则,由于 3 个 Server 的 epoch、zxID 都相同,因此比较 server_id, 较大者即为推选对象,因此 Server 1 和 Server 2 将 vote_id 改为 3,更新自己的投票箱并重新广播自己的投票。
    第三步:此时系统内所有服务器都推选了 Server 3,因此 Server 3 当选 Leader,处于 Leading 状态,向其他服务器发送心跳包并维护连接;Server1 和 Server2 处于 Following 状态。
                               
      • 缺点:采用广播方式发送信息,若节点中有 n 个节点,每个节点同时广播,则集群中信息量为 n*(n-1) 个消息,容易出现广播风暴;且除 了投票,还增加了对比节点 ID 和数据 ID,这就意 味着还需要知道所有节点的 ID 和数据 ID,所以选举时间相对较长
      • 优点:ZAB 算法性能高,对系统无特殊要求;选举稳定性比较好,当有新节点加入或节点故障恢复后,会触发选主,但不一定会真正切主,除非新节点或故障后恢复的节点数据 ID 和节点 ID 最大,且获得投票数过半,才会导致切主。
     
    Bully算法
    Raft算法
    ZAB算法
    选举消息回复类型
    alive消息
    同意或不同意选举的消息
    投票信息
    <epoch,vote_id,vote_zxID>
    Leader选举机制
    偏向于让ID更大的节点作为Leader
    收到过半数的投票,则当选为Leader
    倾向于让数据最新或者ID值最大的节点作为Leader
    选举过程
         
    选举所需时间
    较短
    较长
    新能
                Bully<Raft<ZAB
     
  • 相关阅读:
    【CSS】CSS 页面布局:盒子模型(内容区、边框、内边距、外边距)
    压缩/解压文件
    WebApiClient.JIT
    并行+异步执行操作
    JSON输出时不输出某些属性值
    ASP.NET MVC中Filter过滤器的使用
    使用git克隆github上的项目失败,报错error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054
    C# 实现WebSocket通信
    写日志
    list随机生成数值
  • 原文地址:https://www.cnblogs.com/Onlywjy/p/12822351.html
Copyright © 2011-2022 走看看