• 回答数

    2

  • 浏览数

    313

华蓥山5
首页 > 毕业论文 > RAFT聚合毕业论文

2个回答 默认排序
  • 默认排序
  • 按时间排序

羊咩咩要攒钱

已采纳

本文为RAFT一致性算法论文的译文,原文是《In search of an Understandable Consensus Algorithm (Extended Version)》,作者为 Diego Ongaro 和 John Ousterhout 。 Raft 是一种用于管理日志复制的一致性算法,它与 Paxos 算法在效果和性能上相近。但得益于其独特的结构,Raft 比 Paxos 更易于理解,且更易于在实际项目中落地。为了便于理解,Raft 将一致性算法的关键部分分为:leader 选取,日志复制,安全性。并且,Raft 通过使用更强的一致性以减少必须考虑的状态。因此,对于学生群体,Raft 比 Paxos 更易于学习,这在一项用户调查研究中得到了印证。此外,Raft 引入了新的机制——重叠多数(overlapping majorities)原则来保证安全地动态调整集群成员。 一致性算法保证一组机器像一个整体一样工作,即使其中一些机器出现故障。因此,一致性算法是建立可靠的大规模软件系统的关键。在过去的十年中 Paxos 一直主导着有关一致性算法的讨论:大多数一致性算法的实现都基于它或者受它影响,并且 Paxos 也成为了教学中关于一致性知识的主要工具。 然而,尽管研究人员在降低它的复杂性方面做了许多努力,Paxos 依旧很难理解。并且,Paxos 需要经过复杂的修改才能应用于实际系统中。这些导致了系统构建者和学生都对 Paxos 十分头疼。 在被 Paxos 折磨之后,我们开始寻找一种新的在系统构建和教学上更好的一致性算法。与常规方法不同,我们的首要目标是让一致性算法易于理解:我们能不能定义一种面向实际系统的、比 Paxos 更容易学习的一致性算法呢?此外,我们希望这种算法直观易懂,这对一个系统构建者来说是十分必要的。对于一个算法,不仅要能够实现并且正常工作,还要清楚地明白其中的原理。 这项工作的结果是一种新的一致性算法,叫做 Raft。在设计 Raft 的过程中我们应用了许多专门的技巧来便于理解,包括算法分解(分为领导选取,日志复制和安全性)和约简状态空间(state space reduction,相对于 Paxos,Raft 减少了非确定性的程度和导致服务器之间不一致的可能)。在针对两所大学43名学生的用户调查中发现,Raft 比 Paxos 更易于理解:在学习了两种算法之后,回答问题时,其中的33个学生对 Raft 的问题回答的更好。 Raft 算法与现在一些已有的算法在某些地方很相似(主要是 Oki 和 Liskov 的 Viewstamped Replication),但是 Raft 有如下新特性: 我们认为,在教学和实际实现方面,Raft 比 Paxos 和其他算法更优秀。Raft 比其他算法更简单,更易于理解;它能满足一个实际系统的需求;它拥有许多开源的实现并且被许多公司使用;它的安全特性已经被证明;并且它的效率和其他算法相比也具有竞争力。 这篇论文剩下的部分会讲如下内容:复制状态机(replicated state machine)问题(第2节),讨论 Paxos 的优缺点(第3节),讨论为了使算法更便于理解所用的方法(第4节),陈述 Raft 一致性算法(第5~8节),评价 Raft 算法(第9节),对相关工作的讨论(第10节)。 一致性算法是在复制状态机的背景下提出来的。在这个方法中,一组服务器的状态机计算产生相同状态的副本,即使其中一些服务器崩溃,这组服务器也还能继续运行。复制状态机用于解决分布式系统中多种容错相关的问题。例如,GFS,HDFS和 RAMCloud 之类大规模系统都是用独立的复制状态机来管理 leader 选取,以及存储配置信息来应对 leader 崩溃的情况。 Chubby 和 ZooKeeper 就是使用复制状态机的例子。 如图1所示,复制状态机是通过复制日志来实现的。每一台服务器保存着一份日志,日志中包含一系列的命令,状态机会按顺序执行这些命令。因为每一台计算机的状态机都是确定的,所以每个状态机通过计算得到相同的状态,最后的输出结果也就一致了。 一致性算法的工作就是保证复制的日志一致。在一台服务器上,一致性模块接收到客户端的指令后把指令写入到日志中,并与其他服务器上的一致性模块通信,以确保每一个日志最终包含一致的请求序列,即使有某些服务器宕机。一旦这些指令被正确的复制了,每一个服务器的状态机都会按同样的顺序去执行它们,然后将结果返回给客户端。最终,这些服务器看起来就像一台可靠的状态机。在实际系统中应用的一致性算法一般有以下特性:

349 评论

淡淡的生活

这是一篇学习raft论文的总结,主要是对看论文过程中难以理解的几个问题的记录。系统性的讲解还是得看raft论文,论文原文是最好的材料。 引用论文中的第一句话--“Raft 是一种为了管理复制日志的一致性算法”。从两个角度来理解raft算法,第一部分是raft的基本规则,第二部分是raft的异常情况处理。下面放一张raft论文中的经典图来了解一下raft是怎么在一个系统中工作的。下图中一致性模块Consensus Module执行的就是raft算法,它保证拷贝到所有server上的每一条日志是一致的。State Machine状态机对应我们的业务逻辑,日志作为状态机的输入,输入一致就能保证输出是一致的。基本规则 raft的工作模式是一个Leader和多个Follower模式,即我们通常说的领导者-追随者模式。这种模式下需要解决的第一个问题就是Leader的选举问题。其次是如何把日志从Leader复制到所有Follower上去。这里先不关心安全和可靠性,只理解raft运行起来基本规则。raft中的server有三种状态,除了已经提到的Leader和Follower状态外,还有Candidate状态,即竞选者状态。下面是这三种状态的转化过程。1、Leader的选举过程 raft初始状态时所有server都处于Follower状态,并且随机睡眠一段时间,这个时间在0~1000ms之间。最先醒来的server A进入Candidate状态,Candidate状态的server A有权利发起投票,向其它所有server发出requst_vote请求,请求其它server给它投票成为Leader。当其它server收到request_vote请求后,将自己仅有的一票投给server A,同时继续保持Follower状态并重置选举计时器。当server A收到大多数(超过一半以上)server的投票后,就进入Leader状态,成为系统中仅有的Leader。raft系统中只有Leader才有权利接收并处理client请求,并向其它server发出添加日志请求来提交日志。 2、日志复制过程 Leader选举出来后,就可以开始处理客户端请求。Leader收到客户端请求后,将请求内容作为一条log日志添加到自己的log记录中,并向其它server发送append_entries(添加日志)请求。其它server收到append_entries请求后,判断该append请求满足接收条件(接收条件在后面安全保证问题3给出),如果满足条件就将其添加到本地的log中,并给Leader发送添加成功的response。Leader在收到大多数server添加成功的response后,就将该条log正式提交。提交后的log日志就意味着已经被raft系统接受,并能应用到状态机中了。 Leader具有绝对的日志复制权力,其它server上存在日志不全或者与Leader日志不一致的情况时,一切都以Leader上的日志为主,最终所有server上的日志都会复制成与Leader一致的状态。 以上就是raft允许的基本规则,如果不出现任何异常情况,那么只要上面两个过程就能使raft运行起来了。但是现实的系统不可能这么一帆风顺,总是有很多异常情况需要考虑。raft的复杂性就来源于对这些异常情况的考虑,下面一小节就以问答的方式来总结raft是怎么保证安全性的。 安全性保证 1、Leader选举过程中,如果有两个serverA和B同时醒来并发出request_vote请求怎么办? 由于在一次选举过程中,一个server最多只能投一票,这就保证了serverA和B不可能同时得到大多数(一半以上)的投票。如果A或者B中其一幸运地得到了大多数投票,就能顺利地成为Leader,raft系统正常运行下去。但是A和B可能刚好都得到一半的投票,两者都成为不了Leader。这时A和B继续保持Candidate状态,并且随机睡眠一段时间,等待进入到下一个选举周期。由于所有server都是随机选择睡眠时间,所以连续出现多个server竞选的概率很低。 2、Leader挂了后,如何选举出新的Leader? Leader正常运作时,会周期性地发出append_entries请求。这个周期性的append_entries除了可以更新其它Follower的log信息,另外一个重要功能就是起到心跳作用。Follower收到append_entries后,就知道Leader还活着。如果Follower经过一个预定的时间(一般设为2000ms左右)都没有收到Leader的心跳,就认为Leader挂了。于是转入Candidate状态,开始发起投票竞选新的Leader。每个新的Leader产生后就是一个新的任期,每个任期都对应一个唯一的任期号term。这个term是单调递增的,用来唯一标识一个Leader的任期。投票开始时,Candidate将自己的term加1,并在request_vote中带上term;Follower只会接受任期号term比自己大的request_vote请求,并为之投票。这条规则保证了只有最新的Candidate才有可能成为Leader。 3、Follower在收到一条append_entries添加日志请求后,是否立即保存并将其应用到状态机中去?如果不是立即应用,那么由什么来决定该条日志生效的时间? Follower在收到一条append_entries后,首先会检查这条append_entries的来源信息是否与本地保存的leader信息符合,包括leaderId和任期号term。检查合法后就将日志保存到本地log中,并给Leader回复添加log成功,但是不会立即将其应用到本地状态机。Leader收到大部分Follower添加log成功的回复后,就正式将这条日志commit提交。Leader在随后发出的心跳append_entires中会带上已经提交日志索引。Follower收到Leader发出的心跳append_entries后,就可以确认刚才的log已经被commit(提交)了,这个时候Follower才会把日志应用到本地状态机。下表即是append_entries请求的内容,其中leaderCommit即是Leader已经确认提交的最大日志索引。Follower在收到Leader发出的append_entries后即可以通过leaderCommit字段决定哪些日志可以应用到状态机。 4、假设有一个server A宕机了很长一段时间,它的日志已经落后很多。如果A重新上线,而且此时现有Leader挂掉,server A刚好竞选成为了Leader。按照日志都是由Leader复制给其它server的原则,server A会把其它Follower已经提交的日志给抹掉,而这违反了raft状态机安全特性,raft怎么解决这种异常情况? 所谓的状态机安全特性即是“如果一个领导人已经在给定的索引值位置的日志条目应用到状态机中,那么其他任何的服务器在这个索引位置不会提交一个不同的日志”。如果server在竞选Leader的过程中不加任何限制的话,携带旧日志的server也有可能竞选成为Leader,就必然存在覆盖之前Leader已经提交的日志可能性,从而违反状态机安全特性。raft的解决办法很简单,就是只有具有最新日志的server的才有资格去竞选当上Leader,具体是怎么做到的呢?首先任何server都还是有资格去发起request_vote请求去拉取投票的,request_vote中会带上server的日志信息,这些信息标明了server日志的新旧程度,如下表所示。 其它server收到request_vote后,判断如果lastLogTerm比自己的term大,那么就可以给它投票;lastLogTerm比自己的term小,就不给它投票。如果相等的话就比较lastLogIndex,lastLogIndex大的话日志就比较新,就给它投票。下图是raft日志格式,每条日志中不仅保存了日志内容,还保存了发送这条日志的Leader的任期号term。为什么要在日志里保存任期号term,由于任期号是全局单调递增且唯一的,所以根据任期号可以判断一条日志的新旧程度,为选举出具有最新日志的Leader提供依据。 5、存在如下图一种异常情况,server S5在时序(d)中覆盖了server S1在时序(c)中提交的index为2的日志,方框中的数字是日志的term。这违反了状态机的安全特性--“如果一个领导人已经在给定的索引值位置的日志条目应用到状态机中,那么其他任何的服务器在这个索引位置不会提交一个不同的日志”,raft要如何解决这个问题? 出现这个问题的根本原因是S1在时序(c) 的任期4内提交了一个之前任期2的log,这样S1提交的日志中最大的term仅仅是2,那么一些日志比较旧的server,比如S5(它最日志的term为 3),就有机会成为leader,并覆盖S1提交的日志。解决办法就是S1在时序(c)的任期term4提交term2的旧日志时,旧日志必须附带在当前term 4的日志下一起提交。这样就把S1日志的最大term提高到了4,让那些日志比较旧的S5没有机会竞选成为Leader,也就不会用旧的日志覆盖已经提交的日志了。 简单点说,Leader如果要提交之前term的旧日志,那么必须要提交一条当前term的日志。提交一条当前term的日志相当于为那些旧的日志加了一把安全锁,让那些日志比较旧的server失去得到Leader的机会,从而不会修改那些之前term的旧日志。 怎么具体实现旧日志必须附带在当前term的日志下一起提交呢?在问题3中有给出append_entries请求中的字段,其中有两个字段preLogIndex和preLogTerm的作用没有提到,这两个字段就是为了保证Leader和Followers的历史日志完全一致而存在的。当Leader在提交一条新日志的时候,会带上新日志前一条日志的index和term,即preLogIndex和preLogTerm。Follower收到append_entries后,会检查preLogIndex和preLogTerm是否和自己当前最新那条日志的index和term对得上,如果对不上就会给Leader返回自己当前日志的index和term。Leader收到后就将Follower返回的index对应的日志以及对应的preLogIndex和preLogTerm发送给Follower。这个过程一直重复,直到Leader和Follower找到了第一个index和term能对得上的日志,然后Leader从这条日志开始拷贝给Follower。回答段首的问题,Leader在提交一条最新的日志时,Follow会检验之前的日志是否与Leader保持了一致,如果不一致会一直同步到与Leader一致后才添加最新的日志,这个机制就保证了Leader在提交最新日志时,也提交了之前旧的日志。 6、向raft系统中添加新机器时,由于配置信息不可能在各个系统上同时达到同步状态,总会有某些server先得到新机器的信息,有些server后得到新机器的信息。比如下图raft系统中新增加了server4和server5这两台机器。只有server3率先感知到了这两台机器的添加。这个时候如果进行选举,就有可能出现两个Leader选举成功。因为server3认为有3台server给它投了票,它就是Leader,而server1认为只要有2台server给它投票就是Leader了。raft怎么解决这个问题呢? 产生这个问题的根本原因是,raft系统中有一部分机器使用了旧的配置,如server1和server2,有一部分使用新的配置,如server3。解决这个问题的方法是添加一个中间配置(Cold, Cnew),这个中间配置的内容是旧的配置表Cold和新的配置Cnew。还是拿上图中的例子来说明,这个时候server3收到添加机器的消息后,不是直接使用新的配置Cnew,而是使用(Cold, Cnew)来做决策。比如说server3在竞选Leader的时候,不仅需要得到Cold中的大部分投票,还要得到Cnew中的大部分投票才能成为Leader。这样就保证了server1和server2在使用Cold配置的情况下,还是只可能产生一个Leader。当所有server都获得了添加机器的消息后,再统一切换到Cnew。raft实现中,将Cold,(Cold,Cnew)以及Cnew都当成一条普通的日志。配置更改信息发送Leader后,由Leader先添加一条 (Cold, Cnew)日志,并同步给其它Follower。当这条日志(Cold, Cnew)提交后,再添加一条Cnew日志同步给其它Follower,通过Cnew日志将所有Follower的配置切换到最新。 有的raft实现采用了一种更加简单粗暴的方法来解决成员变化的问题。这个办法就是每次只更新一台机器的配置变化,收到配置变化的机器立马采用新的配置。这样的做法为什么能确保安全性呢?下面举例说明。比如说系统中原来有5台机器A,B,C,D,E,现在新加了一台机器F,A,B,C三台机器没有感知到F的加入,只有D,E两台机器感知到了F的加入。现在就有了两个旧机器集合X{A, B, C, D, E}和新机器集合Y{F}。假设A和D同时进入Candidate状态去竞选Leader,其中D要想竞选成功,必须得有一半以上机器投票,即6/2+1=4台机器,就算Y集合中的F机器给D投了票,还得至少在集合X中得到3票;而A要想竞选成功,也必须得到5/2+1 = 3张票,由于A只知道集合X的存在,所以也必须从集合X中获得至少3票。而A和D不可能同时从集合X同时获得3票,所以A和D不可能同时竞选成为Leader,从而保证了安全性。可以使用更加形式化的数学公式来证明一次添加一台机器配置不会导致产生两个Leader,证明过程就暂时省略了。 raft论文中文翻译: raft论文英文原址: raft使用C语言实现: raft成员变更过程分析:

171 评论

相关问答

  • 凝聚态毕业论文

    应该还是比较好出文章的

    超级能吃的兔兔 3人参与回答 2023-12-08
  • RAFT聚合毕业论文

    本文为RAFT一致性算法论文的译文,原文是《In search of an Understandable Consensus Algorithm (Extend

    华蓥山5 2人参与回答 2023-12-05
  • 毕业论文聚酯切片

    塑料涂料的研究现状与展望摘要:从塑料涂料的成膜基料、涂料性能、施工应用等方面,阐述了国内外塑料涂料的研究现状,并提出了塑料涂料研究存在的问题与发展要求。关键词:

    shuixinggege 3人参与回答 2023-12-10
  • 年产聚乙二醇合成毕业论文

    【关键词】 靶向给药;药剂学;药物载体0引言常规剂型的药物经静脉、口服或局部注射后,药物分布于全身,真正到达治疗靶区的药物量仅为给药量的小部分,而大部分药物在非

    家有陈先森 3人参与回答 2023-12-09
  • 聚苯乙烯毕业论文

    摘要:系统总结国内外废旧塑料的主要回收利用技术,针对目前我国回收处理废旧塑料的现状,指出提高分类筛选水平,吸收开发关键技术,是我国回收处理废旧塑料的必要途径。由

    melodyhanhan 6人参与回答 2023-12-09