IT 论文精读 · PAPER 50

Raft:为「读得懂」而生的共识算法

Diego Ongaro & John Ousterhout · Stanford · USENIX ATC 2014

EN →

这篇论文干了什么?

2014 年,斯坦福的两位研究者(Diego Ongaro 与 John Ousterhout)提出了 Raft——一套让一群计算机「就同一件事达成一致、而且永不反悔」的规则。你天天在用的很多大系统(比如 Kubernetes、数据库 CockroachDB、服务注册中心 etcd / Consul)背后,都有一小群机器在偷偷互相备份、彼此盯着,保证「就算死掉几台,剩下的也记得一模一样的账、绝不打架」。Raft 就是这套「达成一致」的规则。它最特别的地方不是更快或更强——而是故意被设计得让人能读懂、能照着写对

先打个比方

想象一个小组,每人手里一本一模一样的记事本,上面按顺序记着「做过哪些操作」。规矩是:所有人的本子必须永远逐行相同;一旦某一行被「敲定」,就再也不能改、不能丢——哪怕有人打瞌睡、传纸条中途弄丢了也不行。让一群会犯困、通信还不靠谱的成员,把本子记得分毫不差,这件事有个正经名字,叫共识(consensus)

旧世界的痛

共识早就有过标准答案,叫 Paxos,1990 年提出、作者还拿了图灵奖。问题是:它出了名地难懂。教科书讲不清、工程师读不透,真要照着做一个能用的系统,几乎人人都得往里加一堆自己发明、没被验证过的补丁。一个「错一点就出大事」的算法,却几乎没人真正搞懂——这本身就是重大隐患。Raft 的作者干脆把「让人能懂」当成头号设计目标,其它都往后排。

Raft 怎么做到的

三招,都很朴素。

一是只选一个队长(leader):任何时候只有队长一人能往本子里写新行,其他人只管照抄队长的本子。信息永远从队长流向组员——不像旧办法人人都能提议、乱成一锅粥。

二是用随机闹钟选队长:每人手里一个倒计时长短随机的小闹钟;只要一阵子没听到队长的动静,谁的闹钟先响,谁就站起来喊「选我当队长?」。因为时长随机,两人同时抢的情况很少;万一抢平了,就各自再随机一次,很快能选出来。

三是过半数才算数:队长写下一行后,要等超过一半的人都抄好了,这行才算「敲定」。妙处在于——任意两拨「过半数」的人一定有重叠,所以下一任队长手里必然带着全部敲定过的行,敲定的内容永远不会丢。再补一条:只有本子记得够新的人才有资格当选,这就堵死了「本子缺页的人当上队长、把大家带偏」的漏洞。

带来了什么

Raft 把「共识」从少数专家才敢碰的黑魔法,变成了普通工程师读一篇论文就能实现的东西。今天数不清的基础设施——etcd、Consul、TiKV、CockroachDB、Kafka 的新版协调层——都跑在 Raft 或它的变体上。可以说,它让「可靠的分布式系统」变得人人写得出。

诚实一句:所有写操作都得过队长一个人的手,所以队长是吞吐的天花板;而且队长一掉线,全组要停一小会儿重新选举才能继续。它也只防「宕机」不防「说谎」——假设成员里没人使坏。

一句话记住

选一个队长专门记账、大家照抄,用随机闹钟选队长、用「过半数抄好才算数」保证敲定的内容永不丢失——Raft 把三十年没人读懂的共识算法,重写成一篇能读懂、能照着写对的规则,成了当代无数分布式系统的一致性内核。

想看角色状态机、复制日志图和实验数字? → 切到精读版