IT 论文精读 · PAPER 72

Distributed Snapshots(分布式快照)

K. Mani Chandy & Leslie Lamport · ACM TOCS · 1985

EN →

这篇论文干了什么?

1985 年,Chandy 与 Lamport 给出一个办法:一大群各干各的机器,在不停机、也没有一块大家都信的表的前提下,给整个系统拍出一张「讲得通」的全局照片。今天 Flink 这类流计算引擎每隔几秒存一次进度、崩了就从上一张照片接着跑——用的就是这篇的点子。

先说个怪事

假设系统里只有两个账户 A 和 B,一共 100 块,你想核对总额。先问 A:「你账上多少?」——A 说 100。可挂电话之后,A 把 50 块汇给了 B。再问 B——B 说 50。加起来 150,钱凭空多了 50。

换个顺序也一样糟:先问 A(已汇出,剩 50)、再问 B(钱还在路上,仍是 0)——总共 50,钱凭空少了。你并没算错,问题出在:两次「问」不在同一个时刻。而分布式系统里压根没有「同一个时刻」这回事——每台机器的表都对不齐,你也不可能让整个世界停下来等你拍。

新在哪

以前的办法要么停机(业务跟着停),要么对表(时钟永远精确不到那份上)。这篇论文换了个目标:别追求「同一瞬间」,只追求「不自相矛盾」——只要照片上不出现「B 收到了一笔 A 还没汇出的钱」这种因果倒错,它就是一张合法的照片,哪怕现实中从没有哪一瞬间系统真长成那样。对很多问题来说,这就够用了。

怎么做到的

办法简单得令人发指,只靠一张「红卡片」:

为什么这样就不会矛盾?因为线路是排队的、先发的先到,那张红卡片于是成了线上的一道分界:排它前面的全是「拍照前发出的」,排它后面的全是「拍照后发出的」。后者永远进不了照片(钱不会凭空多),前者里还没送到的,一定落在「我抄完自己」到「红卡片到达」这段窗口里被逮住(钱不会凭空少)。整件事没有指挥官、没有人被暂停——每台机器只盯自己那几条线做本地决定,全局一致的照片自己就拼好了。

带来了什么

有了照片,一堆「站在系统外面才看得清」的问题就变成了在一张静态图上做判断:系统死锁了吗?活干完了吗?这块内存还有人用吗?还有最实用的一条——存档点:把照片存下来,崩了就从照片重启,不用从头再来。

诚实的一句:这张照片可能从来没有真的发生过,它只是「讲得通」;所以问「此刻队列有多长」这种转瞬即逝的事,它答不了。

一句话记住

拍不到「同一瞬间」,就退而求其次拍一张「不自相矛盾」的:谁想拍照就先记下自己、再往每条出线丢一张红卡片;别人收到卡片就照做并转发;从记完自己到收到卡片这段时间里收到的东西,就是「当时还在路上的」,一并记下。没人需要停机、没人需要对表,一张全局一致的照片自己就拼好了。

想看 marker 规则的原文形式、一致割的时空图和那条「照片未必真实存在」的定理? → 切到精读版