#2021年底大盘点#分布式一致性协议-Raft协议

1、Raft包含的模块

Raft协议分成3个部分来增加可理解性,分别是领导人选举、日志复制和安全性。

    • 领导人选举:Raft协议规定集群中必须有且只有一个领导者,客户端所有的读写请求最终都是发给领导人来处理的。在没有领导人的情况下,集群不对外提供服务。所以领导人选举是首要要解决的问题。
    • 日志复制:一致性算法是从复制状态机系统/运维背景下提出的,复制状状态机态机通常都是基于复制日志实现的。在整个集群中,linux创建文件通过日志按顺序执行,来保证集群中节点上的数据最终都是一致的,简单点可以理解成数据库中常用的通过binlog进行主从数据同步,只是数据库的主从同步时一对一的。保证复制日志相同就是一致性算法的工作,所以协议针对日志复制,定义了一系列需遵守的规范。
    • 安全性:为了更好的保证数据一zookeeperwatcher致性和容易实数据分析师现,Raft数据废土额外定义了很多需遵守的安全性规范

    2、Raft集群节点状态

    集群中节点的角色及状态变换有限状态机如下图:

    集群中节点可能处于3种角色中的一种:

      • Folzookeeper java apilower(追随者): 接收Leader的指令保存数据,接收Candiate的投票请求,然后投票
      • Candidate (候选人): 发拉票请求给Follinuxlower,请求选自己为数据库Leader
      • Leader (领导人): 在同一个任期(term)内,只会有限状态机存在一个Leader节点

      在集群处系统/运维数据科学与大数据技术稳定状态时,只会存在Leader和Follower;当Leader宕机后,集群进入重新选举阶段,只会存在Follower和Candidate,一旦新的Leader被选出,没选上的Candidate就转有限状态机成Followzookeeper-webezookeeper与hadoopr。

      3、领导人选举

      3.1)为什么需要选举

      Raft将整个集群的运行过程,分成一个个任期(term),任期通过任期号来标识,是一个自增的数字。Raft规定每个任期内只能有且只有一个Leader,所有发给集群的请求都由Leader来处理。就是说对于客户端来说,虽然我面对的是一个集群,但zookeeper-web是我只需要跟Leader交互就状态机verilog可以了,虽zookeeper英语怎么读音然不同的任期内Lzookeeperwatchereader可能变化,但是同一时间面对系统运维面试题及答案的仍然只有一个节点。这样做可以大大降低整个系统实现的复杂性,Zookeeper的ZAB协议也采用了同数据库样的设计。
      而选举就是选Leader的过数据库程,所以,每一个新的任期生成,一定伴随着一次重新选举。

      3.2)达成的条件

      决议通过都必需要超过半数的节点同意,这是Raft、Pax系统运维工程师面试问题及答案os及其它数据科学与大数据技术所有分布式一致性协议成立的基础。对于领数据库导人选举来说,就是一个候zookeeperwatcher选人收到了包括它自己在内的超过半数节点的选票。比如一个5zookeeper台机器的集群,一个候选人如果收到除了它自己之外2台机器系统/运维的选linux必学的60个命令票,那它就可以成功当选。

      3.3)选举过程

      (1)选linux重启命令举前的状态

      在一个正常运行中的任期中状态机图怎么画,集群中有两种节点,Leader节点和Follower节点。Leader节点通过定时发送心系统运维工资一般多少跳给Follower来维持领导者状态,Follower通过接收到日志包,来接收数据。所有节点都持久化和临时保存一些属性用来维持状态和重启时恢复数据。

      Raft节点属性列表:

      属性名

      定义

      实时持久化

      c数据分析师urrentTerm

      当前任期,任何zookeeper java api节点都zookeeperdownload必须保存当前任期号,

      在收到其它节点的rpc请求后,都会先对比任期,然后决定丢弃还是做出合理的response

      votedFor

      上次投票投给的候选人的 Id,一个任期内不会变化

      log[]

      日志linux必学的60个命令集合, 每个日志条目包含一个指令和任期号

      集群内部通过复制数据分析日志来同步数据

      commitIndex

      已经被提交的最后一条日志的索引

      lastApplied

      最后被应用到状态机的日志索引

      nextInlinux删除文件命令dex[]

      仅Leader节点使用

      记录了需要发送给其它节点的最后一条日志的索引号系统运维工程师,每个Follower一条记录

      matchIndex[]

      仅Leader节点使用

      记录了已经发送给其它节点最高索引号

      跟nextIn系统运维工资一般多少dex的区别讲到日志复制的部分数据分析师再讲

      再来看一下日志复制RPC的格式

      参数

      定义

      term

      领导人的任期号zookeeper java api

      leaderId

      领导人的 Id,以便于跟随者重定向请求

      prevLogIndex

      新的日志条目紧随之前的索引值

      prevLogTerm

      prevLogIndex 条目的任期号

      entries[]

      准备存储的日志条目(表示心跳时为空;一次性发送多个是为了提高效率)

      leaderCommit

      领导人已经提交的日志的索引值

      心跳包和日志复制使用同一个RPC调用,只是其中的entries属性为空

      Follower对于日志复制rpc的Response

      返回值

      linux是什么操作系统

      success

      Follower匹配上 prevLogIndex 和 prevLogTerm 的日志时为true,否则为false

      term

      Follower当前的linux必学的60个命令任期号,如果Follower发现Leader发来的包任期号比自己小,说明领导人已经过期了,则返回false和自己的任期号

      通过以上的RPC定义可以知道,在集群运行正常的时候,Leader不断地发送日志复制(心跳)包给Follower,而Followlinux删除文件命令er接收日志然后更新本地数据和索引Index,这时候任期号(term)一直不会发生zookeeper与hadoop变化zookeeperwatcher

      (2)选举触发系统/运维

      有两种情况会触发集群的重新选举

        • 首次启动
          第一次启动后,所有节点默认都是Follower,自然不会有Leader发心跳,所以等待一段时间后,就会有Follower将自己转换数据库成Candidazookeeper与java交互小结te,给其它节点发linux重启命令请求投票RPC。
        • 未收到Leader心跳
          集群系统运维工资一般多少运行一段状态机时间后,Leader因为宕机或者网络分区导致Follower收不到Leader的心跳,Follo数据科学与大数据技术wer也会变成Ca系统运维工程师面试问题及答案ndidate

          以上两种数据结构情况,Follower等待直到变成Candidate的时长称为选举超时。Follower在等待过程中,收到任何一种请求,都会将等待时长清零。包括Leader的心跳或者其zookeeperdownload它Candidate的投票请求。

          Follo数据漫游wer变成Candidazookeeper与java交互小结te后,就会立即发送拉票的RPC给其他所有节点,RPC格式如下:

          参数

          定义

          term

          候选人的当前任数据分析师期号系统运维工资一般多少,是原任期号+1

          candidateId

          候选人的 Id

          lastLogIndex

          候选人的最后日志条目的索引值

          lastLogTer数据漫游是什么意思m

          候选人最后日志条目的任期号

          拉选票的rpc除了携带任期号和自zookeeper英语怎么读音己的id外,还需要带自己已经接收的日志索引,这是Raft为了在选举时能够选出数据最新的节点作为新的Lea状态机verilogder。

          RPC发出前,需要将当前任期号加1,作为新的任期号,放到term字段中。前面说过,一次新数据透视表的选举必然对应一个新系统运维工程师的任期。

          Follower在收到拉票的请求后,会回复如下格式的Repsonse:

          返回值

          定义

          voteGranted数据废土

          true代表同意候选人当选新Leader

          term

          如果Follower发现自己的任期号比候选人linux大,回false,并且带zookeeper集群上自己的任期号。

          (3)投票结果

          候选数据透视表人的拉票请求发出去后可能会出现3种结果

            • 赢得linux选举
              说明该候选人收到了超过半数Foll数据废土ower节点的选票。这个时候候选人变成新Leader,一个新的任期开始,往外分发日志和心跳zookeeperdownload,直到它宕机
            • linux重启命令掉选举
              候选人把拉票请求发出去之后,没有收到大部分Follower的选票,相反收到了新Leader的心跳。这种情况下,说明有别的候选人当选了,这时候候选人主动变成Foll数据结构ower,承认新的Leader。
              怎么判断这个Leader的心跳是新当选的而不是老的包呢?就是用心跳里的任期号,如果心跳包里的任期号大于等于自己的,则说明是新Lealinux创建文件der,否则直接丢弃,继续等自己的选linux删除文件命令票。
            • 选举超时
              候选人把拉票请求发出去之后,等啊等,既没有等到大部分Follower的选票,也没有等到新Lzookeeperdownloade系统/运维alinux创建文件der的心跳。则认为选举超时了,处理方法zookeeper集群就是把自己的任期号再加1,重新发拉票请求,开启新一轮选举。

              以上就是一个完整的选举过程了,上面的循环会一直进行,直到一个新的Leader选出来为止。

              对于选举超时的情况,我们可以想一下原因。首先有可能是大家都没数据科学与大数据技术得到足够多的选票,比如一个5个节点的集群,Leader挂了后还剩4系统运维工程师面试问题及答案个,这时zookeepercontroller候其中两个节点发出投票请求,分别得到2张选票,所以没超过半数,则没人当选。其次,数据漫游是什么意思当前候选人在发出选票后因网络问题,导致Follower投给它的票一直没收到,也会造成超时。

              带着上面的问题进入下一节,看状态机编程看选举过程中会出哪类问题,Raft是怎么从协议角度来规避和解zookeeperdownload决这些问题的。

              4、选举安全性

                (1)如何保证只有linux一个候选人当选

                Raft规定一个节点当选必须要在一个任期内收到超过半数Follower的状态机设计的一般结构投票。这个很容易理解,比如有5个节点,其中3个节zookeeper点投票给我,其它候选人最多也就能得到2张选票,所以超过半数肯定是可以保证获胜的。其实这里面隐含了Raft协议的2点规定:

                • 一任同一任zookeeper与java交互小结期内,Follower只能投给一个候选人,就是说同一个term内只有一次投票机会,不得改变自己的主意。
                • 节点只能响应任期号大于或等于自己任期的请求,这个规定其实面向所有请求的系统运维工资一般多少,不止是针对投票RPC。比如当前Follower的任期号linux删除文件命令为5,这个时候来了一个投票的请求任期号是6,Fzookeeper集群ollower就可以投票给它,同时会把自己的任期号改为6。从此以后只接收任期号大于等于6的请求。这样可以处理一种情况,就是我任期5的票投给了节点A,之后又收到节点B的任期6的请求,因为它的任期更大,所以又把票投给了B。如果A之前没有收到回复,重新发送了任期5的票,这时候会直接得到拒绝的答复。
                状态机2)Follower如何决定是否投票给候选人
                • 票中带的linux常用命令候选人任期号不小于Follower的任期号
                • 任期号符合条件则先到先得, 这个和Zookeeper有一点区别,zookeeper会拒绝serverId比自己小的节点
                • 候选人必须拥有最新日志比自己新,这zookeeper英语怎么读音个在后面日志复制的时候解释原因状态机的概念
                (3)如何保证不进入选举超时-重新投票

                选举超时的循环进入以上的循环可能是如下的原因:系统运维包括哪些内容

                • Leader宕机后,有限状态机所有Follinux常用命令lower都变成候选人,都投票给自己
                • 多个候选人瓜分选票,一直系统/运维分不出胜负。比如一共4个节点A、B、C、D,A一直收到A和B的票,C一直收到C和D的票

                首先对于上面第一种情况,Raft规定选zookeeper是干什么的举超时时间是从一个固定的区间(例如 150-300 毫秒)随机选择,这样在Leader宕机后,大部分情况下只有一个节数据漫游是什么意思点会选举超时并变成候选人,而不是大家同时变成候选人。

                其次,如果第一步还是有多个节点变成候选人,然后大家又瓜分了选票导致超时,这zookeeper集群个超时也是随机的(其实跟Leader宕机导致超时是一个),这样多个候选人不会同时数据废土发起新一轮投票,第一个发起新一轮的节点会把新任期号的投票率先给到其它候选人,其他候选数据分析师人收到比自己大的任期号的拉票请求,就会自动转成Follower。所以每一次失败都随机,进一步减少了瓜分的概率。

                    (4)如何保证在一个候选人被选为Leader后,集群内其它节点迅速达成一致

                    选举过程可能出现一种情况,候选人A收到了超过半数选票成为Leader,候zookeeperwatcher选人B未收到足够多的选票而超时,所以发起新的一轮选举,因为B的任期号更高,所以A收到B的拉票请求后被迫又变成Followlinux创建文件er。这样导致的结果就是拉长了选举的时间。理论上Raft协议无法规避这种情况,而只能减少这种情况发生的概率:

                    候选人成为Leader后会以最快的速度发出心linux重启命令跳,在其它候选人超时之前,这样其它候选人会变成Follower合理设置超时时间。一般来说在大部分网络情况下,广播时间(broadcastTime) << 选举超时时间(electionTimeout) << 平均故障间隔时间(MTBF),每个时间都差至少一个数量级。Raft 的 RPCs 广播时间大约是 0.5 毫秒到 20 毫秒。因此,建议选举超时时间可能需要在 100 毫秒到 500 毫秒之间。大多数的服务器的平均故障间隔时间都在几个月甚至更长,linux系统所以上面的时间要求很容易满足。