编程语言
首页 > 编程语言> > Chandy-Lamport分布式快照算法

Chandy-Lamport分布式快照算法

作者:互联网

文章目录

Chandy-Lamport分布式快照算法

Distributed Snapshot

分布式快照:特定时间点记录下来的分布式系统的全局状态(global state)。

分布式快照主要用途:故障恢复(即检查点)、死锁检测、垃圾收集等。

将分布式系统抽象为一张有向图:顶点称为进程(process),边称为channel。下图就示出包含3个进程和4个channel的分布式系统。

在这里插入图片描述

global state要包含所有进程的状态以及所有channel的状态

由于进程之间在通过channel不停地交换数据,所以以下动作都可能造成全局状态的改变:

论文中将使分布式系统状态发生变化的因素叫做事件(event),并给出了它的形式化定义,即e=<p, s, s’, M, c>。s和s’分别是进程p在事件e发生之前及发生之后的状态。

可见,进程对自己的状态是有感知的,而channel本身只负责传递(message),它们的状态不容易记录。并且我们无法让时间静止,各个进程的时钟也很有可能不同步,故不能在一瞬间同时捕获所有进程和channel的状态。所以必须要曲线救国,通过每个进程的状态和channel中的message合并出全局状态,这也是Chandy-Lamport算法的核心思想所在。

The Chandy-Lamport Algorithm

普林斯顿大学Chandy-Lamport分布式快照算法的PPT

Chandy-Lamport算法基于如下前提:在每对进程pi、pj之间都存在channel cij和cji,cij是output,cji是input。channel的网络可靠,缓存无限大,并且先进先出,即channel上的消息会不重不漏地按序到达。

算法要达到如下的终极目标:

  1. 最终产生的快照必须保证一致性;
  2. 快照过程不能影响系统正常运行,更不能stop the world。

Chandy-Lamport 算法具体的工作流程主要包括下面三个部分:

Initiating a snapshot

Propagating a snapshot

每个进程向下游发送的消息是源源不断的,所以必须得有个东西来划分“当前的消息”与“将来的消息“, marker 充当一个分隔符,分隔进程做 local snapshot (记录进程状态)的 message。比如 Pj 做完 local snapshot 之后 Ckj 中发送过来的 message 为 [a,b,c,marker,x,y,z] 那么 a, b, c 就是进程 Pk 做 local snapshot 前的数据,Pj 对于这部分数据需要记录下来。而 marker 后面 message 正常处理掉就可以了。

Terminating a snapshot

Example

假设系统中包含两个进程 P1 和 P2 ,P1 进程状态包括三个变量 X1,Y1 和 Z1 , P2 进程包括三个变量 X2,Y2 和 Z2。初始状态如下。

在这里插入图片描述

由 P1 发起全局 Snapshot 记录,P1 先记录本身的进程状态,然后向 P2 发送 marker 信息。在 marker 信息到达 P2 之前,P2 向 P1 发送 message: M。
在这里插入图片描述

P2 收到 P1 发送过来的 marker 信息之后,记录自己的状态。然后 P1 收到 P2 之前发送过来的 message: M。对于 P1 来说,从 P2 channel 发送过来的信息相当于是 [M, marker],由于 P1 已经做了 local snapshot,所以 P1 需要记录 message M。

在这里插入图片描述

那么全局 Snapshot 就相当于下图中的蓝色部分。

在这里插入图片描述

参考

https://zhuanlan.zhihu.com/p/53482103?spm=a2csy.flink.0.0.7ed8b5ccaxa0Mr

https://zhuanlan.zhihu.com/p/43536305

https://www.jianshu.com/p/06fff1ffe0a7


Shylin

标签:P1,快照,Chandy,Lamport,marker,snapshot,进程,message,channel
来源: https://blog.csdn.net/Shyllin/article/details/122704505