开发者学堂课程【开源 Flink 极客训练营:Fault-tolerance in Flink】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/760/detail/13340
Fault-tolerance in Flink
5.异步全局一致性快照算法-Chandy-Lamport
System Requirement
快照过程不影响应用运行
-快照过程中不影响收发消息
-快照过程中不需要停止应用进程每个进程可以记录自己的本地状态可以分布式的对记录的状态进行收集任意进程都可以发起快照
前提条件:nomessageloss/corruption/duplication
-消息有序且不重复(channels are FIFO)
-消息可靠性可以保障
Chandy-Lamport 有两个分布式领域教授他们两在吃饭时提出了一个问题,怎样做异步的全局一致性快照,当天两人喝酒喝多了没有讨论出结果。Lamport 回家睡了,第二天起来后洗澡,在洗澡过程中想到了算法很高兴、很兴奋,随便吃点东西跑到了 Chandy 的办公室,发现 Chandy 准备好了一样的算法等他,最后两人联合发表算法,所有名称为 Chandy-Lamport。
Chandy-Lamport算法流程
发起快照、分布式执行快照、终止快照
发起快照
任意流程都能发起快照,由P1发起快照。
第一步记录本地状态,对本地进行快照,快照后立刻马上没有间隔的向 output channel 发送 marker 消息。marker 消息是特殊消息不同于应用发送的消息。
P1开始记录所有 input channel 的消息,例子里一共两个进程,开始记录C21进程的消息。
分布式执行快照:当P1接收到来自Cki的marker消息(即Pk发给Pi的marker)
如果这是Pi看到的第一个其他管道的marker消息
-Pi记录本地状态(本地快照)
-Pi标记C12管道为空,后续再从P1发送消息不包含在C的消息快照里。
-Pi立刻马上没有间隔的向所有 output channel 发送marker消息
-Pi开始记录所有除Cki之外的input channel消息
(即后续所有来自C的消息不再包含进此次快照)
如果此前Pi已经收到过 marker 消息
-Pi记停止记录Cki的消息,同时将此前记录的所有Cki收到的消息作为Cki在本次快照中的最终状态,进行保存。
终止快照
-所有进程都已经接收到了 marker 消息并记录了本地快照
-所有进程都从N-1个 input channel 里收到了 marker 并记录了这些 input channel 的状态(消息)
-快照收集器(central server)可以开始收集每个部分的快照并形成全局一致性快照
Chandy-Lamport 算法-演示
三个进程的例子,有一些状态是在内部发生的比如A状态与其他进程没有交互,对它进行扩展,认为内部的状态是P1发给自己的消息。或者认为C11是从A到A。
假设在P1发起快照,对本地的状态进行快照,叫做S1。然后立刻马上向所有的 outout channel,也就是P2和P3分别发送 marker 消息。接下来记录所有 input channel 消息。例子里管道2管道3包括自身的消息。P3先收到 marker 消息,P3与P2收到消息时间有差异,物理环境里分布式进程不同时间点之间网络状况不一样,这种情况导致消息到达的时间不同。是P3收到的第一个 marker 消息,首先对自己本地状态进行拍照,与此同时向所有的 output channel 发送 marker 消息,将除了C13之外所有 input channel 的消息开始进行记录。
P1接收到来自P3的 marker,不是第一次看到 marker,因为发送 marker 也认为看到了 marker。将来自C31的管道立刻关闭,并且将目前记录的消息在本次拍照中的状态。管道关闭为后续从P3发来的消息不会记录在本次拍照中。
P2收到了来自P3的消息,是P2接收到的第一个消息,对本地状态进行快照,将C32和B同时立刻马上向所有 output channel 发送消息,最后除了C32其它所有 input channel 的消息。
P2接收到来自P1的消息,不是接收的第一个消息,将所有 input channel 全部关闭记录拍照的状态。
P1接收到来自P2的消息,不是第一个接收的 marker,将所有的 input 管道关闭,input 管道记录的消息的状态,一个是内部时间C116管道自己发送给自己的消息,C21H到D之间的消息。
P3接收到P2的消息,不是看到的第一个 marker,将所有的输入管道关闭,记录最终状态,期间有一个点J作为它的状态。
算法终止,因为所有的进程进入到稳定状态,每一个进程输入的管道都关闭。
快照记录了过去时间点的全局一致性状态。
6.Chandy-Lamport &Flink
Flink 是分布式进行的系统,Flink 也采用全局一致性快照来形成检查点,支持故障恢复。
Chandy-Lamport支持强连通图,而 Flink 面向弱连通图
Flink 采用的是一种裁剪的 (tailored)Chandy-Lamport 异步快照算法
Flink 的异步快照算法在 DAG 场景下不需要存储 channel state,从而极大节省快照存储空间。