图灵奖系列 · DoggyDad 原创
Leslie Lamport:他让分布式系统从"混沌"变成"秩序",用逻辑时钟和Paxos算法,为云计算时代奠定理论基础
Leslie Lamport:他让分布式系统从"混沌"变成"秩序",用逻辑时钟和Paxos算法,为云计算时代奠定理论基础
ANSWER-FIRST SUMMARY
本文回答什么问题
Leslie Lamport:他让分布式系统从"混沌"变成"秩序",用逻辑时钟和Paxos算法,为云计算时代奠定理论基础
- 主题分类:图灵奖系列
- 关键词:图灵奖、计算机历史、算法、人工智能、数据库
- 人物实体:Leslie Lamport
图灵奖第四十八届(2013)| Leslie Lamport:他让分布式系统从”混沌”变成”秩序”,用逻辑时钟和Paxos算法,为云计算时代奠定理论基础
一句话概括:当所有人都在写代码时,他在写”规范”;当所有人忙于调试分布式系统时,他用数学证明系统的正确性。从逻辑时钟到Paxos共识算法,从拜占庭将军问题到TLA+形式化语言,Lamport让分布式系统从依赖运气的”黑魔法”进化为可证明正确的工程科学。顺便,他还发明了LaTeX,改变了全世界科学论文的写作方式。
🏆 获奖简介
Leslie Lamport(莱斯利·兰波特,1941-)是分布式系统理论的奠基人,时序逻辑和形式化方法的先驱,LaTeX排版系统的发明者。
Leslie Lamport:
-
出生时间:1941年2月7日
-
出生地点:美国纽约
-
主要成就:
- 逻辑时钟(Logical Clocks)和happens-before关系的发明者
- Paxos共识算法的创造者
- 拜占庭将军问题(Byzantine Generals Problem)的提出者
- TLA+(Temporal Logic of Actions)形式化规范语言的设计者
- LaTeX文档排版系统的开发者
-
工作经历:
- SRI International(1970-1977)
- Compaq(后被惠普收购,1977-2001)
- 微软研究院(2001-退休)
-
获奖年份:2013年
-
获奖原因:对分布式和并发系统的理论与实践作出的根本性贡献,尤其是逻辑时钟、因果关系、安全性和活性等概念,以及Paxos算法和TLA+规范语言
为什么他是第四十八位? 1970年代,随着计算机网络的兴起,分布式系统成为新挑战——多台机器如何协作?时间如何同步?如何达成一致?Lamport用数学和逻辑回答了这些根本问题。他在1978年提出的”逻辑时钟”和”happens-before”关系,第一次严格定义了分布式系统中的”时间”和”因果”;1982年的拜占庭将军问题,揭示了容错共识的本质;1990年代的Paxos算法,成为分布式一致性的”圣杯”,被Google Chubby、Apache ZooKeeper等系统广泛采用。他还倡导”先写规范再写代码”,创造了TLA+语言,让Amazon、Microsoft等公司用形式化方法验证关键系统。今天的云计算、大数据、区块链,都建立在Lamport奠定的理论基础之上。
🚀 Leslie Lamport的重大贡献
1. 逻辑时钟:重新定义分布式系统中的”时间”
问题的起源(1970年代):
分布式系统中的挑战:
- 多台机器没有统一的物理时钟
- 消息传递有延迟,且顺序不确定
- 如何判断两个事件的先后顺序?
- 如何调试和理解系统行为?
传统方法的失败:
- 物理时钟:
- 不同机器的时钟有偏差(drift)
- 网络延迟不可预测
- 无法可靠确定因果关系
- 全局时间戳服务:
- 成为性能瓶颈
- 单点故障风险
Lamport的突破:“Time, Clocks, and the Ordering of Events in a Distributed System”(1978)
核心洞察:
在分布式系统中,重要的不是事件发生的绝对时间,而是事件之间的因果关系(causality)。
Happens-Before关系(→)
定义: 对于事件a和b,“a → b”(a happens-before b)当且仅当:
- 局部顺序:a和b在同一进程,且a在b之前
- 消息传递:a是发送事件,b是接收同一消息的事件
- 传递性:如果a → b且b → c,则a → c
如果既非a → b也非b → a:
- a和b是并发的(concurrent),记为 a || b
- 无法确定先后,也不需要确定!
逻辑时钟算法
规则:
- 每个进程维护一个计数器 C(初始为0)
- 本地事件:执行事件时,C := C + 1
- 发送消息:将当前 C 附加到消息中
- 接收消息:
- 设消息时间戳为 T
- 更新 C := max(C, T) + 1
性质: 如果 a → b,则 C(a) < C(b) (注意:反之不一定成立!)
示例:
进程P1: e1(1) --发送m(1)--> e3(3)
进程P2: e2(1) --接收m(1)--> e4(max(1,1)+1=2) --> e5(3)
解释:
- P1的e1时间戳=1,发送消息m
- P2的e2时间戳=1,接收消息m
- P2更新时间戳为max(1,1)+1=2
- P2的e5时间戳=3
全序扩展:Lamport时间戳
问题: 逻辑时钟只给出偏序(partial order),有时需要全序(total order)
解决:
- 时间戳 = (C, ProcessID)
- 排序规则:(C1, P1) < (C2, P2) 当且仅当
- C1 < C2,或
- C1 = C2 且 P1 < P2
应用:
- 分布式互斥:多个进程竞争资源,按时间戳顺序授予
- 因果一致性:数据库复制中保持因果顺序
- 调试与监控:重建分布式系统的事件顺序
向量时钟(Vector Clocks)
Lamport时钟的局限:
- C(a) < C(b) 不能推出 a → b(可能是并发)
改进(Fidge & Mattern, 1988,基于Lamport思想):
- 每个进程维护一个向量 V[1..n](n是进程数)
- V[i] = “我知道的进程i的逻辑时间”
规则:
- 本地事件:V[i] := V[i] + 1(i是本进程)
- 发送消息:附带整个向量 V
- 接收消息:
- 设消息向量为 V’
- V := max(V, V’)(逐元素取最大)
- V[i] := V[i] + 1
关键性质: a → b 当且仅当 V(a) < V(b)(向量的每一维都不大于,且至少有一维严格小于)
应用:
- Amazon Dynamo:检测数据版本冲突
- Git:追踪提交的因果关系
- 调试工具:精确重现并发bug
2. 拜占庭将军问题:容错共识的极限
问题的起源(1982):
Lamport提出了一个经典比喻:
场景:
- 拜占庭军队围攻敌城
- 多个将军各领一支部队
- 必须协调一致:全体进攻或全体撤退
- 但有些将军是叛徒,会发送矛盾信息
挑战:
- 忠诚将军如何达成一致?
- 即使有叛徒捣乱?
拜占庭容错(Byzantine Fault Tolerance)
形式化定义:
在一个有 n 个进程的系统中,最多有 f 个进程可能出现拜占庭故障:
- 可能停止工作(crash)
- 可能发送错误或矛盾的消息
- 可能恶意破坏(被黑客控制)
目标:
- 一致性(Agreement):所有正常进程决定相同的值
- 有效性(Validity):如果所有正常进程提议相同值v,则决定v
- 终止性(Termination):所有正常进程最终做出决定
Lamport-Shostak-Pease定理(1982)
不可能性结果: 如果使用口头消息(无签名),则:
- 需要 n ≥ 3f + 1 才能容忍 f 个拜占庭故障
- 即至少需要2/3多数是正常的
例子:
- f=1(1个叛徒),需要至少n=4个将军
- f=2,需要n=7
可能性结果: 如果使用签名消息(无法伪造),则:
- n ≥ f + 1 即可(只需多数正常)
算法:口头消息OM(m)
OM(0)(基础情况):
- 指挥官发送值v给所有副官
- 每个副官使用收到的值(如果没收到,用默认值)
OM(m)(m > 0):
- 指挥官发送值v给所有副官
- 每个副官i:
- 设收到的值为vᵢ(如果没收到,用默认值)
- 作为新指挥官,执行OM(m-1)向其他副官发送vᵢ
- 每个副官收集所有值,使用majority(v₁, v₂, …, vₙ)
为什么需要3f+1?
直观例子(f=1, n=3):
将军A(指挥官,可能叛徒)、将军B、将军C
场景1:A是叛徒
- A对B说"进攻",对C说"撤退"
- B和C互相告知听到的命令
- B听到:A说"进攻",C说"A说撤退" -> 无法确定!
- C听到:A说"撤退",B说"A说进攻" -> 无法确定!
结论:3个将军无法容忍1个叛徒!
如果有4个将军(f=1, n=4):
- 即使1个是叛徒,其他3个能通过多数投票达成一致
实际应用
航空航天:
- NASA航天飞机:多个计算机冗余,容忍故障
- 波音787:飞控系统使用拜占庭容错
区块链:
- 比特币:工作量证明(PoW)解决拜占庭共识
- 假设算力的多数是诚实的
- Practical Byzantine Fault Tolerance (PBFT):
- Castro & Liskov(1999,基于Lamport理论)
- 用于联盟链(Hyperledger Fabric等)
- 以太坊2.0:Casper共识(BFT变种)
分布式数据库:
- 防止恶意节点破坏数据一致性
3. Paxos算法:一致性的”圣杯”
问题的起源(1990年):
场景:
- 多台服务器需要对某个值达成一致(例如:选举领导者、决定事务是否提交)
- 网络不可靠:消息可能延迟、丢失、重复
- 服务器可能崩溃(但假设不是拜占庭故障)
目标:
- 一致性:所有服务器最终同意同一个值
- 容错性:只要多数服务器存活,系统就能工作
- 不阻塞:不能因为少数服务器崩溃而永久卡住
Paxos的诞生
传奇故事:
- Lamport在1990年写了论文《The Part-Time Parliament》
- 用希腊Paxos岛上的议会作比喻
- 议员(servers)兼职,经常不在(crash)
- 但议会仍能通过法案(reach consensus)
论文命运:
- 1990年投稿,被拒!
- 审稿人:“太晦涩,看不懂”
- Lamport:“他们没幽默感”
- 1998年才正式发表(8年后!)
- 2001年Lamport写了《Paxos Made Simple》
- 开篇:“Paxos算法很简单(但大家都觉得难)“
Paxos算法详解
角色:
- Proposer:提议者,提出值
- Acceptor:接受者,投票决定接受哪个值
- Learner:学习者,学习被选定的值 (实际系统中,一个节点可以同时扮演多个角色)
两阶段协议:
Phase 1: Prepare(准备阶段)
- Proposer选择一个提案编号 n,发送 Prepare(n) 给多数Acceptors
- Acceptor收到 Prepare(n):
- 如果 n > 之前见过的最大编号:
- 承诺不再接受编号 < n 的提案
- 回复已接受的最高编号提案(如果有)
- 否则:忽略
- 如果 n > 之前见过的最大编号:
Phase 2: Accept(接受阶段)
- Proposer收到多数Acceptors的回复:
- 如果有Acceptor已接受某个值v:选择最高编号对应的v
- 否则:自由选择值v
- 发送 Accept(n, v) 给多数Acceptors
- Acceptor收到 Accept(n, v):
- 如果没承诺过更大的编号:接受(n, v)
- 否则:拒绝
- 如果多数Acceptors接受(n, v):v被选定(chosen)
关键不变式:
- 一旦值v被选定(多数接受),任何后续提案都会提议v
- 保证了一致性!
示例执行
假设5个Acceptors(A1-A5),需要3个多数
提议者P1想提议值X:
1. P1发送Prepare(1)给A1,A2,A3
2. A1,A2,A3回复:OK(没有之前的提案)
3. P1发送Accept(1, X)给A1,A2,A3
4. A1,A2,A3接受(1, X)
5. X被选定!
并发场景:P2也想提议值Y:
1. P2发送Prepare(2)给A3,A4,A5
2. A3回复:(1, X)(已接受) A4,A5回复:OK
3. P2必须提议X(根据协议),发送Accept(2, X)给A3,A4,A5
4. A3,A4,A5接受(2, X)
5. 仍然是X!(一致性保持)
Paxos的变种与优化
Multi-Paxos:
- 选举一个稳定的领导者(Leader)
- Leader可以跳过Prepare阶段(已经获得承诺)
- 大幅提升性能
Fast Paxos:
- 在无冲突时,一轮完成(而非两轮)
- 需要更大的多数(3/4而非1/2)
Egalitarian Paxos(EPaxos):
- 无固定Leader,所有节点平等
- 更好的负载均衡
实际应用
Google Chubby:
- 分布式锁服务
- 基于Multi-Paxos
- Google内部广泛使用(BigTable、MapReduce等)
Apache ZooKeeper:
- 开源协调服务
- 使用ZAB协议(类Paxos)
- Hadoop、Kafka、HBase等依赖它
etcd:
- Kubernetes使用的配置存储
- 使用Raft协议(Paxos的易理解变种,2014年)
Microsoft Azure Storage:
- 跨数据中心的数据复制
- 使用Paxos确保一致性
4. TLA+:用数学规范系统
问题的起源(1990年代):
软件危机:
- 分布式系统越来越复杂
- 并发bug极难调试(不可重现、罕见场景)
- 测试无法覆盖所有场景
传统方法的失败:
- 单元测试:只测试已知场景
- Code Review:人脑难以推理复杂并发
- 上线后发现bug:代价巨大(Amazon 2008年S3故障,损失数百万美元)
Lamport的愿景:“先写规范,再写代码”
核心思想:
- 系统的规范(Specification)应该是数学的、可验证的
- 在写代码之前,先写规范
- 用工具自动检查规范的正确性
- 代码实现应该符合规范
TLA+(Temporal Logic of Actions Plus)
设计目标:
- 表达力:能描述复杂的分布式系统、并发算法
- 数学严格:基于时序逻辑(Temporal Logic)
- 工具支持:可用模型检查器(TLC)自动验证
- 实用性:工程师能学会(不需要博士学位)
TLA+核心概念
状态机(State Machine):
- 系统是状态的序列:s₁ → s₂ → s₃ → …
- 每个状态是变量的赋值
- 动作(Action)是状态间的转移关系
时序逻辑:
- □P(Always P):P在所有状态都成立
- ◇P(Eventually P):P在将来某个状态成立
- P ~> Q(P leads to Q):如果P成立,最终Q会成立
示例:简单互斥锁
---- MODULE SimpleMutex ----
EXTENDS Integers, TLC
CONSTANTS N \* 进程数
VARIABLES flag, turn \* flag[i]表示进程i想进入临界区,turn表示轮到谁
Init ==
/\ flag = [i \in 1..N |-> FALSE]
/\ turn = 1
RequestCS(i) == \* 进程i请求进入临界区
/\ ~flag[i] \* 当前不在临界区
/\ flag' = [flag EXCEPT ![i] = TRUE]
/\ turn' = turn
EnterCS(i) == \* 进程i进入临界区
/\ flag[i]
/\ turn = i
/\ flag' = flag \* 状态不变
/\ turn' = turn
ExitCS(i) == \* 进程i离开临界区
/\ flag[i]
/\ flag' = [flag EXCEPT ![i] = FALSE]
/\ turn' = (turn % N) + 1
Next == \E i \in 1..N :
\/ RequestCS(i)
\/ EnterCS(i)
\/ ExitCS(i)
Spec == Init /\ [][Next]_<<flag, turn>>
MutualExclusion == \* 安全性:最多一个进程在临界区
\A i, j \in 1..N : (i /= j) => ~(flag[i] /\ turn = i /\ flag[j] /\ turn = j)
NoStarvation == \* 活性:每个请求最终被满足
\A i \in 1..N : flag[i] ~> (turn = i)
====
TLC模型检查器:
- 穷举所有可能的状态和转移
- 检查是否违反安全性(Safety)和活性(Liveness)
- 如果发现违反,给出反例trace
TLA+的实际应用
Amazon Web Services:
- S3(对象存储):用TLA+验证复制协议
- DynamoDB(NoSQL数据库):验证分布式事务
- EBS(块存储):验证故障恢复逻辑
- 案例:发现了设计文档中未曾考虑的微妙bug
Microsoft:
- Azure Cosmos DB:验证一致性协议
- Xbox Live:验证后端服务
Oracle:
- Java JDK:验证并发数据结构(如ConcurrentHashMap)
成功故事(Chris Newcombe, Amazon):
“We have used TLA+ on 10 large complex real-world systems. In every case, it found bugs. Many of these bugs were subtle and would have caused serious outages.” (我们在10个大型复杂系统上使用TLA+,每次都发现了bug。很多bug非常微妙,会导致严重故障。)
5. LaTeX:顺便改变了科学写作
背景(1980年代):
问题:
- 科学论文需要大量数学公式
- 当时的文字处理软件(如Word)排版质量差
- Donald Knuth发明了TeX(1978),但语法复杂
Lamport的解决:
- 基于TeX,创造了LaTeX(1984)
- 提供更高级的宏和文档结构(章节、引用、图表)
- “让作者专注于内容,而非格式”
LaTeX的影响
学术界:
- 几乎所有数学、物理、计算机论文使用LaTeX
- 主要会议和期刊提供LaTeX模板
出版业:
- Springer、Elsevier等出版社接受LaTeX稿件
数学公式:
爱因斯坦质能方程:
E = mc^2
薛定谔方程:
i\hbar\frac{\partial}{\partial t}\Psi = \hat{H}\Psi
文档结构:
\documentclass{article}
\begin{document}
\title{My Paper}
\author{Leslie Lamport}
\maketitle
\section{Introduction}
This is a paper...
\end{document}
遗产:
- 今天的科学家、工程师,很多人用LaTeX写作
- 虽然Lamport更想因为Paxos被记住,但可能更多人因为LaTeX认识他!
🌍 对世界的深远影响
对云计算的影响
云基础设施的基石:
- Google Spanner:全球分布式数据库,使用Paxos
- Amazon DynamoDB:使用Paxos变种
- Microsoft Azure:多个服务使用TLA+验证
容器编排:
- Kubernetes:etcd使用Raft(Paxos简化版)
- 管理集群状态
- 服务发现、配置管理
大数据:
- Apache ZooKeeper:Hadoop生态的协调者
- Apache Kafka:使用ZooKeeper管理集群元数据
对区块链的影响
共识机制:
- BFT类算法:直接基于Lamport的拜占庭将军问题
- Tendermint(Cosmos)
- HotStuff(Libra/Diem)
- PBFT(Hyperledger)
因果关系:
- DAG(有向无环图)区块链:
- IOTA、Nano等
- 使用happens-before关系排序交易
形式化验证:
- Tezos:智能合约用形式化方法验证
- 防止DAO事件(2016年,价值5000万美元被盗)
对形式化方法的影响
从学术到工业:
- 之前:形式化方法被认为”太学术,不实用”
- Lamport的推动:证明TLA+可以在工业界应用
- 结果:Amazon、Microsoft等公司采纳
航空航天:
- Airbus A380:飞控软件部分用形式化方法验证
- SpaceX:Dragon飞船软件使用形式化技术
金融业:
- 交易系统:用形式化方法验证正确性
- 智能合约审计:查找漏洞
对计算机科学教育的影响
分布式系统课程:
- 逻辑时钟、Paxos是标准教学内容
- MIT 6.824、CMU 15-440等经典课程
形式化方法课程:
- TLA+成为教学工具
- 教学生”如何思考并发”
经典论文:
- Lamport的论文是必读经典
- “Time, Clocks”是被引用最多的分布式系统论文之一(超过1万次)
🏆 获奖理由(通俗版)
ACM官方表彰:“对分布式和并发系统的理论与实践作出的根本性贡献,尤其是逻辑时钟、因果关系、安全性和活性等概念,以及Paxos算法和TLA+规范语言。”
更通俗的理解:
Lamport回答了分布式系统的三个根本问题:
-
什么是”时间”?
- 在没有统一时钟的世界,逻辑时钟定义了因果关系
- 从调试到一致性协议,都依赖这一基础
-
如何达成一致?
- 拜占庭将军问题:揭示了容错共识的极限
- Paxos算法:实用的一致性协议,支撑了整个云计算产业
-
如何确保系统正确?
- TLA+:用数学规范系统,在代码之前捕获bug
- 从”事后调试”到”事前验证”的范式转变
他的哲学:
“如果你没有想清楚要构建什么(规范),你怎么知道你构建对了?”
👤 个人生平与传奇
早年(1941-1970)
出生与教育:
- 1941年:出生于纽约
- 童年:数学天赋显现,喜欢解谜题
- 1960年:MIT数学学士
- 1963年:Brandeis大学数学硕士
- 1972年:Brandeis大学数学博士
- 论文主题:偏微分方程(并非计算机科学!)
转向计算机:
- 博士期间开始接触计算机
- 发现对并发和分布式系统的兴趣
职业生涯(1970-2001)
SRI International(1970-1977):
- 研究并发程序的验证
- 发表早期重要论文
Digital Equipment Corporation (DEC):
- 后被Compaq收购,再被HP收购
- 黄金时期:1977-2001
- 发表了逻辑时钟、拜占庭将军、Paxos等奠基性工作
- 开发了LaTeX
微软研究院(2001-退休):
- 继续研究TLA+
- 推广形式化方法
- 指导年轻研究者
性格与趣闻
严谨到近乎刻薄:
- Lamport以论文写作的高标准闻名
- 他的论文清晰、优雅、自洽
- 对模糊的概念和论证毫不留情
幽默感:
- Paxos论文用希腊小岛议会做比喻,被审稿人批评”太晦涩”
- Lamport回应:“我只是想让论文有趣一点”
- 后来写了《Paxos Made Simple》,开篇讽刺:“Paxos很简单(但你们都说难)”
对LaTeX的态度:
- 很多人因为LaTeX认识Lamport
- 但他更想因为分布式系统被记住
- 有人问:“你因为什么最出名?”
- Lamport:“可能是LaTeX,虽然我希望是Paxos”
经典名言:
“Writing is nature’s way of letting you know how sloppy your thinking is.” (写作是大自然让你知道你的思维有多混乱的方式。)
“A distributed system is one in which the failure of a computer you didn’t even know existed can render your own computer unusable.” (分布式系统是指:一台你都不知道存在的计算机的故障,会让你的计算机无法使用。)
荣誉
- 图灵奖(2013)
- IEEE Emanuel R. Piore Award(2004)
- Dijkstra Prize(2000,2005,2014):三次获奖!
- IEEE John von Neumann Medal(2008)
- 美国国家工程院院士
- 美国国家科学院院士
退休后
仍活跃:
- 维护TLA+工具
- 活跃于TLA+社区
- 偶尔参加会议,分享见解
人生哲学:
“The only way to write complex systems is to make them so simple that there are obviously no bugs, not so complex that there are no obvious bugs.” (编写复杂系统的唯一方法是让它们简单到显然没有bug,而不是复杂到没有显然的bug。)
💭 为什么他值得纪念?
1. 他定义了分布式系统的基础概念
逻辑时钟和happens-before:
- 在Lamport之前,没有人严格定义过分布式系统中的”时间”
- 这一工作开启了整个研究领域
- 今天几乎所有分布式系统论文都引用这一概念
类比: 就像牛顿定义了”力”和”质量”,Lamport定义了分布式系统的基本语言。
2. Paxos:从理论到实践的桥梁
理论意义:
- 证明了在异步网络中,可以实现容错一致性
- 优雅地解决了看似不可能的问题
实践影响:
- Google、Amazon、Microsoft的关键基础设施
- 支撑了数十亿美元的云计算产业
经久不衰:
- 1990年提出,2024年仍在广泛使用
- 30多年的理论,经得起实践检验
3. 他改变了工程师对”正确性”的认知
之前的范式:
- 写代码 → 测试 → 调试 → 上线 → 出bug → 修复 → 循环
Lamport的范式:
- 写规范(数学) → 验证规范(工具) → 写代码(实现规范) → 测试(确保符合规范)
影响:
- Amazon用TLA+避免了数百万美元的潜在损失
- 形式化方法从”学术玩具”变成”工业标准”
4. 跨领域影响
不仅是计算机科学:
- LaTeX:改变了科学写作(数学、物理、化学…)
- 时序逻辑:影响了验证理论、人工智能规划
多产且深刻:
- 100多篇论文
- 每篇都深思熟虑、影响深远
- 质量远胜数量
5. 榜样的力量
对年轻研究者:
- 证明了理论可以有巨大的实践影响
- 严谨的写作和清晰的思维是科学的基础
对工程师:
- 不要满足于”能运行”
- 追求”证明正确”
🔍 技术深度:Paxos与Raft的对比
Raft:Paxos的”易理解版本”
背景(2014):
- Paxos虽强大,但公认难懂
- Diego Ongaro和John Ousterhout(Stanford)设计了Raft
- 目标:“可理解性”(Understandability)是首要设计目标
Raft的核心思想
Leader选举:
- 系统中有且仅有一个Leader(而Paxos可能无Leader或多Leader)
- Leader处理所有客户端请求
- 如果Leader崩溃,选举新Leader
日志复制:
- Leader将操作追加到自己的日志
- 复制给Followers
- 多数确认后提交(commit)
状态:
- Follower:被动接收
- Candidate:竞选Leader
- Leader:处理请求
Raft vs Paxos
| 特性 | Paxos | Raft |
|---|---|---|
| 易理解性 | 困难(承认吧) | 易(有清晰的状态机) |
| Leader | 可选(Multi-Paxos需要) | 必须(强领导者) |
| 日志空洞 | 可能有(乱序接受) | 不会有(顺序追加) |
| 性能 | 理论上更优 | 实践中相当 |
| 工业应用 | Chubby, ZooKeeper | etcd, Consul |
Lamport对Raft的评价:
“Raft is Paxos made more complicated.” (Raft是把Paxos搞复杂了。)
但承认:
“However, it’s probably easier to understand.” (但确实可能更容易理解。)
工程中的权衡
选择Paxos的场景:
- 需要极致性能
- 无固定Leader更健壮(如EPaxos)
选择Raft的场景:
- 团队易于理解和维护
- 大多数云原生系统(Kubernetes等)
🧪 实践意义:学习TLA+
入门示例:银行转账
问题:
- 账户A转账100给账户B
- 并发场景:多个转账同时进行
- 确保不会出现”钱凭空消失”或”钱凭空产生”
TLA+规范:
---- MODULE BankTransfer ----
EXTENDS Integers
CONSTANTS Accounts \* 账户集合
VARIABLE balance \* 每个账户的余额
Init == balance = [a \in Accounts |-> 1000] \* 初始每个账户1000
Transfer(from, to, amount) ==
/\ amount > 0
/\ balance[from] >= amount \* 足够余额
/\ balance' = [balance EXCEPT
![from] = @ - amount,
![to] = @ + amount]
Next == \E from, to \in Accounts, amount \in 1..100 :
/\ from /= to
/\ Transfer(from, to, amount)
Spec == Init /\ [][Next]_balance
MoneyConservation == \* 不变式:总金额守恒
LET sum == CHOOSE s \in Int :
s = (CHOOSE f \in [Accounts -> Int] :
(\A a \in Accounts : f[a] = balance[a]) |->
(CHOOSE total : total = [a \in Accounts |-> balance[a]]))
IN sum = Cardinality(Accounts) * 1000
NoNegative == \* 不会出现负余额
\A a \in Accounts : balance[a] >= 0
====
模型检查:
- TLC穷举所有可能的转账序列
- 验证MoneyConservation和NoNegative始终成立
- 如果发现违反,给出具体的反例
实际建议
何时使用TLA+:
- 关键系统:故障代价高(金融、医疗、航空)
- 复杂并发:多线程、分布式协议
- 难以测试的场景:罕见竞态条件、故障恢复
学习路径:
- 阅读《Specifying Systems》(Lamport的书)
- 练习简单例子(互斥锁、队列)
- 分析实际系统(如Raft、Paxos的TLA+规范)
- 应用到自己的项目
📚 延伸阅读
经典论文
-
“Time, Clocks, and the Ordering of Events in a Distributed System” (CACM 1978)
- 逻辑时钟的开创性论文
- 每个分布式系统研究者的必读
-
“The Byzantine Generals Problem” (TOPLAS 1982)
- 拜占庭容错的经典表述
- 优雅且深刻
-
“The Part-Time Parliament” (TOCS 1998)
- Paxos的原始论文
- 有趣但确实难懂
-
“Paxos Made Simple” (2001)
- Lamport重写的简化版
- 仍然不简单,但好多了
书籍
-
Lamport: “Specifying Systems: The TLA+ Language and Tools for Hardware and Software Engineers”
- TLA+的权威指南
- 免费在线阅读
-
Cachin, Guerraoui, Rodrigues: “Introduction to Reliable and Secure Distributed Programming”
- 分布式系统教科书
- 大量使用Lamport的理论
课程
-
MIT 6.824: Distributed Systems
- 讲授Raft、Paxos、分布式存储
- 实验:实现Raft
-
CMU 15-440: Distributed Systems
- 深入Lamport的理论
- 实验:构建分布式文件系统
工具
- TLA+ Toolbox:集成IDE和模型检查器
- PlusCal:TLA+的算法式语言(更易写)
🌟 精神遗产
Lamport:“简单胜过复杂”
在一个推崇”敏捷”和”快速迭代”的时代,Lamport提醒我们:
- 思考先于编码
- 规范先于实现
- 简单胜过复杂
- 正确胜过快速
“The best programs are written so that computing machines can perform them quickly and so that human beings can understand them clearly. A programmer is ideally an essayist who works with traditional aesthetic and literary forms.” (最好的程序既能让计算机快速执行,又能让人类清晰理解。程序员理想中是一位散文家,使用传统的美学和文学形式工作。)
“先证明,再实现”
Lamport推动的形式化方法文化:
- 不满足于”测试通过”
- 追求”数学证明正确”
- 从”可能正确”到”一定正确”
这种文化在关键系统中越来越重要:
- 自动驾驶:人命关天
- 金融系统:资金安全
- 医疗设备:生命支持
长期主义
Lamport的研究不追逐热点:
- 1978年的逻辑时钟,2024年仍在用
- 1990年的Paxos,支撑了云计算时代
- 1999年的TLA+,正在被工业界采纳
启示: 真正重要的研究是解决基本问题,而非追随潮流。
总结语:Leslie Lamport是分布式系统的”牛顿”。就像牛顿定义了经典力学的基本概念(力、质量、运动),Lamport定义了分布式系统的基本语言(时间、因果、一致性、正确性)。
他的工作不仅是算法和协议,更是思维方式——如何用数学和逻辑思考复杂系统,如何在混沌中找到秩序,如何在代码之前用规范思考。从Google的数据中心到你手机上的每一个云应用,从区块链的共识机制到形式化方法的工业化,Lamport的思想无处不在。
在一个人人都在追求”快速迭代”的时代,Lamport教会我们慢下来思考。在一个人人都在写代码的时代,Lamport教会我们先写规范。在一个人人都依赖测试的时代,Lamport教会我们追求证明。这束始于1970年代的形式化与严谨之光,至今仍照亮着我们构建可信赖的分布式系统的道路。
最后更新: 2024年12月 本文为图灵奖系列文章,旨在以通俗方式介绍计算机科学先驱的贡献
DISCUSSION
评论与补充