SICI · 元婴五层 · 第二十一章

分布式系统原理 · 元婴五层·分布式道

你以为分布式系统就是多接几台机器。多出来的每一台机器,都是一道新的裂缝——光速有限、链路会断、节点会撒谎。你唯一的选择是:分区时,要一致性,还是要可用性?

分区之壁低语:「这五样东西,哪一样其实不需要分布式系统?赌一局。账,我记下了。」
序章

雾锁天机门

分布式之赌 · 反直觉下注 + 热区探索点亮

你推开天机门,门楣上刻着四个字:"多节点,共状态。"门内没有整齐的机房,只有一片翻涌的雾——雾里隐约可见无数光点在闪烁,像很多台机器在同时运转,却彼此看不见对方的屏幕。雾凝成一面横亘天际的半透明裂壁,壁面布满细密裂纹。

网络之海,TCP/IP协议栈
诺依曼老祖 诺依曼老祖

「分布式系统 = 多节点 + 消息传递 + 独立失败 + 共享状态。你以为多接几台机器就行——先过了它这关。」

分区之壁 分区之壁

「来得好。你既信'多接几台机器就行',与我赌一局——这五样东西,哪一样其实不需要分布式系统?」

分布式无例外预测挑战器

反直觉下注(五选一)→ 每件剪影打脸揭真相 → 五热区全亮拼合文明图谱

分区之壁逼你下注:这五样东西,哪一样其实不需要分布式系统?
第一幕 · 自信→裂缝

灵阵台 · 部分失败之渊

五节点灵阵 + 心跳检测 + 故障注入 + 断链之伤形成

石径尽头是一座悬空石台,台上漂浮着五枚光球——五台计算节点,由灵链两两相连。诺依曼老祖站在台边。

诺依曼老祖 诺依曼老祖

「一台机器坏了,你知道——它不亮了。五台里坏了一台呢?你看见的是四台在跑、一台在说谎。你怎么知道是哪一台?」

分区之壁 分区之壁

「多接几台机器嘛,这有什么难的。去吧。」

灵阵台 · 部分失败实验

搭建灵阵 → 注入静默故障 → 心跳阈值调节(误杀/漏检)→ 断链触发分区

第一幕 · 试错

复制殿 · 数据复制之幻

主从/多主/无主复制 · Quorum W+R>N · 冲突解决

灵阵台后是一座环形大殿,殿中央悬浮着一块发光的数据晶——你的本命数据。殿壁上刻着三种阵法图:主从阵、多主阵、无主阵。

诺依曼老祖 诺依曼老祖

「只存一份,坏了就没了。存多份呢?——多存一份,就多一份不一致的可能。」

分区之壁 分区之壁

「两个主节点同时写同一行,你觉得谁说了算?你连'谁先谁后'都答不上——因为你还没有全局时钟。」

复制策略三选一 · 后果推演

主从(单点+异步丢失)→ 多主(冲突爆发)→ 无主(W/R Quorum 调参)

主从阵
主写从复制,写入快
多主阵
多主并写,可用性高
无主阵
W/R Quorum,灵活
第一幕 · 第一崩塌

分区之壁初现 · CAP 定理

CP/AP/CA 三选一 · 不可能证明骨架 · BASE 妥协

复制殿地面忽然裂开——一面半透明的巨壁从裂缝中升起,把你的五节点灵阵劈成两半:左侧两台,右侧三台。诺依曼老祖的声音从壁的另一侧传来,模糊不清。

分区之壁 分区之壁

「这就是我。网络一定会分区——光缆会被挖断,交换机会丢包,机房会断电。你唯一的选择是:分区时,你要一致性,还是要可用性?」

诺依曼老祖 诺依曼老祖

「这是第一定律。不是你设计得不够好,是物理不允许。」

CAP 不可能相图探索器

CAP三角相图 → 三选一抉择推演 → CA触发不可能证明 → BASE浮现

选 CP
一致性优先
选 AP
可用性优先
选 CA
试图全都要
第二幕 · 短暂掌控

共识祭坛 · Paxos 协议

Prepare→Promise→Accept 三阶段 · 多数派 Quorum · 分区测试

壁后是一座环形祭坛,坛上漂浮着三枚"提案珠"和五枚"承诺珠"。诺依曼老祖的声音从远处传来。

诺依曼老祖 诺依曼老祖

「CAP 说你不能同时要 C 和 A。但如果多数节点同意同一个值——即使少数派被分区隔开,多数派仍然一致。这叫共识。有个协议叫 Paxos,1973 年提出,1998 年重写——花了一代人。它被证明是正确的。但没有人能读懂它。」

分区之壁 分区之壁

「正确但读不懂——这本身就是一种失败。」

Paxos 三阶段角色扮演

Proposer 提案 → Acceptor 承诺 → Learner 学习 → 分区注入看少数派

第二幕 · 第二崩塌

Raft 之环 · 共识流水线

Leader 选举 + 日志复制 + 分区注入脑裂 + Paxos/Raft 对比

祭坛化作一个圆环,五枚节点围环而坐。环上漂浮着一份协议卷轴——Raft。

诺依曼老祖 诺依曼老祖

「Raft 把共识拆成三件事:选 leader、复制日志、保安全。它比 Paxos 好懂——但分区时,它一样会让你痛。」

分区之壁 分区之壁

「上次你用 Paxos 绕我,这次用 Raft?好。我等着。」

Raft 共识流水线动画器

随机超时选 Leader → 日志复制流水线 → 分区注入脑裂 → 回滚 → Paxos/Raft 对比

第二幕 · 断链复发

事务天平 · 2PC/3PC 与一致性级别

2PC 阻塞(断链复发)+ 3PC 补救(断链愈合)+ 一致性级别权衡

天平殿里悬着一架巨型天平,左盘刻"Prepare",右盘刻"Commit"。天平下方是一条断裂的灵链——与 S1 灵阵台上断掉的那条一模一样。

诺依曼老祖 诺依曼老祖

「跨节点事务用 2PC:先 Prepare,再 Commit。但如果分区发生在 Prepare 和 Commit 之间——协调者联系不上参与者,参与者不知道该提交还是回滚。它们会永远等下去。」

分区之壁 分区之壁

「你 S1 断的那条链——还记得吗?它回来了。我帮你存着呢。现在它来收利息了。」

2PC/3PC 事务天平

2PC 执行(断链复发阻塞)→ 3PC 补救(断链愈合)→ 一致性级别滑块

第二幕 · 认知重构

时钟殿 · 没有全局时间

Lamport 逻辑时钟 + 向量时钟 + happens-before + TrueTime 彩蛋

时钟殿里没有钟。只有一面墙上挂满了碎裂的时钟——每个节点的时钟都显示不同的时间。

诺依曼老祖 诺依曼老祖

「单机有一个时钟,它说了算。五台机器有五个时钟——你说谁说了算?NTP 同步?同步有误差。GPS 授时?机房没有窗户。在分布式系统里,'同时'这个词没有意义。你只能定义'谁导致了谁'——这叫 happens-before。」

事件日志排序 · Lamport / 向量时钟

物理时钟排反 → Lamport(无法区分并发)→ 向量时钟(精确检测并发)→ 共识=模拟逻辑全局时钟

第三幕 · 顿悟→突破

分片与计算 · 接受现实

数据分片 + 一致性哈希 K/N + MapReduce 容错重跑

时钟殿后是一片开阔的星图台,星图上密布着无数数据光点——你的整个数据集。

诺依曼老祖 诺依曼老祖

「你打不过分区。但你可以让分区只影响一小片数据。把数据拆开——一台节点只存一部分。分区了?坏运气只落在那部分数据上。节点不够用了?加一台。但加一台意味着数据要重新分配——怎么搬最少?」

一致性哈希 K/N 迁移公式组装器

分片三选一 → mod N 全搬迁 → 公式组装 K/N → 哈希环增删 → MapReduce 重跑

范围分片
哈希 mod N
目录分片
第三幕 · 最高潮

Boss 战 · 分区之壁三问

裂账清算 + 三问对决 + 排除裂纹收网 + 脑裂残影

星图台灯火齐灭。分区之壁从四面八方压过来,凝成一面横亘天际的巨壁,壁上每一条裂纹都在发光——那是你这一路刻下的所有"此路不通"。

分区之壁 分区之壁

「我是分区之壁。我不住在你的错误里——错误救不了我。我住在你'以为网络是可靠的'的地方。你每以为多接一台机器就多一份力量,我就胖了一圈。三问。答错一题,壁就厚一分。」

渊账累计 0 笔 · 三问全对后清零

第三幕 · 收束

尾声 · 微服务远眺

RPC/gRPC + 消息队列 + 微服务架构 · 境界突破 · ch22 悬念

壁散尽时天机门大开,远处地平线上浮现出一座由无数微光节点组成的巨型城邦——每个节点都是一个独立服务,彼此用光链相连,城邦上空漂浮着消息流的光河。

诺依曼老祖 诺依曼老祖

「你入门了。不是因为你答对了三问——答对的会忘。是因为你摔过的每一跤,都刻在你手上了。看看那座城邦。你这一路学的 CAP、共识、事务、分片——它们最终长成了这个样子。」

知识图谱点亮 · 微服务远眺

RPC 拆解 → 消息流拆解 → 架构演进 → 11 块碎片点亮 → 境界突破

RPC / gRPC
消息队列
微服务架构