Flink 架构中的容错和一致性实现方案

Flink 架构中的容错和一致性实现方案

Posted by danfeng on November 1, 2018

### 有状态计算   聚合结果和本窗口内的所有记录有关,由于每个记录都是一个独立的事件,窗口需要缓存这些独立事件或由这些独立事件产生的中间结果,这些聚合运算称之为有状态的计算,而基于单个事件的过滤处理规则被称之为无状态计算。 Flink有两类状态:

  1. 数据处理应用程序自身的状态,这类状态由应用程序创建维护。
  2. 引擎自定义的状态,这类状态由引擎负责维护,如窗口缓存的事件以及中间聚合结果。

    Exactly-once语义和异步屏障快照

      Exactly-once语义可以保证在系统发生故障恢复后,故障结果和假定没有发生故障情况时一致,这种语义加重了高吞吐和低延迟的实现难度,异步屏障快照技术是实现这种语义基础的保证。 在具体申明异步屏障技术之前,我们先讲解下几个相关的概念:

  3. 检查点(CheckPoint):关系型数据库并不会立即将提交的事务写回到磁盘,而是写入到缓存中和redo log,这种技术能够保证数据一致性的同时提高数据库的访问效率。为了提高故障恢复的速度,数据库仅仅回滚某个时间点之后的没有写入磁盘的事务,这个时间点就是检查点。
  4. 快照(Snapshot):数据的一个拷贝,有两种实现方式,实现为写时拷贝和重定向,其中COW用于读密集型系统,ROW用于写密集型系统。
  5. 消息队列pull模式:在分布式消息系统中消费者主动连接缓存代理获取消息的一种消息消费模式,相应地,在push系统中系统将消息主动的推送给消费者。

  流式数据处理引擎用计算图的形式编译数据处理程序,其中计算图用DAG的形式表示。分布式快照就是对计算图在某些时间点上进行快照,这样在系统出现故障以后整个数据处理系统可以恢复到某个快照时间点的状态,以保证Exactly-once语义。
  快照必须满足两个约束条件:

  1. 快照必须在有限时间内完成。
  2. 快照必须包含所有的信息(包括在通道上传输的数据)以及这些信息的因果关系。 为了实现这种快照,通常有两种方案:
  3. 同步快照:同步快照分成三个步骤:第一步是暂停整个数据处理引擎; 第二步 执行快照操作;第三步:继续执行。同步快照会严重的影响系统的吞吐量,增加引擎运行时的系统开销。
  4. 异步快照:让引擎在执行异步计算任务的同时执行快照操作,且不需要对所有的通道和结点进行快照操作。

快照算法的步骤:

  1. 引擎定期向Source节点插入检查点屏障(Barrier).在收到作为控制消费的检查点屏障后,Source结点对自己的状态进行了快照,并且在输出通道上进行广播此检查点屏障消息,此外,不同的检查点可以通过id区分。
  2. 当其从任意一个输入通道收到检查点的屏障消息时后,算子或者Sink结点阻塞此输入通道,直到本结点从所有的输入通道收到检查点屏障。
  3. 在其从所有的输入通道收到检查点屏障后,算子或Sink结点对自己的状态进行了快照,然后对所有的输入通道解除阻塞。