Flink 容错机制 Checkpoint & Savepoint

目录

一致性检查点(checkpoint)

从检查点恢复状态

Flink 检查点算法

保存点(save point)


一致性检查点(checkpoint)


Flink 故障恢复机制的核心,就是应用状态的一致性检查点。有状态流应用的一致检查点,其实就是所有任务的状态,在某个时间点的一份拷贝(一份快照);这个时间点,应该是所有任务都恰好处理完一个相同的输入数据的时候。如上图所示:数据按照一定的顺序进行处理,Source 表示当前处理的队列。sum_even 表示统计偶数的和6=2+4,sum_odd表示统计奇数的和9=1+3+5。此时5这个数从头到尾都处理完了。因此状态保存的是处理完之后的状态,Source = 5、sum_even=6、sum_odd=9 存在状态后端中。代码设置如下:

/**
 * CheckpointingMode:    EXACTLY_ONCE(执行一次)  AT_LEAST_ONCE(至少一次)
 */
env.enableCheckpointing(60*1000, CheckpointingMode.EXACTLY_ONCE);
//也可以通过 CheckpointConfig 设置 Checkpoint属性
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
env.getCheckpointConfig().setCheckpointTimeout(100000);
env.getCheckpointConfig().setFailOnCheckpointingErrors(false);
//间隔小,checkpoint 执行时间长时,可能会重复
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);
//两次checkpoint 之间的最小时间间隔。与上面有点冲突
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(1000);

//设置重启策略 = 重启失败后重试3次,每次间隔500s
env.setRestartStrategy(RestartStrategies.fixedDelayRestart(3,500));
//失败率,参数3表示次数,300表示收集失败率的时长,10表示重启的间隔
env.setRestartStrategy(RestartStrategies.failureRateRestart(3, Time.seconds(300),Time.seconds(10)));

从检查点恢复状态

在执行流应用程序期间,Flink 会定期保存状态的一致性检查点。如果发生故障,Flink 将会使用最近的检查点来一致恢复应用程序的状态,并重新启动处理流程。如下:7 这个数据挂了,恢复到上一个checkpoint。

重启应用遇到故障之后,第一步就是重启应用。

第二步是从 checkpoint 中读取状态,将状态重置。从检查点重新启动应用程序后,其内部状态与检查点完成时的状态完全相同。

第三步开始消费并处理检查点到发生故障之间的所有数据。这种检查点的保存和恢复机制可以为应用程序状态提供“精准一次”(exactly-once)的一致性,因为所有算子都会保存检查点并恢复其所有状态,这样一来所有的输入流就都会被重置到检查点完成时的位置。

Flink 检查点算法

基于 Chandy-Lamport 算法的分布式快照,将检查点的保存和数据处理分离开,不暂停整个应用。Flink 检查点算法用到了一种称为分界线barrier)的特殊数据形式,用来把一条流上数据按照不同的检查点分开。分界线之前到来的数据导致状态更改,都会被包含在当前分界线所属的检查点中。而基于分界线之后的数据导致的所有更改,就会被包含在之后的检查点中。

现在是一个有两个输入流的应用程序,用并行的两个 Source 任务来读取。如上,一个 sum会收到两个 Source 的流,Sum even算子目前只读取了 Source2的数据(2),Sum odd 算子读取了 Source1 的数据(1)和Source2 的数据(1,3)总计为 5。Sink2前边缺少黄1的原因是因为已经 Sink2输出了。JobManager 会向每个 source 任务发送一个带有新检查点ID的消息,通过这种方式来启动检查点。如上图所示,JobManager 发送给每个 Source id=2的 Checkpoint,此标记就会被 Source收到进行快照。

数据源将它们的状态写入检查点,同时给下游的数据中添加检查点 barrier 进行广播。状态后端 StateBackend在状态存入检查点之后,会返回通知给 source 任务,source任务就会向 JobManager 确认检查点完成。

分界线对齐:barrier 向下传递,sum任务会等到所有输入分区的 barrier到达。对于 barrier已经到达的分区,继续到达的数据会被缓存。而 barrier 尚未到达的分区,数据会被正常处理更改状态。


Sink 任务向 JobManager 确认状态保存到 checkpoint 完毕。当所有任务都确认已成功将状态保存到检查点时,检查点就真正完成。当出现问题的时候就会从当前的 checkpoint进行恢复。

保存点(save point)

Flink 还提供了可以自定的镜像保存功能,就是保存点(savepoints)。原则上,创建保存点使用的算法与检查点完全相同,因此保存点可以认为就是具有一些额外元数据的检查点。Flink不会自动创建保存点,因此用户(或者外部调度程序)必须明确地触发创建操作。保存点是一个强大的功能。除了故障恢复外,保存点可以用于有计划的手动备份,更新应用程序,版本迁移,暂停和重启应用等等

©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页