故事
光绪末年,上海租界里有个华商联合会,专管码头货栈的公共事务。会章规定:凡添设新栈、改换旧规,须得会首召集各商投票,过半数赞成方可施行。这规矩本是照抄西洋议会,在纸面上清清楚楚,执行起来却磨人得很。
联合会共有九名理事,会首是其中之一。按章,会首先发出"议案"——某日某时、何事何由——理事们收到后各自画押回函。会首数到五票赞成,议案便算通过。这九取五的规矩,人人知道叫"过半数",却少有人细想:为何偏偏是五,不是四、不是六?
会首周掌柜是个精细人。他发现这规矩有个暗病:每回投票,议案从他手里发出,理事们回函到他手里汇总,他一人经手全部文书。码头事务繁杂,一日三五件议案是常事,周掌柜疲于奔命,理事们也怨声载道——"左等右等,会首的函件还没来"。
周掌柜想了个变通法。他把理事们分成三组,每组三人,各立一名组首。寻常议案不再由他亲自发起,而是轮流交给三位组首:第一案甲组发、第二案乙组发、第三案丙组发,循环往复。组首收到议案,只需在本组内征得两票赞成——连同自己,三人取二——便算组内通过。但组首不能独自决断,须把组内画押的函件送回周掌柜处备案。周掌柜不再审议案内容,只核对"甲组两票、乙组两票、丙组两票"是否到齐,九票中凑足任意两组通过,即宣告全案成立。
这法子省了事,却埋下隐患。某年梅雨,丙组组首病倒,组内一名理事又回乡省亲,丙组只剩一人。按新规矩,三人取二,丙组此时连一案的票都凑不齐。周掌柜起初不以为意:甲组乙组各两票,四票虽不过半数,但两组到齐,按他的变通法也该算数。可理事们吵翻了天——"九取五是祖宗定下的规矩,四票怎么算过半?"
周掌柜被逼到墙角,只好再改章程。他宣布:今后分两种议案。寻常议案仍用轮流组首发,三组中任意两组通过即可,不求九票过半,只求每组都有人点头——这叫"组间互认"。重大议案则必须由周掌柜亲发,照旧九取五,缺一不可。为防混淆,寻常议案用蓝纸、重大议案用黄纸,一眼可辨。
这蓝黄之分,让联合会运转了五年,直到辛亥革命那年。
—
后来有人复盘周掌柜的三次变通,发现每一步都踩中了一套算法的命门。
第一次变通——从"会首独揽"到"组首轮发"——正是 Multi-Paxos 的核心。Lamport 的原始 Paxos 里,任何节点都可以发起提议(prepare),多个提议者竞争同一个槽位,冲突频繁。Multi-Paxos 引入稳定主节点(stable leader):一个任期(term)内由单一节点垄断提议权,跳过 prepare 阶段,直接进入 accept,把两阶段压缩成一阶段。周掌柜的"轮流组首"就是选主:甲组任期发第一案,乙组任期发第二案,主节点轮换但同一时刻只有一个。组内三人取二,对应 accept 阶段的 quorum——不必等全部九人,只要多数组内认可即可。
第二次变通的危机——丙组瘫痪、四票僵局——暴露了 Multi-Paxos 的软肋:主节点失效时系统卡住。周掌柜的"两组通过即可"其实是偷换概念,把全局九取五偷换成了"三组中过两组",但理事们不买账,因为两组通过不等于全局过半。这在算法里对应一个经典陷阱:如果 accept quorum 和 prepare quorum 的交集不能保证,就可能出现两个不同的值被同时选中。
第三次变通——蓝纸黄纸、寻常与重大之分——是 Fast Paxos 的雏形。Fast Paxos 把提案分成两类:经典提案(classic)走完整两阶段,由主节点协调;快速提案(fast)允许客户端直接把值发给所有接受者,跳过主节点,只要接受者检测到无冲突就直接 accept。但快速提案需要更大的 quorum——不是过半,而是超过三分之二——来换取跳过协调者的自由。周掌柜的"寻常议案用蓝纸"就是 fast path:不求九取五,但要求每组都有人点头(隐含了更严格的分布条件);"重大议案用黄纸"是 classic path:完整流程,九取五,万无一失。
Fast Paxos 的代价是明显的:快速路径的 quorum 更大(三分之二以上),经典路径的 quorum 可以更小(过半)。周掌柜没算明白的是,他的"两组通过"如果严格对应算法,应该是每组至少两人——三组各三人,每组取二,总票数六,超过九的三分之二——这才满足 fast quorum 的安全条件。他实际执行的"四票"(两组各二,第三组零)根本不够。
—
周掌柜晚年把位子传给儿子,儿子又传给孙子。传到第三代时,联合会已经扩到十五名理事,分成五组。某年,年轻的周会首读了一本从西洋译来的新书,忽然把老章程全废了。
新规矩只有一条:议案通过所需票数,随议案性质而变。寻常事务,九票即可——十五取九,刚过六成。涉及银钱交割的,十一票——十五取十一,过七成三分。更动会章本身的,十三票——十五取十三,过八成七分。只有罢免会首一职,才须十五票全到。
这弹性门槛让理事们起初很不适应。但周会首算了一笔账:寻常事务若硬求十五取八,万一有三五人告假,议案常年搁浅;而罢免会首这种大事,若只凭八票就能通过,会首人人自危,谁还肯实心任事?不同的事,该有不同的稳当程度。
这套新法,叫 Flexible Paxos。它把 quorum 从固定的"过半数"解放出来,变成可配置的交集条件:prepare quorum 和 accept quorum 不必相等,只要保证任何两个 quorum 有交集即可。十五名理事,prepare 取 Q1、accept 取 Q2,条件只有一条:Q1 + Q2 > 15,且 Q1、Q2 各自都大于 15 的一半(保证每个 quorum 内部有交集)。于是可以 Q1=8、Q2=8(经典),也可以 Q1=6、Q2=10(牺牲一点准备效率换接受安全),甚至可以 Q1=13、Q2=3——准备阶段极严,接受阶段极宽,适合"一旦立项就快速推进"的场景。
Flexible Paxos 的直觉是:分布式共识的安全,本质不是"多少人同意",而是"不同阶段的同意者必须碰头"。只要 prepare 阶段的人和 accept 阶段的人必有重叠,就没有人能凭空捏造一个从未被提议的值。周会首的弹性门槛,不过是把这层直觉显式化了。
—
民国十六年,联合会散伙。老理事们各奔东西,有人北上去天津,有人南下到香港。但那份弹性门槛的章程,被抄进了一本手抄簿,夹在货栈的旧账箱里。
五十年后,一个搞计算机的年轻人在祖父的遗物里翻到这本簿子。他正为一个分布式数据库的共识模块头疼:地理复制的五数据中心,跨洋延迟三百毫秒, classic Paxos 的两阶段每次都要等最慢的那个节点,事务吞吐量卡死在每秒几十笔。他盯着簿子上的数字——十五取九、十五取十一、十五取十三——忽然想通了一件事:quorum 的大小不是物理定律,是人为约定的契约。只要契约的自洽性保住(Q1 + Q2 > N),就可以把门槛拆成几档,让寻常事务走宽门、紧要事务走窄门。
他把这个想法写进了一篇论文,投给一个数据库会议。审稿人问他:这和 Fast Paxos 有什么区别?他答:Fast Paxos 是"同一件事有两条路",Flexible Paxos 是"不同的事有不同的门"。审稿人又问:这能保证安全吗?他答:只要任意两个 quorum 有交集,就能保证——这不是我发明的,这是上海一个货栈联合会光绪年间就写在章程里的。
论文录用了。附录里,他放了一张老照片:泛黄的纸页上,毛笔字写着"寻常九、银钱十一、更章十三、罢首十五",落款是"周氏三代订"。
—
概念解析
Multi-Paxos 是 Paxos 的工程化变体,核心优化是稳定主节点:一个任期(term/epoch)内由单一 leader 垄断提议权,跳过 prepare 阶段,直接进入 accept,把两阶段压缩成一阶段。这极大提升了正常情况下的性能,但保留了主节点失效时的完整恢复流程(重新选主、新 prepare)。Raft([✓#6 传灯人])的算法结构直接继承 Multi-Paxos 的"term + leader + 日志复制"框架,只是用更工程化的方式重新表述。
Fast Paxos 由 Lamport 于 2006 年提出,允许客户端在无冲突时跳过 leader,直接把值广播给 acceptors。快速路径需要更大的 quorum(通常 > 2N/3)来补偿缺少 leader 协调的安全缺口;若检测到冲突(多个客户端同时提议不同值),则回退到 classic path 由 leader 仲裁。Fast Paxos 的 trade-off 是:低延迟 vs 高吞吐量——快速路径省掉一轮 RTT,但需要更多节点响应;经典路径容忍更多节点延迟,但多一轮消息。
Flexible Paxos(2016,Howard et al.)进一步放松 quorum 约束:prepare quorum(Q1)和 accept quorum(Q2)不必相等,只要满足 Q1 + Q2 > N 且 Q1, Q2 > N/2。这允许根据 workload 定制 quorum 大小——读多写少的场景可以放大 Q2(接受更严、读取更宽),地理分散的场景可以调整 Q1/Q2 比例来平衡延迟与容错。Flexible Paxos 证明了一个反直觉的结论:共识的安全不依赖"多数派"这个具体数字,而依赖"quorum 交集"这个拓扑条件。
三者的关系。 Multi-Paxos 解决"谁来提议"的问题,Fast Paxos 解决"能不能跳过协调者"的问题,Flexible Paxos 解决"门槛该定多高"的问题。它们可以叠加:一个系统先用 Multi-Paxos 选出稳定 leader,再用 Fast Paxos 处理无冲突的快速写入,最后用 Flexible Paxos 根据地理拓扑动态调整 quorum 大小。现代数据库如 Spanner、CockroachDB、TiDB 的共识层,本质都是这三层变体的工程组合。
周掌柜的"三组轮发"对应 Multi-Paxos 的 leader 轮换;"蓝纸黄纸"对应 Fast Paxos 的 classic/fast path;"弹性门槛"对应 Flexible Paxos 的可配置 quorum。 货栈联合会没有数学家,但码头上的延迟、告假、派系博弈,逼出了同样的结构——分布式共识的困难从不依赖理论发明,它依赖的是在分散节点间协调时,人(或机器)必须做出的共同约定。