Flink状态一致性

2020-04-01  本文已影响0人  yayooo

如图:奇数和偶数分流分别计算

概念

状态一致性分类(级别)

一致性检查点(checkpoints)


问题:2+4=6,1+3+5=9,当source为6时,内部6+6=12,如果加上sink,在此时出现故障,就需要恢复到source为5的时候的状态,而内部Strorage已经变成了“6,12,9”的checkpoint,所以引出端到端的状态一致性

端到端(end-to-end)状态一致性

端到端exactly-once保证

幂等写入

就是一个操作,可以重复执行很多次,但只导致一次结果更改,也就是说,后面再重复执行就不起作用。


reids写入时,

redis写入如果挂了,会重放一遍上一个状态


事务写入

预写日志(Write-Ahead-Log)
1)把结果数据先当成状态保存,然后收到checkpoint完成的通知时,一次性写入sink系统。

2)由于数据提前在状态后端(state backend)中做了缓存,所以无论什么 sink 系统,都能用这种方式一批搞定
3)DataStream API提供了一个模板类:GenericWriteAheadSink来实现这种事务性sink

预写日志方式会出现的问题:

1)日志丢了,导致写入外部sink系统不成功
2)在data sink中要保证Exactly-Once语义,它必须将所有的写入数据通过一个事务提交。在两个checkpoint之间,一个提交绑定了所有要写入的数据。当出错的时候,写入的数据可以被回滚。然而在分布式系统中,通常拥有多个并行执行的写入任务,简单的提交和回滚是效率低下的。为了保证一致性,所有的组件必须先达成一致,才能进行提交或者回滚。Flink使用了两阶段提交协议以及预提交阶段来解决这个问题。(实际是保证了at-least-once级别而不是Exactly-Once)

两阶段提交two-parse commit
1)对于每个checkpoint,sink任务会启动一个事务,并将接下来所有接收的数据添加到事务里。
2)将这些数据写入外部sink系统,但是不提交它们,只是“预提交”。
3)当它收到checkpoint完成的通知时,才正式提交事务,实现结果的真正写入。
4)这种方式真正实现了exactly-once。
5)这种方式真正实现了exactly-once,它需要一个提供事务支持的外部sink系统,Flink提供了TwoPhaseCommitSinkFunction接口。

TwoPhaseCommitSink对外部sink系统的要求

上一篇 下一篇

猜你喜欢

热点阅读