IT 论文精读 · PAPER 44

Paxos Made Simple

Leslie Lamport · Microsoft Research · ACM SIGACT News · 2001

EN →

这篇论文干了什么?

2001 年,Leslie Lamport 用大白话重讲了他自己发明的 Paxos——一个让一群分布在各地、彼此只能靠不靠谱的网络通信的计算机,就「某一件事」达成唯一、且永不反悔的一致决定的方法。今天你用的几乎每个大型在线服务背后都有它的影子:数据库怎么选出主节点、一条数据到底写没写、集群里谁说了算——这类「所有机器必须认同同一个答案」的问题,靠的就是 Paxos 这类共识(consensus)算法。

先说个难处

想象一群朋友要靠打电话约同一家餐厅,但电话会随机掉线,有人会突然睡着、过一会儿又醒来(对应机器崩溃重启),消息可能迟到、重复。要求很苛刻:最后大家必须定在同一家,而且一旦定了,就绝不能有人以为定的是另一家。难点在于:没有一个「所有人都信的中心」,消息又不可靠,怎么保证不会出现「一半人以为定了 A、一半人以为定了 B」?(有个前提:这里没人撒谎,机器只会崩溃、不会故意发假消息——会撒谎是另一个更难的问题。)

那个点子

Paxos 的办法是两轮沟通 + 排队号。谁想提议,先领一个越来越大的号码牌(后领的号一定比先领的大)。第一轮他拿着号去问「过半数」的人:「能答应我吗?」;第二轮才把自己想定的餐厅正式推上去,让过半数人「接受」。一家餐厅被过半数人接受,就算「定了」。

到底怎么保证不打架?

两条规矩顶住了一切。第一条:每个人只认号大的——一旦你答应了 5 号,就不再理睬任何号更小的人。第二条、也是最妙的一条:提议者在第二轮"推自己的餐厅"之前,必须先问一圈;只要有人说"我已经接受过某家了",他就必须改推那一家、放弃自己原本想定的。

再加上「过半数」这个设计的妙处——任意两拨「过半数」的人,必然至少有一个人重叠。于是只要一家餐厅已经被定过,后来的任何人在问那一圈时,总会撞上那个"重叠的人"、从他嘴里听说这家已定,从而乖乖沿用它。决定因此永远唯一、永不翻案。

带来了什么

这套「先问一圈、再推、认大号、沿用旧值」的规矩,成了几乎所有需要强一致的分布式系统的地基:谷歌的 Chubby 锁服务、Spanner 全球数据库,以及各种数据库的主从选举,骨子里都是它。后来更好懂的 Raft,也是同一套思想的重新包装。

一句话记住

让一群不可靠的机器就一件事达成唯一决定:领个只增的号码牌、先问过半数人一圈、谁号大听谁的;而且在推自己的值之前,必须先沿用别人已接受的值——靠「任意两个过半数必然重叠」,被定过的值就再也翻不了案。诚实说:它出了名地难懂,且只扛机器崩溃、不扛撒谎,纯 Paxos 还会因两人互相抢号而卡住(要靠选一个"领头的"来解决)。

想看两阶段协议的流程图、过半数为何必然重叠、以及它怎么变成真实系统? → 切到精读版