读书笔记:In Search of an Understandable Consensus Algorithm

在被Paxos的The Part-Time Parliament伤了之后,我自然而然就准备来看一下大家都说容易理解的Raft协议,也就是这篇In Search of an Understandable Consensus Algorithm,来给自己的智商重新冲值。

这篇论文开宗明义就说了:"Raft is a consensus algorithmfor managing a replicated log. It produces a result equivalent to Paxos, and it is as efficient as Paxos, but its structure is different from Paxos; this makes Raft more understandable than Paxos and also provides a better foundation for building practical systems. In order to enhance understandability, Raft separates the key elements of consensus, such as leader election and log replication, and it enforces a stronger degree of coherency to reduce the number of states that must be considered. Raft also includes a new mechanism for changing the cluster membership, which uses overlapping majorities to guarantee safety. Results from a user study demonstrate that Raft is easier for students to learn than Paxos." 

里面除了说Raft功能和Paxos一样,可是更容易理解,人见人爱之外。关键是这句: In order to enhance understandability, Raft separates the key elements of consensus, such as leader election and log replication, and it enforces a stronger degree of coherency to reduce the number of states that must be considered. 意思是:为了提升可理解性,Raft 将一致性算法分解成了几个关键模块,例如领导人选举、日志复制和安全性。同时它通过实施一个更强的一致性来减少需要考虑的状态的数量。

后面这篇论文的内容大致就是讲一段自己的理论就来一段Raft协议是多么容易理解或者Paxos是多么不好理解的论述。最后还搞了一个针对Paxos及Raft 算法的可理解能力的测试。整个方案是这样的:“为了和 Paxos 比较 Raft 算法的可理解能力,我们针对高层次的本科生和研究生,在斯坦福大学的高级操作系统课程和加州大学伯克利分校的分布式计算课程上,进行了一次学习的实验。我们分别拍了针对 Raft 和 Paxos 的视频课程,并准备了相应的小测验。Raft 的视频讲课覆盖了这篇论文的所有内容除了日志压缩;Paxos 讲课包含了足够的资料来创建一个等价的复制状态机,包括单决策 Paxos,多决策 Paxos,重新配置和一些实际系统需要的性能优化(例如领导人选举)。小测验测试一些对算法的基本理解和解释一些边角的示例。每个学生都是看完第一个视频,回答相应的测试,再看第二个视频,回答相应的测试。大约有一半的学生先进行 Paxos 部分,然后另一半先进行 Raft 部分,这是为了说明两者独立的区别从第一个算法处学来的经验。我们计算参加人员的每一个小测验的得分来看参与者是否在 Raft 算法上更加容易理解。”为了增加说服了作者还用线性回归模型对学生成绩数据进行了统计,最后结果当然是在可理解性上Raft胜出。

Raft协议之所以容易被理解是因为在Raft协议进行了算法分解(Raft 主要被分成了领导人选举,日志复制和安全三个模块)和减少状态机的状态(相对于 Paxos,Raft 减少了非确定性和服务器互相处于非一致性的方式)。具体实现上有以下几个独特的特性:

Design for understandability(易于理解的设计): understandability was our most important criterion in evaluating design alternatives. We applied specific techniques to improve understandability, including decomposition (Raft separates leader election, log replication, and safety so that they can be understood relatively independently) and state space reduction (Raft reduces the degree of nondeterminism and the ways servers can be inconsistent with each other, in order to make it easier to reason about the system). 

Strong leader(强领导者): Raft differs from other consensus algorithms in that it employs a strong form of leadership where only leaders (or would-be leaders) issue requests; other servers are completely passive. This makes Raft easier to understand and also simplifies the implementation. 

Membership changes(关系调整): Raft’s mechanism for changing the set of servers in the cluster uses a simple joint consensus approach where the majorities of two different configurations overlap during transitions.

因为强领导者,Raft可以将一致性问题分解成了三个相对独立的子问题:

Leader election(领导选举): a newleadermust be chosenwhen an existing leader fails, and Raft must guarantee that exactly one leader is chosen (Section 5.2). 

Log replication(日志复制): the leader must accept log entries from clients and replicate them faithfully across the cluster, forcing all other logs to agree with its own (Section 5.3). 

Safety(安全性): Section5.4describeshowRaft decideswhen a log entry has been committed, and how it ensures that leaders always hold all committed entries in their logs.

后续的章节对这几个问题的具体实现进行了详细的描述,甚至连实现的函数的定义都给了出来(RequestVote RPC和AppendEntries RPC)。整个论文可以说通俗易懂,大家可以从头橹到尾。

论文下载地址:http://fi.ee.tsinghua.edu.cn/media/files/2016/11/168263a78850135205a978e7230056d2/raft.pdf

时间: 2024-11-02 11:23:28

读书笔记:In Search of an Understandable Consensus Algorithm的相关文章

[读书笔记] The Part-Time Parliament

在刚接触到一致性算法的时候就知道了Paxos,同时也发现看到的所有文章提到Paxos的时候都说难于理解.于是我决定,咱就要看Paxos是怎么个难法,万一我一遍就看明白了,是不是证明我的智商高啊,So --- LESLIE LAMPORT大爷,我来了. 不过这篇The Part-Time Parliament我一打开就开始懵比.这个名字就不像IT论文啊,"临时议会"什么意思? 开头这么一段: Early in this millennium, the Aegean island of P

091025 L DNA读书笔记

读书笔记和读后感 02 如何开始第一个工作     大企业,有很多好处.它与小企业的不同在于,小企业的竞争是对外的,而大企业的竞争则是来自于内部的.选择进入大企业的人,一定要有一个目标,多年后做到某个位置的目标.大企业适合喜欢跟同事竞争的人工作.     小企业,坏处是没有大企业的待遇好,不过可以学会更多的本领.     政府机关,如果选择到这里工作,那就是一个比较稳定的工作.在这里,如果比别人更勤奋的话,爬得也比别人快.     自由职业,如果选择这种方式工作,那么需要人有比较高的自我管控能力

Java与XSLT读书笔记(1)

笔记 <Java与XSLT>读书笔记 一,所有的XSLT处理器必须包括四个内置的模版规则,它们的优先级要低于任何其他规则,所以只要编写一个新的模版规则来匹配相同的式样,就可以覆盖它们.理解内置规则的最好方法就是架设它们总是位于后台,如果没有找到其他匹配一个节点的规则,就应用这些内置规则. <xsl:template match="*|/"> <xsl:apply-templates/> </xsl:template> <xsl:te

《点石成金》读书笔记:为网站增加注意力吸引点

文章描述可用性设计建议--<点石成金>读书笔记. 阅读笔记8-12章 1. WEB设计团队讨论可用性是在浪费时间 原因 1"每个人都喜欢______" 我们也是Web用户对网站上自己喜欢什么不喜欢什么有着强烈的感觉.而且由于主张的力量和人的天性自然有种把这些喜欢或不喜欢投射到整个Web用户身上的倾向. 2职位情绪 设计师通常认为大多数人喜欢视觉上看起来有趣的网站开发人员认为人们喜欢功能又多又酷的网站在建立优先级时他们在看法上的不同常引发冲突. 更大的冲突是市场文化和工程文化

深入了解JVM-----Inside JVM读书笔记

笔记   本文首先介绍一下Java虚拟机的生存周期,然后大致介绍JVM的体系结构,最后对体系结构中的各个部分进行详细介绍. (  首先这里澄清两个概念:JVM实例和JVM执行引擎实例,JVM实例对应了一个独立运行的java程序,而JVM执行引擎实例则对应了属于用户运行程序的线程:也就是JVM实例是进程级别,而执行引擎是线程级别的.) 一. JVM的生命周期 JVM实例的诞生:当启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String

PHP-SOCKETS读书笔记

笔记 学习PHP2个月了,收获挺多.但是与别人不同的是,我更喜欢SOCKET.PHP在SOCKET这方面的文章太少了.所以决定写一系列PHP-SOCKET读书笔记.一直从最基本写到SOCKET_RAW.实例+心得.实例将会有端口转发(突破防火墙),动网类型EXP,端口扫描,PHP后门,发包型EXP框架.由于学习缘故,每周只能写一篇.现给出卷一.希望大家一起投入到PHP SHELL编程中来. 前言: PHP是世界上最流行的脚本语言之一.一直以来它在WEB编程中得到极广泛的应用.我想说的是PHP不仅

一个男人和三个女人的故事[《.net框架程序设计》读书笔记

.net框架|笔记|程序|设计|示例 第十一章 多事件示例[一个男人和三个女人的故事] 摘要: 应用FCL中的System.ComponentModel.EventHandlerList示例一个类型中发布多事件的应用 场景:一个男生有三个女朋友,各自有不同的爱好,女朋友A爱好音乐,女朋友B爱好美食,女朋友C爱好XXX,为满足各个女朋友,此男生必须进行唱歌.烹饪食物.xxx. 以此制作程序演示单类型多事件的应用,并假设此男同时只能干一件事情(即排除一边xxx一边唱歌或一边xxx一边烹饪的可能J)

101 VB.NET Applications 读书笔记(1)

application|笔记 今天开始看<101 Microsoft Visual Basic .NET Applications>. 这本书是很多人集体编写的,带有101个示例程序,涵盖了VB.NET编程的大部分方面,主要作者是Sean Campbell, Scott Swigart, Bob Carver等. 书由MSPress出版,看了一下,感觉还可以,现在开始写读书笔记吧. 书中提到,书中的程序包含了近700个小时的编程实践(Practice),个人认为,学习编程这东西就是要实践,要读

第十四章 数组[《.net框架程序设计》读书笔记]

.net框架|笔记|程序|设计|数组 第十四章 数组. 内容摘要: 本章讨论了数组的方方面面,对于这种常用类型进行深入研究. 一. 数组简介 三种类型:一维数组.多维数组.交错数组(jagged aray) l 一维数组: Int32[] myIntegers; myIntegers = new Int32[100]; l 多维数组: Int32[,] myIntegers; myIntegers = new Int32[100,100]; l 交错数组:交错数组不受CLS支持 Point[][