前言
因为学习了MIT6.824课程,我对于raft这个分布式算法感到很有兴趣,它宣称自己是容易理解的分布式共识算法,相比之前广泛应用的Paxos,Raft的描述使用的是工程化的语言,引入了RPC,Log等易懂的概念,使得它更加容易被理解。
但是容易被理解并不等于就可以简单地实现正确,实际上,正确地实现Raft —— 甚至只是课程中那个非工业级的,完全按照paper中叙述的那种简单版 —— 也是极为困难的。因为分布式共识算法中一点细节不对,就可能会对整个系统的安全性和活性造成打击。
在长达一周的时间中,踩了无数坑,终于过了6.824 Lab2中提供的所有TestCase。但是需要指出的是,即便如此也不能保证我的Raft实现是正确的。因为我的代码没经过形式化验证。也可能只是问题没被测出来而已,分布式系统的状态太多太庞杂,完全覆盖是不可能的。
但无论如何,我认为有一些东西值得记下来,让后人和之后的自己少走点弯路。
学习资料
想看视频的话推荐MIT 6.824,网上有各种视频可以看,不过翻译可能不全,但是英文也不难。Raft只是这个课程的一部分。我做的Lab就是这个课程提供的
Raft相关的是Lab 2 : 6.824 Lab 2: Raft
Raft的paper :Paper (很重要,后面要非常仔细地参考这个paper)
还有课程TA的建议: Students' Guide to Raft
以上是我认为最有用的,如果对自己动手实现有兴趣建议仔细读。
Raft概述
首先,Raft是什么呢?Raft是一种分布式共识算法,Paper中这样定义共识算法:公式算法使得一组机器能一致地工作,即便部分成员挂掉也可以继续工作(Consensus algorithms allow a collection of machines to work as a coherent group that can survive the failures of some of its members)
在Raft之前,其实是有别的分布式共识算法的,比如Paxos,但是Paxos太过于晦涩难懂,即便懂了论文,实现到代码中也会有很大的不同,这样一来要保证实现的正确性就非常困难了。同时Paxos的晦涩让教学也很难进行。
这时,Raft就诞生了,其论文标题 《In Search of an Understandable Consensus Algorithm》就指明了,它是以可理解性为重要目标的。
在这篇Paper中,没有使用形式化的术语和符号,而是用状态机,Log,RPC等概念来描述算法,开发人员很容易去在代码上实现论文中描述的。
机制
Raft将网络中的节点分成三种: Leader, Candidate和Follower
Leader: 节点只有一个:Replication Log的追加操作必须通过Leader进行,同时