Flink checkpoint 算法(下) - Asynchronous Barrier Snapshotting
前言
在 Flink checkpoint 算法(上) 中,介绍了分布式系统状态快照算法 Chandy-Lamport,今天我们继续来了解 Flink checkpoint 实际所使用的算法 Asynchronous Barrier Snapshotting (ABS) 异步屏障快照算法,其受到 Chandy-Lamport 算法的启发,可以看作是 Chandy-Lamport 算法在 Flink 中的落地实现,同时对执行快照过程的一些问题进行了优化。
Asynchronous Barrier Snapshotting
Asynchronous Barrier Snapshotting 来自于论文 Lightweight Asynchronous Snapshots for Distributed Dataflows,算法主要:
- 提出并实现了一种异步快照算法,该算法可以在非循环执行图上实现最小状态快照。
- 描述并实现了在有循环执行图上的状态快照算法。
Chandy-Lamport 算法提供了一个最终一致的系统状态快照算法,使用 Marker 消息分隔了当前快照和下一个快照的消息。而在 Asynchronous Barrier Snapshotting 算法中,也使用了一个 Marker 消息,只是它的名称叫做 Barrier 屏障,Barrier 的作用和 Marker 消息一样,用来分隔不同快照的消息,Barrier 由快照中央协调器周期性产生,以触发系统周期性的执行快照。如下图,第 n - 1个 Barrier 屏障之后、第 n 个 Barrier 屏障之前的所有数据都属于第 n 个快照:
流处理系统模型
之前我们已经了解了 Chandy-Lamport 算法的执行流程,现在我们再来看下 Asynchronous Barrier Snapshotting 算法的流程,首先我们基于 Apache Flink 来看下流处理系统模型,Flink 任务在提交执行后,会生成一个有向无环图 DAG,图中的节点为 Flink 的算子,算子之间的边表示为数据流,和 Chandy-Lamport 算法中的进程及通道的模型基本一致。Flink 流式计算模型中一般包含三类算子:Source Operator、Transformation Operator、Sink Operator,分别负责数据的输入、处理、和输出,对应 DAG 中的起点、中间节点和终点。如下图,src 节点为起点 Source 节点,Count 节点为中间计算节,Print 节点为终点 Sink 节点:
ABS 算法在无环图中执行流程
同样先为算法做如下假设条件:
- 网络通道是准可靠的,遵循先进先出的传输顺序,并且可以阻塞(blocked)和解除阻塞(unblocked)。当通道被阻塞时,所有收到的消息会被缓存起来。
- 消息可以触发对其通道的操作,如阻塞、解除阻塞、发送消息。所有 outgoing 通道都支持广播消息。
- 在源任务中注入的 Barrier 消息,会被写入到名为 Nil 的输入通道。
下图是一个并行度为 2 的执行 Count 算子的示例:
算法在无环图中执行流程如下:
- 首先由一个中央协调器周期性注入 Barrier 屏障消息到所有的 Source 节点,当 Source 节点收到 Barrier 后,先对该节点当前状态做快照,然后向它的所有下游节点广播 Barrier 消息。
- 当 Source 的下游节点收到 Barrier 消息后,先将收到 Barrier 的通道阻塞(如果有多个输入通道),然后等待其他输入通道的 Barrier 的到达,当收到所有输入通道的 Barrier 消息后,该节点对当前状态进行快照,并向它的下游节点广播 Barrier。然后解除所有阻塞通道,继续处理输入的数据。
- 当所有 Sink 节点完成快照后,整个系统快照完成。此时系统快照由所有节点的快照组成。
我们看到 Asynchronous Barrier Snapshotting 算法的流程和 Chandy-Lamport 算法很相似,但也有很大的不同之处:
- ABS 算法的系统状态由节点状态组成,少了 C-L 算法中的通道的状态,为什么 ABS 算法中不需要通道状态呢?因为当一个节点完成它的状态快照前,它所有归属于当前快照的输入和产生的输出都已经处理完成,此时不需要再保留通道的状态。这种处理方式降低了快照的大小同时可以减少快照传输的时间,提升了性能。在 C-L 算法中,需要记录通道的状态,而通道的状态通常由实际的业务数据组成,这部分数据可能会相当的大,在占用更大存储的同时也会降低快照执行、故障容错恢复运行时的速度。
- 在 C-L 算法中,节点收到第一个 Marker 消息后即开始对节点状态进行快照,之后记录其他输入通道的状态。而在 ABS 算法中,节点收到第一个 Barrier 后(如果节点有多个输入数据流),并不会立刻进行快照,而是等带所有的输入通道都收到 Barrier 后,才进行快照。这个过程称之为 Barrier 对齐。Barrier 对齐过程如下图:
在 Barrier 对齐过程中,输入通道会被阻塞,需要注意在 Flink 中,这里的阻塞通道,并不意味着通过不再传输数据,而是指此时通道传输的数据会被算子所在节点缓存到节点本地,这些缓存数据不回立刻参与计算,直到快照完成后通道阻塞状态解除。Flink 中解除阻塞后,会先处理缓存的数据,再处理通道中后续输入的数据。
Barrier 对齐是 Flink 能够做到 Exactly-Once 语义的关键。因为 Barrier 对齐能保证算子处理的数据都是当前 Checkpoint 区间之内的数据,避免同样的数据在系统故障恢复后再次处理。但是 Barrier 对齐需要等待所有输入通道的 Barrier 都到达后才开始进行快照,如果其中一个通道的 Barrier 达到延迟比较高,则会延缓整个系统快照的进程。如果只需要 AT_LEAST_ONCE 语义,可以在 Flink 中关闭 Barrier 对齐。关闭 Barrier 对齐后,算子节点收到第一个 Barrier 后即开始进行快照,这样本属于后一个快照的数据可能也会被当前快照包含进来,当故障恢复时,这部分数据会被重复计算。
那么 Asynchronous Barrier Snapshotting 中的 Asynchronous 异步是指什么呢?在 ABS 算法中,节点不会等到快照完成后才继续处理后续的数据。而是在触发快照后,在向下游广播 Barrier以及继续处理后续数据的同时,异步的执行状态快照的保存、向中央协调器发送 ACK 等操作。
ABS 算法在有环图中执行流程
Flink Job 生成的执行图是有向无环图(DAG),所以上面描述的算法即是 Flink chekpoint 使用的算法。但是如果作业的执行计划是个有向有环图呢?如下图,如果继续使用上面的算法,很显然会导致死锁。好在ABS 也提供了在有环执行图上的状态快照算法。我们简单说一下该算法的流程。
如上图,我们把从下游回流到上游的数据流称为 back-edge,当一个有 back-edge 的节点做快照时,执行过程如下:
- 当所有非 back-edge 的输入流的 Barrier 到达后,节点会先在本地保存当前的状态。
- 开始记录从所有 back-edge 收到的数据,直到从 back-edge 收到 Barrier 为止。
- 快照由步骤1中保存的状态和步骤2中记录的数据序列组成。
故障恢复
有了系统全局一致性快照,当系统执行过程出现问题需要故障恢复时就比较简单了,故障恢复可以选择整个系统全部从状态快照恢复,也可以恢复部分节点。节点恢复流程:
- 每个任务节点从持久化存储的快照中获取的自身关联的状态,并设为初始状态。
- 处理备份日志中所包含的所有记录。
- 开始从输入通道中输入数据。
end!
参考
Lightweight Asynchronous Snapshots for Distributed Dataflows
推荐阅读
招贤纳士
政采云技术团队(Zero),一个富有激情、创造力和执行力的团队,Base 在风景如画的杭州。团队现有 500 多名研发小伙伴,既有来自阿里、华为、网易的“老”兵,也有来自浙大、中科大、杭电等校的新人。团队在日常业务开发之外,还分别在云原生、区块链、人工智能、低代码平台、中间件、大数据、物料体系、工程平台、性能体验、可视化等领域进行技术探索和实践,推动并落地了一系列的内部技术产品,持续探索技术的新边界。此外,团队还纷纷投身社区建设,目前已经是 google flutter、scikit-learn、Apache Dubbo、Apache Rocketmq、Apache Pulsar、CNCF Dapr、Apache DolphinScheduler、alibaba Seata 等众多优秀开源社区的贡献者。如果你想改变一直被事折腾,希望开始折腾事;如果你想改变一直被告诫需要多些想法,却无从破局;如果你想改变你有能力去做成那个结果,却不需要你;如果你想改变你想做成的事需要一个团队去支撑,但没你带人的位置;如果你想改变本来悟性不错,但总是有那一层窗户纸的模糊……如果你相信相信的力量,相信平凡人能成就非凡事,相信能遇到更好的自己。如果你希望参与到随着业务腾飞的过程,亲手推动一个有着深入的业务理解、完善的技术体系、技术创造价值、影响力外溢的技术团队的成长过程,我觉得我们该聊聊。任何时间,等着你写点什么,发给 zcy-tc@cai-inc.com
微信公众号
文章同步发布,政采云技术团队公众号,欢迎关注