Snapshot Algorithm
分布式快照算法是拿来干嘛的?
在缺乏全局时钟或者全局时钟不可靠的分布式系统确定全局状态
A snapshot algorithm is used to create a consistent snapshot of the global state of a distributed system. Due to the lack of globally shared memory and a global clock, this isn’t trivially possible.
Global Snapshot
全局快照我们也可以理解为全局状态,主要用于在Failure Recovery。
我们把分布式系统简化为以节点表示的进程状态图,进程之间以消息队列进行通信。
这里的消息队列有两类input channel 和 output channel,channel可以看作是一个无限大的FIFO队列。
队列中收到的message都是有序无重复的。
C-L分布式快照算法通过记录每个进程的local state和input channel中有序的message作为一个局部快照。
那么global snapshot就是把所有进程的local snapshot全部合并起来
Chandy-Lamport
考虑一个分布式系统,这些进程运行在不同的物理机器。一个分布式系统全局状态就是进程的状态和队列中的message
考虑一个分布式系统,其中有两个节点,即两个进程再循环传递令牌。p和q,s0,s1对应的是两个状态。token可以理解为一个令牌,全局只有一个,进程之间通过消息队列发送令牌
s0表示进程不持有令牌,s1表示进程持有令牌。
两个进程之间的连线代表消息队列,token可能处于消息队列中,这时候两个进程状态都是s0,都没有令牌。
进程是有可能崩溃的
我们要保证进程崩溃重启之后,系统仍然能够正常运行,于是我们需要从某个检查点恢复程序的运行状态,这就需要定时把系统中在某个时间点的状态保存起来,也就是做一次snapshot
保存什么东西?
保存每个节点在当前的状态以及消息队列在当前的状态(消息队列的message)。
eg:
对上图来说,我们对右上角的状态做一个snapshot,保存的状态如下:
p | s0 |
q | s0 |
p->q | token |
q->p | empty |
但是由于pq是两个进程,时间不同步,例如p进程在发送token之后进行了快照存储,q在p发送token之前进行snapshot.
1.p在snapshot的时候由于p已经发送了token,现在token在q进程队列中,所以p进程保存快照的时候认定token既不在p也在p的接受队列
2.q在p发送之前快照,这时候token还在p手上,因此q进程认定token不在q也不在q进程的队列中
导致全局快照中token消失不见
解决办法
Marker-Receiving Rule