第 5 章 有状态的计算
5.3 保存点:状态版本控制
检查点由Flink 自动生成,用来在故障发生时重新处理记录,从而修正状 态。Flink 用户还可以通过另一个特性有意识地管理状态版本,这个特性叫 作保存点(savepoint)。
60 | 第 5 章
保存点与检查点的工作方式完全相同,只不过它由用户通过Flink 命令行工 具或者Web 控制台手动触发,而不由 Flink 自动触发。和检查点一样,保 存点也被保存在稳定存储中。用户可以从保存点重启作业,而不用从头开 始。保存点可以被视为作业在某一个特定时间点的快照(该时间点即为保 存点被触发的时间点)。
对保存点的另一种理解是,它在明确的时间点保存应用程序状态的版本。
这和用版本控制系统保存应用程序的版本很相似。最简单的例子是在不修 改应用程序代码的情况下,每隔固定的时间拍快照,即照原样保存应用程 序状态的版本,如图5-9 所示。
图5-9:手动触发的保存点(以圆圈表示)在不同时间捕获正在运行的 Flink 应用程 序的状态
在图中,v.0 是某应用程序的一个正在运行的版本。我们分别在t1时刻和t2
时刻触发了保存点。因此,可以在任何时候返回到这两个时间点,并且重 启程序。更重要的是,可以从保存点启动被修改过的程序版本。举例来说,
可以修改应用程序的代码(假设称新版本为v.1),然后从t1时刻开始运行 改动过的代码。这样一来,v.0 和 v.1 这两个版本同时运行,并在之后的时 间里获取各自的保存点,如图5-10 所示。
有状态的计算 | 61 图5-10:使用保存点更新 Flink 应用程序的版本。新版本可以从旧版本生成的一个 保存点处开始执行
保存点可用于应对流处理作业在生产环境中遇到的许多挑战。
(1) 应用程序代码升级:假设你在已经处于运行状态的应用程序中发现了一 个bug,并且希望之后的事件都可以用修复后的新版本来处理。通过触 发保存点并从该保存点处运行新版本,下游的应用程序并不会察觉到不 同(当然,被更新的部分除外)。
(2) Flink 版本更新:Flink 自身的更新也变得简单,因为可以针对正在运行 的任务触发保存点,并从保存点处用新版本的Flink 重启任务。
(3) 维护和迁移:使用保存点,可以轻松地“暂停和恢复”应用程序。这对 于集群维护以及向新集群迁移的作业来说尤其有用。此外,它还有利于 开发、测试和调试,因为不需要重播整个事件流。
(4) 假设模拟与恢复:在可控的点上运行其他的应用逻辑,以模拟假设的场 景,这样做在很多时候非常有用。
(5) A/B 测试:从同一个保存点开始,并行地运行应用程序的两个版本,有 助于进行A/B 测试。
上述所有挑战都真实存在。Flink 内部的检查点机制以保存点的形式呈现给 用户,用来应对上述挑战。这反映了Flink 检查点本质上是一个可持续升
62 | 第 5 章