分布式系统中,软件和硬件故障都很常见。Flink 需要在故障发生时,有一种恢复机制,使得对外界看来,就像没发生过故障一样。鉴于 Flink 是一个长时运行的应用,如果一旦发生故障,就需要重新读取所有流的话,效率很低。Flink 使用 Checkpoint 来缩减恢复的时间。
Checkpoint 需要保证,存下来的状态,对于应用的各个部分是一致的 (即:节点 A Checkpoint 是在处理完流 A 第 n 个元素时,依赖节点 A 的节点 B 也应该在对应位置做 Checkpoint,否则可能出现不一致)。分布式系统中做 Checkpoint 的困难之处在于,无法保证所有的节点能同时的做 Checkpoint。Flink 通过屏障(Barrier)来解决这个问题。
在流的源头,Flink 会定时插入一个 Barrier。Barrier 将流分成了两部分,Barrier 之前的已处理的流和 Barrier 之后未处理的流。当节点收到 Barrier 时,做 Checkpoint,Checkpoint 完成之后,再将 Barrier 发送给下游。