Checkpoint解决什么问题

分布式系统中,软件和硬件故障都很常见。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发送给下游。

为什么需要对齐

当一个节点上游有多个流时,必须等多个流都收到Barrier之后才可以Checkpoint,这个过程叫做对齐。节点会被阻塞,等待Barrier没到的流。

对齐有什么问题

当一个流遭遇反压时,流的流动速度变慢,会造成比较长时间的阻塞,增加延迟。