Checkpoint 是什么
Checkpoint(检查点)是流任务定期制作的一致性快照:把各算子的状态与消费位点一起存到外部共享存储,作业故障重启后从最近一次成功的快照恢复,把位点与状态一起倒退回那一刻,从而得到一致的结果。
与恢复时间的关系
恢复时间取决于快照体积与恢复带宽:状态越大,写快照越慢、恢复越久。所以 checkpoint 的持续变大是一个需要治理的信号,通常意味着 key 基数增长、窗口过长或去重状态没有设置过期。它和 Savepoint 的区别是:checkpoint 由系统自动管理并会清理,savepoint 由人工触发并长期保留。
基本信息
| 作用 | 状态与位点的一致性快照,故障恢复的基础 |
|---|---|
| 存储 | HDFS、S3、OSS 等可共享存储,不能放单机本地盘 |
| 触发 | 按时间间隔自动触发,也可手动触发 |
| 与精确一次 | 需要 checkpoint 与事务型 sink 或幂等 sink 共同实现 |
| 与 Savepoint | checkpoint 自动管理、可清理;savepoint 人工触发、长期保留 |
典型使用场景
- 流作业长期运行:靠 checkpoint 实现故障后从断点恢复,而不是从最早重放
- 版本升级前:先打 savepoint,再按新版本从该点恢复
- 状态膨胀治理:通过快照体积与恢复耗时曲线判断是否需要给状态设 TTL
- 精确一次链路:checkpoint 与支持两阶段提交的 sink 配合才成立
- 扩缩容:从快照恢复时会按新并行度重新分配状态
Flink 配置 checkpoint(SQL 作业)
Flink 配置 checkpoint(SQL 作业)
-- 在作业启动前设置:间隔、模式、存储目录与超时
SET 'execution.checkpointing.interval' = '60s'; -- 每 60 秒触发一次
SET 'execution.checkpointing.mode' = 'EXACTLY_ONCE'; -- 一致性模式
SET 'state.checkpoints.dir' = 'hdfs:///flink/checkpoints';
SET 'execution.checkpointing.timeout' = '10min'; -- 单次快照超时
SET 'execution.checkpointing.min-pause' = '30s'; -- 两次快照间的最小间隔Flink 配置 checkpoint(DataStream API)
Flink 配置 checkpoint(DataStream API)
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.enableCheckpointing(60_000); // 每 60 秒一次
env.getCheckpointConfig().setCheckpointTimeout(10 * 60_000); // 单次快照超时
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(30_000); // 避免快照连续触发
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1); // 同时只允许一个快照关键参数读法
| 参数 | 含义 | 取值建议 |
|---|---|---|
| interval | 两次快照的间隔 | 按可接受的重放量定,常为 1 到 5 分钟 |
| timeout | 单次快照超时时间 | 要大于状态最大时的写入耗时 |
| min-pause | 两次快照之间的最小间隔 | 防止快照连续触发吃满 IO |
| 存储目录 | 快照落盘位置 | 必须是共享存储,单机盘无法支撑故障恢复 |
| 重启策略 | 失败后的重试方式 | 设置最大重试次数,避免无限重试掩盖故障 |
checkpoint 存在单机本地磁盘是常见部署错误:节点宕机后快照随磁盘一起丢失,作业只能从头重放,恢复时间与数据重复量都不可控。
重启策略设为无限重试会让作业在故障中反复自愈又反复失败,看起来「一直在跑」,实际数据早已滞后。配合告警与最大重试次数,才能让故障暴露出来。