Flink的容错机制--checkpoint
checkpoint容错机制是Filink可靠的基石,可以保证Flink集群在某个算子因为某种原因推出,所导致的故障,能够在整个应用流图的状态恢复到故障之前的某个状态,从而保证流图的一致性,Flink的checkpoint机制来源于Chandy-Lamport algorithm”算法。
checkpoin的应用在启动时,flink的JobManager会创建一个CheckpointCoordinator(检查点调节器),检查点调节器会负责整体的快照制作。
1.检查点调节器会周期的性向流应用中的所有算子发出barrier(屏障)。
2. 当某个算子接收到barrier时,会暂停处理数据过程,然后将自己的当前状态制作成快照,并保存到持久化存储中,最后向检查点调节器汇报自己的快照制作的情况,同时向下游算子广播该barrier,恢复数据处理。
3.下游算子接收到该barrier,于上面的步骤一样,会报错自己当前的状态,并汇报,广播下游,恢复数据处理。直到该barrier传递到算子sink。快照制作完成。
4.checkpoint检查点调节器接收到所有算子的汇报之后,认为该周期的快照制作成功,否则,如果在规定的时间内没有接收到所有算子的报告,则认为该周期快照制作失败。
***********
如果一个算子有俩个输入源的话,则会暂时阻塞先收到的barrier,等待第二个输入源的相同编号的barrier的到来,在一起向下游算子进行广播。如图所示:
A发出的barrier先到C算子,则C算子会暂时将A数据通道阻塞,等待延迟B数据源的barrier到C算子,等到之后,汇聚成一个barrier向下游进行广播,同时向检查点调节器回报快照制作情况。
当某些原因发生故障时,检查点调节器,通知流图上的所有算子统一的恢复到某个周期的checkpoint状态,然后恢复数据流处理,分布式的checkpoint机制保证了数据仅被处理了一次(exactly-once)。
***********************************************************************************************************
持久化存贮
1.MemoryStateBackend
该持久化存贮,主要是将快照存储到jobmanager的内存中,所以这种持久化存贮,仅适用于测试,以及快照数量很小的情况下。
建议MemoryStateBackend用于本地和测试。
2.FsStateBackend
该持久化存贮是将快照数据保存到文件系统中。目前支持文件系统主要是HDFS和本地文件。
俩种文件系统需要创建目录。
建议使用FsStateBackend,具有大状态,长窗口的作业,所有高可用设置。
3.RocksDBStateBackend
RocksDBStatBackend介于本地文件和HDFS之间,平时使用RocksDB的功能,将数 据持久化到本地文件中,当制作快照时,将本地数据制作成快照,并持久化到 FsStateBackend中(FsStateBackend不必用户特别指明,只需在初始化时传入HDFS 或本地路径即可,如new RocksDBStateBackend(“hdfs:///hacluster/checkpoint”)或new RocksDBStateBackend(“file:///Data”))。
//获取flink的运行环境
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//设置statebackend
env.setStateBackend(new MemoryStateBackend());
CheckpointConfig config = env.getCheckpointConfig();
// 任务流取消和故障时会保留Checkpoint数据,以便根据实际需要恢复到指定的Checkpoint
config.enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
// 设置checkpoint的周期, 每隔1000 ms进行启动一个检查点
config.setCheckpointInterval(1000);
// 设置模式为exactly-once
config.setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
// 确保检查点之间有至少500 ms的间隔【checkpoint最小间隔】
config.setMinPauseBetweenCheckpoints(500);
// 检查点必须在一分钟内完成,或者被丢弃【checkpoint的超时时间】
config.setCheckpointTimeout(60000);
// 同一时间只允许进行一个检查点
config.setMaxConcurrentCheckpoints(1);