开发者学堂课程【开源 Flink 极客训练营:Fault-tolerance in Flink】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/760/detail/13340
Fault-tolerance in Flink
内容介绍:
一.有状态的流计算
二.全局一致性快照
三.Flink 的容错机制
四.Flink 的状态管理
一.有状态的流计算
1.流计算
有一个数据源持续不断的发送消息,同时有一个常驻的程序运行自己写的代码,每从数据源拿到消息后,提前处理,将产出结果产出到下一个。
2.分布式流计算
将数据流以某种方式进行划分使用多个分布式实例,对这个流进行处理。
3.流计算中的状态
计算分为两种,有状态和无状态,无状态的计算只需要处理一个单一的事件,而有状态的计算,需要记录并且处理多个事件。例如,假如事件,有时间的ID和时间的值两部分组成。处理逻辑是每拿到一个事件之后,都解析,并且输出这个事件的值,那么这就是一个无状态的计算。如果每拿到一个状态解析它的值出来之后,需要和前一个事件的值进行比较,比前一个时间的值大的时候才把它进行不出,那这就是一个有状态的计算。
4、流计算中的状态
去重场景下记录所有的主键,又或者说在窗口计算里,比如有一个一小时窗口,已经进入这个窗口还没触发的数据,这也是计算的状态。机器学习,深度学习这种场景里面,分流状态中间结果数据,或者训练的模型和参数数据。这些数据都是流计算中的状态。
二.全局一致性快照
Flink 是一个分布式系统,全局一致性快照是分布式系统是做故障恢复的方式。
1.什么是全局快照
假设G20领导人系统在杭州拍摄,给所有参会的领导人拍一张照,16年非常简单,所有人在同一时间同一地点,摆好姿势拍照就好。今年疫情的原因没办法聚在一起,沙特阿拉伯今年都通过网络参会,这种情况下拍全局拍照,只能每一个领导人,在不同的地点分布拍张照,集合起来。
分布式应用多个进程,分布在多个服务器上。应用内部有自己的处理逻辑和状态。应用间可以通信,领导人之间可以打电话,发短信或视频过程中交流。分布式应用内部状态应用间可以通信的情况下,某一时刻的全局状态叫做全局快照。
2.为什么需要全局快照
第一方面可以用它做检查点,对它的全局状态做备份,当应用程序故障时可以拿来恢复。第二方面可以做死锁检测,快照当前程序运行,对快照进行分析应用程序是否存在死锁的状态,进行相应的处理。
全局快照的例子:
P1、P2是两个进程,之间有消息发送到管道。P1发给P2的信息通道为C12,P2给P1发的消息叫C21。对于P1来说,C12相当于发送消息的管道叫 output channel,C21是接受信息的管道叫 input channel。
除了管道之外每个进程都有本地状态。
P1、P2进程里都有X、Y、Z,有它相应的值。P1、P2本地的状态+它们之间发送消息管道的状态就说它是一个初始的全局状态就叫做全局快照。
假设P1发送消息给P2将其状态变量X2的值从4更改为7,但消息还没有到达P2,在此状态下也组成一个全局快照
P2收到了P1的消息,这个状态也是全局状态。
P2将本地变量从4更改为7,这也是一个全局快照。
当事件发生时,全局的状态会发生改变,这里的事件包括:
.进程发送消息
.进程接收到消息
.进程修改状态
3.什么是全局一致性快照
a->b代表在绝对时钟(realtime)下a happened before b,则当一个全局快照满足下述条件时,我们称其为一个全局一致性快照:如果A->B且B被包含在该快照中,则A也被包含在这个快照中。
快照里的事件是并发的,互相之间没有前后的关系。
没有哪一个发生在后面的事件包含在快照里,前面的事件不包含在快照里。
发生在后面的事情包含在快照里并且前面的事件没有包含在快照里。
4.全局一致性快照的实现方法
时钟同步?
时钟同步没有办法保证全局一致性,NTP 时钟同步存在时间偏差,偏差可能很小毫秒级别的。
P1进程在本地9:20am做了本地的快照,一个事件发生,一个消息发送给P2,消息达到P2时本地时间还不到9:20am。事件发生后本地的时间才达到9:20am。就出现了不一致的情况。
全局同步?
大家都不动拍一张照片,问题也很明显。Stop-the-world 让所有应用程序停下来,性能非常差。