分布式系统 · 深入教程(概念为主 · deep-dive)
分布式系统:从「为什么这么难」到 CAP 权衡
一套把分布式系统重组成一条因果链的教程:所有机制,都是对同一个物理事实的不同应对。8 章正文 + 自检 · 约半天读完 · 理论核心截至 2026-06 · 概念为主,不依赖可运行代码。
§适合谁
这份教程面向一类具体的读者。三条前置能力:
- 写过多线程 / 并发代码,知道锁、竞态、内存可见性这些单机并发问题,也用过数据库事务。
- 用过至少一个分布式中间件(Redis 集群 / Kafka / MySQL 主从 / etcd / ZooKeeper 任一),但更多停留在「会调 API」,没系统理解过背后的原理。
- 读得懂伪代码和时序图;遇到「为什么这样设计」会想刨根问底,而不是记住结论就走。
§不适合谁
- 完全没接触过后端或并发——先补单机并发与数据库事务,再回来。
- 只想要「Redis 怎么配集群」这类操作手册——查对应中间件的官方文档更快。
- 要的是论文级形式化证明——直接读《Designing Data-Intensive Applications》和每章参考里的原始论文。
§读完之后你能做到什么
你会把「分布式系统」从一堆零散名词(CAP、Raft、最终一致性、2PC)重组成一条因果链——所有机制都是对「节点无法区分慢和死、没有可信的全局时钟」这一个物理事实的不同应对。于是面对任何新系统,你能先问「它分区时选 C 还是 A、用什么给事件定序、靠什么达成一致」,而不是去背它的功能清单。
具体地,读完你应该能:
- 判断一个系统是 CP 还是 AP,并说出它在网络分区时具体牺牲了什么。
- 看到「最终一致」「quorum」「LWW」,立刻说出它不保证什么。
- 给定一致性需求,在单主 / 无主 / 共识复制之间选对,而不踩 LWW 静默丢数据的陷阱。
- 讲清 Raft 怎么选主、怎么保证已提交的日志在换届后不丢失。
- 设计一把真正安全的分布式锁(共识锁 + fencing token),并说清朴素 Redis SETNX 为什么不够。
- 区分 exactly-once 投递(不可能)与 exactly-once 处理(可达),并说出后者靠什么实现。
一句话本质
- 根因:节点只能靠不可靠、延迟无上界的网络互相了解,所以无法区分一个节点是「慢」还是「死」。一致性、共识、复制、事务、CAP,全是这个约束下的不同取舍。
- 时序:分布式系统里没有可信的「现在几点」,唯一客观的顺序是因果序(happens-before)。用物理时间戳排序会静默丢数据;逻辑时钟才是定序的正确工具。
- 共识:「多个节点同意一个值」等价于线性一致 CAS / 全序广播 / leader 选举 / 锁服务;Raft 用 leader + term + 多数派把这个等价类变得可理解。
§现状速览(截至 2026-06)
稳定:理论核心 Paxos(1998)/ CAP(2000)/ Raft(2014)已稳定二十余年;Spanner + TrueTime(2025 获 ACM SIGMOD Systems Award)、HLC(CockroachDB / YugabyteDB,免原子钟)、FoundationDB 的确定性模拟测试,都已是成熟做法。
仍在快速变化:有界时钟 + HLC 让全球一致事务在普通硬件上实用化(Amazon Aurora DSQL 2024-12 GA);CRDT 走向主流(Automerge 3.0,2025-05,协同编辑 / local-first);老协议 VSR 复兴(TigerBeetle,Jepsen 2025-06 验证);连「已解决」的 Raft 租约都被发现普遍实现有误(LeaseGuard,2025-12,etcd / HashiCorp / TiDB 均中招)。
已被取代:用纯 NTP 物理时钟给事务定序(被 HLC / 有界时钟取代)、naive 3PC(被共识取代)。第 8 章详述。
这套教程刻意在每章末放了自测和「刚好够不着」的进阶题。原因是:读起来顺,不等于学进去了。如果出现下面三种自我感觉,多半是错觉,回到那一节重做练习:
「我读得很顺」——顺只说明熟悉,不说明掌握;
「我做题很快」——快往往是因为题型眼熟,没真正调用理解;
「我没卡壳」——没卡壳常常意味着没触到真正的难点。
§概念地图
§学习路径建议
顶部面包屑就是主线(00 → 09)。按目的可以走不同路径:
- 只想建立心智模型:按 01 → 08 顺序读,先跳过每章的「进阶挑战」,最后用 09 的判别题检验。
- 准备 mid-senior 面试:重点 03(一致性)/ 04(复制)/ 06(共识)/ 08(CAP),把每章自测和 09 判别题当成口述练习。
- 工作中要做技术选型:先读 08(CAP / PACELC)+ 09 判别场景,再按需回头补 03 / 04 / 06。
§目录
- 01 · 为什么分布式系统这么难——partial failure、timeout 的真相、FLP、故障检测。
- 02 · 时间、时钟与因果序——物理时钟为何危险,Lamport / 向量时钟 / HLC。
- 03 · 一致性模型谱系——线性→因果→最终,会话保证,CRDT,三个 C 之辨。
- 04 · 复制——单主 / 多主 / 无主,quorum,LWW 陷阱,脑裂。
- 05 · 分区与路由——一致性哈希、虚拟节点、再平衡、热点。
- 06 · 共识——Raft 三子问题、Paxos、租约与分布式锁。
- 07 · 分布式事务——2PC / 3PC / TCC / Saga、幂等与 exactly-once。
- 08 · CAP、PACELC 与综合权衡——精确表述、真实系统映射、前沿。
- 09 · 自测与场景判别——三层题库 + 跨章节判别场景 + 亲手画地图。
§学完之后
本教程刻意收在「崩溃容错(crash fault)」边界内。再往外,四个方向各给你的 schema 加一块:
- 拜占庭容错(BFT / PBFT、区块链共识):本教程假设节点会崩但不会作恶;BFT 放开这个假设,节点可以撒谎。
- 成员管理与 gossip(SWIM):节点怎么发现彼此、怎么把成员变更传播开——补上 01 章故障检测的「集群级」一半。
- 流处理一致性(Kafka Streams / Flink exactly-once):把 07 章的幂等与 exactly-once 放进流式场景。
- 精读一个真实系统:挑 etcd / Cassandra / Spanner 之一,对照本教程的机制地图读它的论文或源码——把「认得」变成「拆得开」。
- 系统架构设计(大规模系统设计 · 架构与权衡):把这里的理论机制接到工程落地——负载均衡、缓存、消息队列、熔断限流、可观测性、前沿演进。这份讲「为什么成立」,那份讲「怎么设计」。