zcp1211小窝
Raft算法是解决分布式系统共识的问题的算法,Raft是基于Multi-Paxos的基础上做了简化和限制。不同于Paxos的难以理解,Raft设计的首要目的就是可理解性,一个易于理解、实现简单的分布式一致性协议。 Raft 将一致性算法分解成了几个关键模块,例如领导人选举、日志复制和安全性,本文将主要基于 raft论文 简单分析raft算法。
Raft是强领导(Strong leader)模型,一切以leader为主,比如日志只能由leader复制到其他服务器。所以leader的选举是非常重要的一部分。 首先介绍raft算法的三个服务状态:
任意时间集群中只能由一个leader存在。
Raft使用心跳机制实现leader选举。在服务启动的时候,处于follower角色,需要注意的是每个服务于leader的心跳超时的时间是随机的(150-300 毫秒)。
如上图,集群中有三个几点A、B、C,超时时间分别为150ms、200ms、300ms刚启动时任期编号都是0,都处于follower角色。节点A与leader的心跳超时时间最短,最先从follower状态转为candidate,并增加自己的任期编号,先给自己投上一张选票,并向集群中其他节点发送投票信息,当B、C节点接受到A的投票请求之后,在任期为1的这个阶段没有给其他节点投过票,便接受A的投票请求。此时节点A接受到了集群中超过一半的节点的投票,便成为任期为1的leader。
上诉是最简单的选举流程,里面有很多概念都需要解释,比如为什么超时时间不一样?任期编号是什么?投票比较的规则又是什么? 1. 任期编号 每个leader在当选期间都有一个自己的任期编号,它是全局单调递增的数字。每个节点都存储这当前的leader的任期编号,当处于candidate阶段的时候,发起投票的时候会把当前任期编号加一。 而且当一个节点接受到比自己任期高的请求时,会将自己的任期编号更新为高的任期编号,如果当前角色是leader,会从leader转换为follower角色。当接受到任期编号比自己小的请求时,节点会直接拒绝这个请求。
2. 投票比较规则 a. 先到先服务:一个节点在一个任期只能投一票,如果A、B节点都请求C节点投票,C节点如果先投给A之后、就会拒绝B的投票请求。 b.日志完整性:一个节点接受的投票信息如果它的日志比自身小,将会拒绝该投票请求。 c.过半策略:当某节点接受到了集群中超过一半的节点投票之后,成为该次任期的leader,向其他节点发送leader心跳。 d. 在等待投票期间,candidate 可能会收到另一个声称自己是 leader 的服务器节点发来的 AppendEntries RPC 。如果这个 leader 的任期号(包含在RPC中)不小于 candidate 当前的任期号,那么 candidate 会承认该 leader 的合法地位并回到 follower 状态。
3.随机超时 前面提高过,每个几点与leader的心跳超时时间是不同的,这样的好处在于避免瓜分票数的情况存在,能快速的进行leader选举。如果各个节点的超时时间都是一样的,就容易出现瓜分票数的情况存在,每个节点都没有获得超过一半的投票,就会开启下一轮的选举,选举时间就会很长。使用随机超时机制,正常情况下,一个时间段里只有一个节点发起投票请求。
下图是整个集群中服务角色变化的流程图。
Leader选举出来之后为客户端提供服务,将接受到的指令作为一个新的日志项追加到日志中去,然后并行的发起 AppendEntries RPC 给其他的服务器,让它们复制该日志项。当该日志项被安全地复制(过半的节点已复制完成),leader 会应用该日志项到它的状态机中(状态机执行该指令)然后把执行的结果返回给客户端。如果 follower 崩溃或者运行缓慢,或者网络丢包,领导人会不断地重试 AppendEntries RPC(即使已经回复了客户端)直到所有的 follower 最终都存储了所有的日志。
上图展示了日志的格式,一个日志项包含三部分
Leader通过 AppendEntries RPC 将日志复制到其他节点。
AppendEntries RPC:
接收者实现:
上诉是AppendEntries RPC的参数的接受流程。term与leaderId不用介绍很简单,而prevLogIndex、prevLogTerm的作用是日志的一致性检测,如果 follower 在它的日志中找不到包含相同索引位置和任期号的条目,那么他就会拒绝该新的日志条目。一致性检查就像一个归纳步骤:一开始空的日志状态肯定是满足 Log Matching Property(日志匹配特性) 的,然后一致性检查保证了日志扩展时的日志匹配特性。因此,每当 AppendEntries RPC 返回成功时,leader 就知道 follower 的日志一定和自己相同(从第一个日志条目到最新条目)。
正常操作期间,leader 和 follower 的日志保持一致,所以 AppendEntries RPC 的一致性检查从来不会失败。然而,leader 崩溃的情况会使日志处于不一致的状态(老的 leader 可能还没有完全复制它日志里的所有条目)。如下情况:
在 Raft 算法中,leader 通过强制 follower 复制它的日志来解决不一致的问题。这意味着 follower 中跟 leader 冲突的日志条目会被 leader 的日志条目覆盖。
Leader 针对每一个 follower 都维护了一个 nextIndex ,表示 leader 要发送给 follower 的下一个日志条目的索引。当选出一个新 leader 时,该 leader 将所有 nextIndex 的值都初始化为自己最后一个日志条目的 index 加1。如果 follower 的日志和 leader 的不一致,那么下一次 AppendEntries RPC 中的一致性检查就会失败。在被 follower 拒绝之后,leaer 就会减小 nextIndex 值并重试 AppendEntries RPC 。最终 nextIndex 会在某个位置使得 leader 和 follower 的日志达成一致。此时,AppendEntries RPC 就会成功,将 follower 中跟 leader 冲突的日志条目全部删除然后追加 leader 中的日志条目(如果有需要追加的日志条目的话)。一旦 AppendEntries RPC 成功,follower 的日志就和 leader 一致,并且在该任期接下来的时间里保持一致。
本机简单介绍了raft 的leader选举和日志复制,当然raft还有其他的特性本文并没有介绍,推荐去看raft的论文,完整的了解raft。 我之前 ZAB协议 的文章分析了zookeeper的zab协议,这里对比一下两者的异同。
最后 这个网址详细介绍了raft协议。
嘟嘟和滴滴
本文为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所示,复制状态机是通过复制日志来实现的。每一台服务器保存着一份日志,日志中包含一系列的命令,状态机会按顺序执行这些命令。因为每一台计算机的状态机都是确定的,所以每个状态机通过计算得到相同的状态,最后的输出结果也就一致了。 一致性算法的工作就是保证复制的日志一致。在一台服务器上,一致性模块接收到客户端的指令后把指令写入到日志中,并与其他服务器上的一致性模块通信,以确保每一个日志最终包含一致的请求序列,即使有某些服务器宕机。一旦这些指令被正确的复制了,每一个服务器的状态机都会按同样的顺序去执行它们,然后将结果返回给客户端。最终,这些服务器看起来就像一台可靠的状态机。在实际系统中应用的一致性算法一般有以下特性:
传统的论文写作方法有:归纳法,演绎法,定量分析法等等。不过,使用什么研究方法,要看你的论文是什么学科、领域的。理工科和文科论文的写作方法是有很大区别的。
都可以,看您擅长那个方面虽然您打算做量化研究,但在前期打基础时最好看一些比较经典的关于质性研究的论文,这样在前期时你可以将质性研究和量化研究进行对比,总结出相同
传统的论文写作方法有:归纳法,演绎法,定量分析法等等。不过,使用什么研究方法,要看你的论文是什么学科、领域的。理工科和文科论文的写作方法是有很大区别的。
定性论文和定量论文是两种不同的研究方法,它们的区别如下: 1. 研究对象不同:定性研究的对象通常是文字、图片、录音、视频等非数字化的数据,而定量研究的对象通常是
教育专业毕业论文题目只是需要题目吗?论文呢?