Post

分布式快照:为什么必须记录在途消息

理解一致切面和 marker 规则,避免在全局状态中漏记或重复记录消息。

分布式快照:为什么必须记录在途消息

一份全局快照不仅包括进程本地状态,还包括通信通道中的在途消息。本文根据课程笔记整理 Chandy–Lamport 算法的基本模型。

本地截图拼起来可能不一致

假设节点 A 持有一个任务,随后将它发送给 B。如果 A 在发送之后记录状态,B 在接收之前记录状态,任务在两边都不存在;它应当被记在通道中。

另一种交错是 A 在发送之前记录,B 在接收之后记录。任务可能同时出现在两份本地状态里,形成不符合消息因果关系的切面。

一致切面不能包含一条消息的接收,却不包含其发送。通道状态记录的是发送已包含、接收尚未包含的那部分消息。

算法的前提

经典模型使用可靠、有序的单向 FIFO 通道,参与进程不失败,快照通知能够传播到所有参与者。真实系统需要确认应用消息、marker 和连接重建是否满足模型;TCP 本身并不能自动提供跨进程重启的全部保证。

Marker 发送与接收规则

发起者记录本地状态,然后在各出通道上发送 marker,且 marker 要先于记录之后发出的普通消息。它同时开始记录入通道消息。

收到某条入通道的 marker 时:

是否已记录本地状态行为
尚未记录立即记录本地状态;该通道状态为空;传播 marker,记录其他入通道
已经记录停止记录这条通道,其状态为本地记录后、marker 到达前收到的普通消息

marker 是边界标记,不需要携带通道内全部消息。每个接收者依据到达顺序自己记录通道状态。

FIFO 为什么关键

同一通道中,发送者快照前发出的消息排在 marker 前,快照后发出的消息排在 marker 后。这个顺序让接收者能确定记录窗口。

发送者拍快照之后才发送的任务,不应被记为快照时的在途任务。marker 先到达接收者,确保它也在接收该任务之前记录状态,任务仍只出现在发送者快照中。

完成与使用

一个进程收到所有入通道的 marker 后,本地记录完成。所有参与进程及通道记录完成后,可以收集并组合全局状态。它不要求大家在同一个物理瞬间暂停。

快照为检查点、稳定性质检测等提供基础;恢复执行还可能需要日志、外部输入和副作用处理,不能把一次快照直接等同于完整恢复方案。

原始算法见 Distributed Snapshots: Determining Global States of Distributed Systems。

This post is licensed under CC BY 4.0 by the author.