分布式系统可视化

多机系统会遇到三个不同问题:每个键放在哪里?多个资源如何一起提交事务?多个副本如何在故障中保留一致的已提交日志?一致性哈希、两阶段提交和 Raft 分别回答它们。画面都有节点和消息,不代表保证可以互换。

缓存环需要在容量变化时尽量少迁移键;转账需要 A、B 与审计日志同时改变或全不改变;复制控制平面需要在消息延迟和网络分区中保留一份已提交历史。先明确目标,再选机制。

课程比较

课程主要问题决定规则失败边界
一致性哈希成员变化时哪个物理节点拥有键从固定键位置顺时针遇到的第一个活动 token一次单 token 变化只影响邻接区间;均衡可能改善,不保证完美
两阶段提交A、B 和日志何时可一起改变所有参与者 YES,再收到同一决定一票 NO 使所有人中止,协调者崩溃可能让准备锁一直保留
Raft 共识日志项何时成为已提交历史多数选出领导者,多数存储其当前任期条目少数可以存储,不能提交

Raft 的五取三不能替代三资源事务的原子提交。若把 2PC 的全票要求套在五副本日志上,两个延迟副本就会阻塞它。一致性哈希只决定归属,不提供数据复制或冲突写入裁决。

建议学习顺序

先学一致性哈希的节点加入场景。跟踪 K11 跨过 token 零点,再看 N4@220 接管 (140, 220]。K5、K6、K7 换归属,另外九个键不动。节点退出时,其区间交给顺时针后继。虚拟节点场景对比同一批键的负载:3/2/7 -> 4/5/3。

再学两阶段提交的全票提交场景。在只有两票 YES、协调者作出 COMMIT,以及 P1 仍 PREPARED、A 仍为 100 的等待窗口分别暂停。再看一票 NO 如何让已投 YES 的参与者回滚,协调者崩溃如何留下准备锁。

最后学 Raft 共识的选举与提交。三票产生领导者,当前任期条目存到三个副本后才可提交。少数分区中的两个服务器可以存下 set y=7,却停在 2 / 5;另外三个服务器选出更高任期领导者,在相同索引提交不同条目。

这个顺序依次学习放置、原子协调和复制一致性。键的拥有者、事务参与者、准备值、已提交日志项、哈希 token 和法定票数各有不同含义。

观察重点

  • 成员改变时,键的位置不动,变化的是顺时针后继。
  • 虚拟节点是同一物理机器的另一个 token 位置,不是新机器。
  • 2PC 的紫色提议值已经锁定,但尚未应用。两票 YES 不满足 need ALL YES。
  • Raft 的两份副本不满足 majority = 3,存储和提交是不同步骤。
  • 协调者崩溃可阻塞已准备的 2PC 参与者;Raft 分区中,缺少多数的一侧无法提交。
  • 三种机制不提供彼此的保证。实际系统可以组合使用,例如哈希环负责放置,分片内部用 Raft 复制。

选择课程,跟踪真正决定结果的证据:顺时针后继、全票同意或多数派。