Flink状态一致性
一、状态一致性分类 (1)最多一次(at most once) 当故障发生,什么都不干,既不恢复丢失状态,也不重播丢失的数据。 (2)至少一次(at least once) 所有事件都处理了,有的事件可能被处理多次 (3)精确一次(exactly once) 所有事件仅仅被处理一次 二、端到端的状态一致性 (1)内部保证(checkpoint) (2)source端(可重设数据的读取位置) (3)sink端(从故障恢复时数据不会重复写入外部系统,比如幂等写入,事务写入) 事务写入的实现思想:构建的事务对应着checkpoint,等到checkpoint真正完成的时候,才把所有对应的结果写入sink中 实现方式有两种:预写日志,两阶段提交 1)预写日志 把结果数据先当成状态保存,然后在收到的checkpoint完成通知时一次性写入sink DataStream API提供了一个模板类,GenericWriteAheadSink,来实现事务性sink 注意:checkpoint完成了,但是写入sink只有一半写入成功,则不能保证一致性 2)两阶段提交 i)每个checkpoint,sink任务会启动一个事务,并将接下来的所有接受的数据添加到事务里 ii)然后将这些数据写入外部sink系统,但不是提交,这次是预提交 iii)当收到checkpoint完成通知时,它才会正式提交事务