Distributed System 4: Distributed Snapshots
- 分布式系统
- 1天前
- 11热度
- 0评论
Snapshots: save the data
我们想要捕捉系统在某一时刻 TTT 的一致全局状态,包括:
- 每个进程的本地状态;
- 每条通道上的消息状态(即“正在飞”的消息)。
常见应用场景:
- 检查点恢复(Checkpoint / Rollback Recovery)
- 检测全局死锁
- 检测全局不变式(如是否所有账户加和为常数)
- 调试 / 稳定状态检测(如终止检测)
问题是:
在分布式系统中没有全局时钟,进程之间的消息异步传递,我们无法在同一“时间点”同时拍照。
这就是一致快照问题(Consistent Snapshot Problem)。
比如:
- P1 在 10:01 拍照;
- P2 在 10:02 拍照;
- 如果中间有消息在传递,这两个快照组合起来可能不是系统的真实状态。
Target: markdown every 圈 in the process:
Design1: 只取两个进程
Problem:那你在通信信道里的数据就丢失了
Design2: P先存,然后发给Q存
问题:可能G还在通信中,你只复制成功了Y,会丢数据或者多数据
Idea:设置一个marker消息做同步
这就是Chandy-Lamport Algorithm
Chandy-Lamport Algorithm
事件:Q收到 marker,此时又发送O到P
他要做:
把PQ channel 记录为空 (防止记Y造成duplicate)
Snapshot {R, P, B}
再发送一次marker,到P后,根据之前的状态,可以同步,确定 channel(Q,P) = {O}
我们是不用记录同一个准确真实时间的快照,而是记录逻辑意义上的时间
importance: 两个人,只会有一个channel是空的
自己推理下
- 发送Y
- marker {G}
- 发送marker
- Q发送B,O
- 此时Q应该记录{Y,R,P},因为之前没记录成功过
1.如果先marker,那么Y一定会在P={Y,G}
3个人
- marker先从T开始 T={}
- T发送marker给P,Q。
- 在发送途中,P发送R给Q,Q发送P给P
- 两个marker并行的到了(同时循序),并且记录,P={G,Y}, Q={B,O}
- 此时P和R终于到了,然后marker从P到Q,从Q到P
- marker记录,就会得出 chan(P,Q)=R chan(Q,P)=P
如果加两个channel,就可以记录出这个情况
Chandy-Lamport (1985) 的算法通过一种异步标记协议(marker protocol)解决了上面的两个问题:
- 快照启动者发送一个 marker(标记消息);
- 每个节点收到 marker 时:
- 若是第一次收到 marker → 记录本地状态;
- 对每条输入通道:
- 在收到 marker 之前到达的消息属于通道状态;
- 收到 marker 后的消息属于快照之后的新状态;
- 然后把 marker 广播出去。
通过这种方式:
- 不需要全局时钟;
- 保证每个消息要么属于“已发送未收”的通道状态,要么已被计入接收方状态;
- 得到的快照是一致的(即不违反因果关系)。
分类 | 问题 | 核心原因 |
---|---|---|
理论问题 | 没有全局时间,无法同步拍照 | 分布式异步性 |
状态一致性问题 | 消息可能被遗漏或重复 | 发送与接收时刻不匹配 |
实践问题 | 网络不可靠、系统规模大 | 真实系统限制 |
解决思路 | 标记协议(marker)、逻辑时钟、差分快照 | 保证一致性、减少开销 |
当然在真实世界中:
问题 | 说明 |
---|---|
消息重复 / 丢失 | 实际网络不是可靠 FIFO 通道,需要额外机制(序号或确认)确保 marker 不丢失 |
高负载系统的状态膨胀 | 拍快照可能占用大量内存 / 网络带宽,需要增量快照或差分快照 |
与应用状态交错 | 进程状态和通道状态可能不同步,尤其是在多线程或异步 I/O 环境下 |
一致性与性能权衡 | 频繁快照会拖慢系统性能;延迟快照则可能增加恢复时间 |
多快照并发 | 多个控制器(coordinator)同时触发 snapshot,需区分不同 marker 实例(常用唯一标识符) |
非 FIFO 通道 | 原算法假设 FIFO 通道;若通道乱序,需记录额外因果信息(如 Vector Clock) |
快照存储所有事情/过多事情
事情会被Lamport存
这个PPT是整个事情的形象版本
https://www.cs.princeton.edu/courses/archive/fall22/cos418/docs/precept_04_distributedsnapshots.pdf