状态一致性

状态

flink中经过状态来实现容错、状态一致性以及checkpoint机制,算法

对于状态通俗来说就是将数据或者程序运算的中间结果进行备份,这样能够保证程序中途出错能够从这里恢复;数据库

状态类型

程序中保存的状态保存的具体类型是什么,哪些状态能够保存呢?后端

image.png
image.png

状态后端

状态后端指的是咱们将要备份的数据存在那个地方,flink中有三个方式来保存状态,默认是保存在内存当中异步

  1. 内存中: memoryStateBackend
  2. RockDBStateBackend,将状态存储在本地的RockDB数据库中,实际就是一种内存和磁盘的混合使用;
  3. FsStateBackend,本地状态保存在taskmanager中,在使用checkpoint时候就是将其存入文件系统中

checkpoint

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的 完成通知,会进行正式提交,这样来保证精准一次消费;

checkpoint算法

chandy-lamport算法,异步分界线快照算法,这个算法能够实现不中止流的处理,同时进行checkpoint备份;

数据一致性

数据一致性级别:

**at-most-once(_最多一次):_

这实际上是没有正确性保障的委婉说法——故障发生以后,计数结果可能丢失

at-least-once(至少一次):

这表示计数结果可能大于正确值,但毫不会小于正确值。也就是说,计数程序在发生故障后可能多算,可是毫不会少算;

exactly-once(严格一次):

这指的是系统保证在发生故障后获得的计数结果与正确值一致.既很少算也很多算

端到端一致性

source端

须要外部源可重设数据的读取位置.目前咱们使用的Kafka Source具备这种特性: 读取数据的时候能够指定offset

flink内部

依赖checkpoint机制

sink端

须要保证从故障恢复时,数据不会重复写入外部系统. 有2种实现形式:

a) 幂等(Idempotent)写入

所谓幂等操做,是说一个操做,能够重复执行不少次,但只致使一次结果更改,也就是说,后面再重复执行就不起做用了。

b)事务性(Transactional)写入

须要构建事务来写入外部系统,构建的事务对应着 checkpoint,等到 checkpoint 真正完成的时候,才把全部对应的结果写入 sink 系统中。对于事务性写入,具体又有两种实现方式:预写日志(WAL)和两阶段提交(2PC)

相关文章
相关标签/搜索