Flink Exactly Once

Flink Exactly Once

Flink Exactly Once 语意是基于Chandy-Lamport这个算法的思想的改进版,引入了barrier,可以在不停止整个流处理系统的前提下,保存和恢复每个subtask的snapshot,让每个节点独立地做状态保存和恢复。

Chandy-Lamport 算法

  • Initiating a snapshot: 也就是开始创建 snapshot,可以由系统中的任意一个进程发起
  • Propagating a snapshot: 系统中其他进程开始逐个创建 snapshot 的过程
  • Terminating a snapshot: 算法结束条件

一、Initiating a snapshot

  • 进程 Pi 发起: 记录自己的进程状态,同时生产一个标识信息 marker,marker 和进程通信的 message 不同
  • 将 marker 信息通过 ouput channel 发送给系统里面的其他进程
  • 开始记录所有 input channel 接收到的 message

二、Propagating a snapshot

  • 对于进程 Pj 从 input channel 接收到 marker 信息:
  • 如果 Pj 还没有记录自己的进程状态,则
    • Pj 记录自己的进程状态
    • 向 output channel 发送 marker 信息
  • 否则
    • 记录所有input channel 中收到所有排在本次mark标识之前的 message。

三、Terminating a snapshot

  • 所有的进程都收到 marker 信息并且记录下自己的状态和 channel 的状态(包含的 message)

例子:

C:代表channel,X/Y/Z 代表进程状态变量,P: 代表进程

初始状态:

P1发起快照,插入marker

P2接收到Marker开始进行本地快照

P1 接收到 [M1, marker] 信息,记录M1

所有 的进程都做了快照之后,途中蓝色部分就是本次全局快照的内容。

Flink Barrier 机制

数据源设置barrier,触发task的snapshot

Flink的Job Manager会往所有Source的流中放入一个barrier(图中三角形),barrier包含当前checkpoint的ID。

当barrier经过一个subtask时,即表示当前这个subtask处于要触发“快照”,这个节点执行checkpoint方法将当前的state进行持久存储,然后将这个barrier继续往下传递。下图中Source1和Source2就是完成了checkpoint动作,然后继续把id为2的barrier继续往下传递。

Barrier对齐,对应不同的语意

在分布式系统中,如果一个subtask有多个上游节点,这个subtask就需要等待所有上游发来的barrier(同一个序号的)都接收到,才能表示这个subtask到达了checkpoint触发的“时刻”,开始做“快照”,否则这个节点出故障恢复时无法确定该从哪个checkpoint恢复,造成数据不准确,这就是对齐barrier。

At-Most-Once:

当不采用checkpoint时,每个event做多就只会被处理一次,这就是At-Most-Once。

At-Least-once:

当不开启Barrier对齐时,假设source1的Barrier先到达,那么后续的source1的数据就接着处理了,比如从数据3开始是本次Barrier之后的数据,这样等source2的Barrier到达后开始snapshot。如果此时从本次snapshot回复,那么source1的数据,从3开始就会有重复。

Exactly-Once:每个subtask都做barrier对齐,这样就会有一些性能消耗和延迟。

参考:

分布式快照算法: Chandy-Lamport 算法

Flink的可靠性保证 – CheckPoint机制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章