Chandy-Lamport分布式快照算法小记

Prologue

前面陆陆续续写了几篇关于Flink的浅显的小文章,其中多次提到了“异步屏障快照(asychronous barrier snapshot, ABS)算法”这个词,并指出它是Flink检查点机制的基础。而ABS算法的渊源就是本文要说的Chandy-Lamport算法,它是目前在流式系统中广泛使用的分布式快照算法。

这个算法在论文《Distributed Snapshots: Determining Global States of Distributed Systems》中提出,并以作者的名字命名,即得州大学奥斯汀分校的K. Mani Chandy与斯坦福的Leslie Lamport(这位也是鼎鼎大名的Paxos算法的作者)。算法产生的背景有点意思,据Leslie Lamport自己说:

The distributed snapshot algorithm described here came about when I visited Chandy, who was then at the University of Texas in Austin. He posed the problem to me over dinner, but we had both had too much wine to think about it right then. The next morning, in the shower, I came up with the solution. When I arrived at Chandy's office, he was waiting for me with the same solution.

下面先介绍一些分布式系统中快照的前置知识,然后正式介绍Chandy-Lamport算法。

Distributed Snapshot

所谓分布式快照,实际上就是特定时间点记录下来的分布式系统的全局状态(global state)。分布式快照的主要用途有故障恢复(即检查点)、死锁检测、垃圾收集等。

为了方便理解,我们仍然沿用原论文中的方法,将分布式系统抽象为一张有向图:顶点称为进程(process),边称为链路(channel)。下图就示出包含3个进程和4个链路的分布式系统。

那么,全局状态就要包含所有进程的状态以及所有链路的状态。由于进程之间在通过链路不停地交换数据,所以以下动作都可能造成全局状态的改变:

  • 进程p收到或发出一条消息M;
  • 链路c承载了到达或离开进程p的一条消息M。

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

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

下面具体介绍算法的细节。

The Chandy-Lamport Algorithm

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

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

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

为了保证成功取得全局快照,Chandy-Lamport算法分为3个阶段,即初始化快照、扩散快照与完成快照,并且借助一种与正常消息不同的特殊消息作为标记,英文称为marker。这3个阶段并没有直接体现在论文中,而是出自普林斯顿大学相关课程的PPT,但算法实际流程则是严格一致的。下面叙述3个阶段的流程。

Initiating a Snapshot

假设进程pi发起快照:

  1. pi记录自己的状态;
  2. pi通过所有出边链路cij向其他进程pj发送marker消息;
  3. pi通过所有入边链路cji开始监听所有流向自己的消息。

Propagating a Snapshot

对于任意一个进程pj(包含发起快照的那个进程),考虑它的所有入边链路ckj。当在ckj上收到了marker消息时,有两种情况。

  • 如果pj还没有记录自己的状态——
  1. pj记录自己的状态,并将ckj标记为空;
  2. pj通过所有出边链路向其他进程发送marker消息;
  3. 通过所有入边链路开始监听所有流向自己的消息。
  • 如果pj已经记录过自己的状态——
    记下入边链路上监听到的消息,直到收到marker消息为止。

Terminating a Snapshot

若所有进程都成功地:

  • 收到了marker消息;
  • 记录下了自己的状态;
  • 记录下了入边链路的状态(就是链路上的消息)

则快照成功,算法流程结束。然后就可以将所有这些状态传输到一个稳定的分布式存储中心,全局快照就产生了。

Understanding the Algorithm

全局快照的难点在于,因为系统不能停止,每个进程向下游发送的消息是源源不断的,所以必须得有个东西来划分“当前的消息”与“将来的消息”,让它们不会混淆,而marker消息就是这个界限。对进程pj的入边链路ckj而言,如果收到的消息序列是[a, b, c, marker, d, e, f],那么就说明a/b/c三条消息属于当前快照,而d/e/f三条消息属于下一个快照。

另外,因为每个进程都记录自己收到的消息,所以进程最终都能持有入边链路的状态。为什么要用接收进程来记录?用两句大白话来解释:

  • 只有发送了数据,下游才会(按序)接收到数据;
  • 发送者无法知道数据在下游的接收情况。

如果不这样设计,而采用简单的单令牌系统的话,就会有问题。仍然借用论文中给出的一个例子:

进程p和q以令牌(token)的传送来标定状态,s1表示持有令牌,s0表示未持有令牌。假设在“token in C”全局状态下保存快照,而q的时间戳比p早,那么就会造成两个进程都处于s0状态,而q认为令牌不在链路C中,p也认为令牌不在链路C'中,因此快照里令牌就会丢失,造成不一致。

Example

下面的图示出有两个进程的分布式系统根据Chandy-Lamport算法生成快照的过程,其中蓝色的部分表示状态已经被保存,并且进程P1发起快照。

The End

天气是真的凉了哈。

晚安晚安。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 摘要:最近在学习Flink的Fault Tolerance,了解到Flink在Chandy Lamport Alg...
    暖夏未眠丶阅读 1,220评论 1 3
  • 早于Flink的异步快照的一个算法,比flink那个有名很多~(十)简单解释: 分布式数据流的异步快照(Flink...
    生活的探路者阅读 7,532评论 2 3
  • 我从背后搂住他,朝不知名的方向,说了句不知名的话,声音有些难听,那方向只有一个人,提着桶。接着我们坐在教室...
    哑句超人阅读 203评论 0 1
  • 很快一年一度的中秋节又到了,我真开心! 我早早把作业写完了,就去五姨家做客了,来到五姨家,我和弟弟玩起了...
    砚香阅读 420评论 0 2
  • 到底该不该离婚?今儿我们继续读《在远远的背后带领》。 图里有这么一段话,“大概所有想离婚的人都害怕伤害孩子、影响孩...
    张鑫Jackie阅读 152评论 0 0