– source端(kafka consumer)
偏移量保存下来,如果后续任务出现了故障,恢复的时候可以由连接器重置偏移量,重新消费数据,保证一致性。
-内部(checkpoint 机制)
基于 Chandy-Lamport 算法的分布式快照算法将检查点的保存和数据处理分离开,不暂停整个应用检查点分界线(Checkpoint Barrier,检查点屏障) Flink 的检查点算法用到了一种称为分界线(barrier)的特殊数据形式,用来把一条流上数据按照不同的检查点分开分界线之前到来的数据导致的状态更改,都会被包含在当前分界线所属的检查点中;而基于分界线之后的数据导致的所有更改,就会被包含在之后的检查点中过程:1某一个程序正常执行(2条输入流/两个并行度皆可),某一时刻,jobManger向每个Source 任务发送新的检查点id信息,启动最初的检查点。2数据源将它们的状态写入检查点,发出一个检查点的barrier,状态后端待状态存入检查点,通知Source任务,Source向jobManger确认检查点完成。3 Barrier向下游发送,操作任务会等待所有的相同Barrier到达,先到达的等后到达的,此时数据缓存(后来者居上的数据),继续等其他分区的barrier到达。4到达后,任务将状态保存到状态后端,Barrier继续向下游转发,任务继续执行5 Sink向jobmanger确认状态保存到checkpoint,所有任务到达,则检查点完成。
– sink(kafka producer)**
下级存储支持事务:Flink 可以通过实现两阶段提交和状态保存来实现端到端的一致性语义。分为以下几个步骤:
1)开始事务(beginTransaction)创建一个临时文件夹,来写把数据写入到这个文件夹里面2)预提交(preCommit)将内存中缓存的数据写入文件并关闭3)正式提交(commit)将之前写完的临时文件放入目标目录下。这代表着最终的数据会有一些延迟4)丢弃(abort)丢弃临时文件5)若失败发生在预提交成功后,正式提交前。可以根据状态来提交预提交的数据,也可删除预提交的数据。
如果下级存储不支持事务:具体实现是幂等写入,需要下级存储具有幂等性写入特性。
附录:Chandy-Lamport算法
分布式快照(Flink 分布式数据流的轻量级异步快照)每个进程记录的与自己相关的状态合并出全局状态Chandy-Lamport算法基于如下前提:在每对进程pi、pj之间都存在两条单向的链路cij和cji,即对于pi来讲,cij是出边,cji是入边。链路的网络可靠,缓存无限大,并且先进先出,即链路上的消息会不重不漏地按序到达。算法要达到如下的终极目标:
最终产生的快照必须保证一致性;快照过程不能影响系统正常运行,更不能stop the world。
Initiating a Snapshot:
假设进程pi发起快照:
pi记录自己的状态;pi通过所有出边链路cij向其他进程pj发送marker消息;pi通过所有入边链路cji开始监听所有流向自己的消息。
Propagating a Snapshot:
对于任意一个进程pj(包含发起快照的那个进程),考虑它的所有入边链路ckj。当在ckj上收到了marker消息时,有两种情况。如果pj还没有记录自己的状态——
pj记录自己的状态,并将ckj标记为空;pj通过所有出边链路向其他进程发送marker消息;通过所有入边链路开始监听所有流向自己的消息。如果pj已经记录过自己的状态——记下入边链路上监听到的消息,直到收到marker消息为止。
Terminating a Snapshot:
若所有进程都成功地:收到了marker消息;记录下了自己的状态;记录下了入边链路的状态(就是链路上的消息)则快照成功,算法流程结束。然后就可以将所有这些状态传输到一个稳定的分布式存储中心,全局快照就产生了。
暂无评论内容