1.前言 对于很多做离线或者实时数仓的小伙伴来说,我先问几个问题,看看小伙伴萌能回答上来吗?
- ⭐ 你知道状态是什么吗?在离线数据开发的经历中,你碰到过状态的概念吗?
- ⭐ 为什么离线数仓不需要状态,实时数据开发中老是提到状态的概念?
- ⭐ Flink 中的状态、状态后端、全局一致性快照(CheckpointSavepoint) 的作用都是什么,这三个概念的关联又是什么?
- ⭐ Flink 是通过什么机制来做 Checkpoint 的?为什么这套机制能够做到精确一次呢?
- ⭐ Flink Checkpoint 是基于 Chandy-Lamport 算法的,但是 Flink 的实现相比 Chandy-Lamport 算法之间又有哪些优点、缺点?
- ⭐ Flink Checkpoint 用到了 barrier,为什么用了 barrier 做的快照就能保证全局一致性快照的正确性?barrier 到底起到了什么作用?
小伙伴们思考一下,都能回答上来么,如果对于某些问题你还有疑问,楼主会通过本篇文章帮你解答这些问题,理清这些概念!
由于本文内容较多,所以博主将本文分为上,下两集,本别在两天发出。
我们先来看看博主整理的本文介绍思路以及博主希望大家在看完每一小节之后能够学到的内容。
- ⭐ 什么是状态?
希望小伙伴萌能够发散思维的去思考状态,状态这个概念不仅仅只限于 Flink 的状态,状态是一个无处不在的东西
- ⭐ 什么是全局一致性快照?其和状态的管理?
举一些状态、全局一致性快照的一些生活、工作中应用的例子,希望大家大家学习到全局一致性快照 = 一个应用某一时刻(瞬间)所有事物所处状态的合集,两者是包含关系
- ⭐ 为什么需要全局一致性快照?
希望大家学习到有了全局一致性快照能帮助我们做故障恢复、死锁检测等很多有利的事情。
- ⭐ 常见分布式应用中的全局一致性快照包含哪些内容?
通过一个简单分布式应用介绍一下一个全局一致性快照包含:分布式应用每个进程的状态 正在网络传输中的消息(这个消息其实就是状态)。并且全局一致性快照每时每刻都存在的,时间轴上的每一个时刻都存在一个全局一致性快照(类似无时无刻的在拍照片,每个照片都是一个全局一致性快照)。Flink 做 Checkpoint 其实就是每隔固定的时间(小伙伴萌自己在程序代码中设定的 Checkpoint 间隔)从时间轴上的一个点拿出来这个时间点对应的一个全局一致性状态。
- ⭐ 分布式应用实现全局一致性快照的方案?
2.什么是状态?
2.1.首先看看状态的定义
当前计算流程需要依赖到之前计算的结果,那么之前计算的结果就是状态。
从上面这个定义出发。我们就可以意识到,状态并不仅仅是在 Flink 中有这个概念,其实这是一个很广泛的概念。状态是一个普遍存在的东西!
2.2.状态的常见案例
- ⭐ 生活中的例子:为什么我知道我的面前放着一台电脑?因为眼睛接收到外界的图案,然后我的大脑接收到这个眼睛传输的图案信息后,拿记忆中存储的图案进行对比,匹配得到这是电脑,所以我才识别除了这是一台电脑,其中记忆中存储的图案就是状态;比如日久生情,为什么感情会越来越深,因为今天的感情 = 今天积累的感情 以前积累的感情,以前积累的感情就是状态。其实可以看到生活中无处不在都有状态!
- ⭐ web server 应用中的状态:打开 github 页面,列表展示了我的归属仓库。其流程就是 web client 发给 web server 去查询我的归属仓库,web server 接收到请求之后,然后去存储引擎中进行查询匹配返回。那么存储引擎中存储的内容就是状态,如下图所示:
1
- ⭐ Flink 应用中的状态:计算最常见的 DAU 指标,那么必然需要做 id 去重,涉及到去重时,就要存储历史所有来过的的 id,如下图所示,案例非常之多:
2
3.什么是全局一致性快照?
- ⭐ 生活中的例子:拍一个照片,那么照片的内容就是当时的一个全局一致性快照(其中每一个人都有一个 状态,这些 状态 在同一时刻的组合就是一个 全局一致性快照)。所以其实 全局一致性快照 是由所有 状态 的一个时刻的快照组成。
- ⭐ 分布式应用的例子:我们有一个分布式应用,其有多个进程分布在多个物理机上,在每个进程内部都有自己的处理逻辑和状态,并且每个进程之间可以互相通信。那么这个分布式应用某一时刻的全局状态,也叫做 全局一致性快照。
在了解了状态以及全局一致性快照之后,我们来看看我们为什么需要全局一致性快照?
4.为什么需要全局一致性快照?
- ⭐ 可以用来故障恢复:我们以 Flink 计算 DAU 为例,如果没有全局一致性快照(即没有状态),也就是我们没有使用到 MapState 去重,而只用一个存在内存中的 HashMap 做去重的话,当 Flink 任务发生故障时,重新拉起之后,HashMap 的数据就清空了,那么我们就需要从历史最开始的起点开始重跑所有的数据,才能得到正确的数据。但是:
- ⭐ 流式应用的上游存储介质一般都不支持存储历史所有数据(比如上游为 kafka,kafka 不可能存储历史所有数据)
- ⭐ 重跑时效性不能满足时效性要求(回溯历史数据的情况下,一定会产生延迟,时效性是达不到要求的)
- ⭐ 而当有了全局一致性快照之后,我们就不必要从【历史最开始的起点】开始重跑所有的数据(其实这就是我们需要全局一致性快照的目的!!!),数据可以从近处回溯,并且由于回溯数据范围小,时效性也可以被满足
- ⭐ 可以做任务的死锁检测:快照其实就相当于某一个时刻的抓拍,当我们抓拍到了一个任务某一时刻的运行情况时,我们就可以分析在任务是不是有死锁。
回到 Flink 来说,Flink 的 Checkpoint 和 Savepoint 实际上就是全局一致性快照这个概念在工业应用上的一个具体实现。
5.常见分布式应用中的全局一致性快照包含哪些内容?
如下面第一张图所示,就是一个分布式应用,我们可以看到,分布式应用的一个全局一致性快照包含:分布式应用每个进程的状态 正在网络传输中的消息(这个消息其实就是状态),也就是以上帝视角去抓拍这个分布式应用时,这个分布式应用的全局快照会包含 Process 的状态 网络 Channel 中的状态。
以这个前提出发,我们连看下面四张图:
上面四张图对应到这个分布式应用四个时刻的四个快照,其实应用的每一个时刻都存在一个全局一致性快照,远远不止四个。
6.分布式应用实现全局一致性快照的方案?
实现方式主要分为同步实现方式和异步实现方式两类。
6.1.同步实现方式
14
- ⭐ NTP[1]: NTP服务器[Network Time Protocol(NTP)]是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒)结论:在分布式应用中,不同机器上面的进行无法实现时钟的完全对齐,所以分布式应用也就没法用时钟同步的方式做出全局一致性快照。
- ⭐ Stop-The-World[2]结论:使用此种方式做快照,分布式应用所有进程会停下来做快照,不满足时效等需求,在实时分布式应用中无法采用。
上述两种同步方式都不行,那如果同步实现方式不满足需求,能使用异步方式做到同步相同的快照也是可以满足需求的。
6.2.异步实现方式
- ⭐ Chandy-Lamport[3]
本文下集详细接着介绍。敬请期待。
参考资料
[1]什么是 NTP: https://baike.baidu.com/item/NTP服务器/8633994?fr=aladdin。
[2]Stop-The-World 说明: https://www.jianshu.com/p/b210f9db19a3。
[3]Chandy-Lamport 论文链接: https://www.microsoft.com/en-us/research/uploads/prod/2016/12/Determining-Global-States-of-a-Distributed-System.pdf?ranMID=24542&ranEAID=J84DHJLQkR4&ranSiteID=J84DHJLQkR4-mVoVymFnAblBx3zwyf98Pw&epi=J84DHJLQkR4-mVoVymFnAblBx3zwyf98Pw&irgwc=1&OCID=AID2000142_aff_7593_1243925&tduid=(ir__1hs2uuow6wkfq3oxkk0sohzzwm2xpc33lxd0o6g200)(7593)(1243925)(J84DHJLQkR4-mVoVymFnAblBx3zwyf98Pw)()&irclickid=_1hs2uuow6wkfq3oxkk0sohzzwm2xpc33lxd0o6g200。