Flink的恢复机制基于应用状态的一致检查点。在有状态的流应用中,一个一致性检查点是:在所有tasks处理了一个(相同的)输入后,当前时间点每个task的state副本。
在为application做一个一致性检查点时,一个基本的朴素算法机制如下步骤:
- 暂停所有输入流的消费。
- 等待所有未被处理的data完全被处理,表示所有tasks已经处理了它们所有的输入数据。
- 做检查点:复制每个task的state到一个远端持久性存储。在所有tasks完成了它们的副本后,检查点完成。
- 恢复消费输入流。
实际上Flink并不是基于上述朴素检查点算法,而是基于Chandy-Lamport算法(用于做分布式快照)实现了检查点机制。此算法并不停止整个应用的运行,而是将做快照的操作从流处理解耦出来,这样一些tasks可以持续运行,而其他tasks可以持久化它们的状态。实现原理:
- 使用了一个特殊的record类型,称为一个检查点分界(checkpoint barrier)。检查点barriers由source operator注入到常规的流记录中,任务向下游所有分区广播该检查点分界。
- 任务收到上游分区的barrier后,缓存该分区barrier后的records,直到所有上游分区的barrier都收到后,向JM确认(Acknowledge),在state backend保存检查点,然后广播barrier到该任务的下游tasks。该机制称为alignment机制。
- 检查点 barriers 到达一个sink task。它会做一个barrier 调整(alignment),给它自己的状态做检查点,并向JM确认它已收到barrier。JobManager在收到一个application的所有task发送的checkpoint acknowledge后,它会记录:此application的检查点完成。
- 一个source发出的每个分区的数据是FIFO的,保证barrier无法被其他records赶超。多个source或分区的数据顺序由任务的alignment机制保证顺序。<