Chandy–Lamport 的全局状态记录算法
每个分布式系统都有许多进程在许多不同的物理服务器上运行。这些进程使用文本消息通过通信渠道相互通信。这些进程既没有共享内存也没有公共物理时钟,这使得确定瞬时全局状态的过程变得困难。
一个进程可以在给定的时间记录它自己的本地状态,但传输中的消息(在其传递途中)不会包含在记录状态中,因此系统的实际状态在时间之后将是不正确的传递消息。
Chandy和Lamport是第一个提出一种算法来捕获分布式系统的一致全局状态的人。所提出算法背后的主要思想是,如果我们知道一个进程发送的所有消息都已被另一个进程接收,那么我们可以记录系统的全局状态。
分布式系统中的任何进程都可以使用称为MARKER的特殊消息启动这种全局状态记录算法。该标记跨越所有通信通道遍历分布式系统,并使每个进程记录自己的状态。最后记录整个系统的状态(全局状态)。该算法不会干扰进程的正常执行。
算法假设:
- 分布式系统中有有限数量的进程,它们不共享内存和时钟。
- 通信通道的数量是有限的,它们是单向的和 FIFO 有序的。
- 系统中任意两个进程之间都存在通信路径
- 在通道上,消息的接收顺序与发送顺序相同。
算法:
- 进程 P 的标记发送规则:
- 进程p记录自己的本地状态
- 对于来自进程P 的每个传出通道C , P在沿 C发送任何其他消息之前沿C发送标记。
(注意:进程 Q 将在他的传入通道 C1 上收到此标记。)
- 进程 Q 的标记接收规则:
- 如果进程Q还没有记录它自己的本地状态,那么
- 将传入通道 C1 的状态记录为空序列或空。
- 记录传入通道C1的状态后,进程Q遵循标记发送规则
- 如果进程Q已经记录了它的状态
- 记录输入信道C1沿着通道C1接收到的消息的序列的状态Q的状态被记录后和Q之前,从处理P.接收的标记一起C1
- 如果进程Q还没有记录它自己的本地状态,那么
需要对系统进行快照或记录全局状态:
- 检查点:它有助于创建检查点。如果应用程序以某种方式失败,则可以重新使用此检查点
- 垃圾收集:它可以用来删除没有任何引用的对象。
- 它可用于死锁和终止检测。
- 它也有助于其他调试。