flink中经过状态来实现容错、状态一致性以及checkpoint机制,算法
对于状态通俗来说就是将数据或者程序运算的中间结果进行备份,这样能够保证程序中途出错能够从这里恢复;数据库
程序中保存的状态保存的具体类型是什么,哪些状态能够保存呢?后端
状态后端指的是咱们将要备份的数据存在那个地方,flink中有三个方式来保存状态,默认是保存在内存当中异步
checkpoint保证了flink的可靠性,由于它也实现了数据的一致性,实际就是按期的程序各个执行状态进行保存,出错后能够实现恢复;spa
checkpoint的运行工做机制就是:3d
JobManager内部有一个协调器,在周期型的生成barrier,从最开始的数据源开始插入,随着数据流向后广播传递;日志
当这个barrier到了一个task时,至关于一个开关,开启当前task的备份;一般一个task中会对应上游多个task向他传递数据流,那这个task会等到全部的上游task到齐以后在触发备份机制,blog
固然这其中会涉及barrier对齐的特性,就是当某一个上游task中的barrier先到了,那么这个barrier以后的数据会等待,知道全部的上游task中全部的barrier都到齐之后开始checkpoint才开始计算,这样就能够保证数据的一致性,精准一次消费;事务
当这个task完成备份之后会向jobmanager里的协调器发一个消息,通知到此次保存的checkpoint的地址和相关的元数据;内存
当数据处理的最后完成checkpoint,在jobmanager收到后就会通知本次全局的checkpoint完成,同时它会备份之际的元数据;
固然在sink的时候会涉及二阶段提交(2pc),就是一开始先预提交,收到jobmanager的 完成通知,会进行正式提交,这样来保证精准一次消费;
chandy-lamport算法,异步分界线快照算法,这个算法能够实现不中止流的处理,同时进行checkpoint备份;
数据一致性级别:
**at-most-once(_最多一次):_
这实际上是没有正确性保障的委婉说法——故障发生以后,计数结果可能丢失
这表示计数结果可能大于正确值,但毫不会小于正确值。也就是说,计数程序在发生故障后可能多算,可是毫不会少算;
这指的是系统保证在发生故障后获得的计数结果与正确值一致.既很少算也很多算
须要外部源可重设数据的读取位置.目前咱们使用的Kafka Source具备这种特性: 读取数据的时候能够指定offset
依赖checkpoint机制
须要保证从故障恢复时,数据不会重复写入外部系统. 有2种实现形式:
所谓幂等操做,是说一个操做,能够重复执行不少次,但只致使一次结果更改,也就是说,后面再重复执行就不起做用了。
须要构建事务来写入外部系统,构建的事务对应着 checkpoint,等到 checkpoint 真正完成的时候,才把全部对应的结果写入 sink 系统中。对于事务性写入,具体又有两种实现方式:预写日志(WAL)和两阶段提交(2PC)