首页/数据/数据工程与 ETL 速查/Flink CDC 与 checkpoint 位点提交
CDC 与同步53 条

Flink CDC 与 checkpoint 位点提交

Flink CDC 的增量位点随 checkpoint 提交:源算子把 binlog 位点写进检查点,故障恢复从最近成功检查点续读(可能少量重复,靠下游幂等兜底);没开 checkpoint 的作业重启只能按启动模式重来。

位点随 checkpoint 提交

Flink CDC 的增量位点随 checkpoint 提交:源算子把 binlog 位点写进检查点,作业故障恢复时从最近一次成功的检查点续读。这意味着可能存在少量重复事件(检查点之后、故障之前已处理的数据),要靠下游幂等或 upsert 消化;如果作业没有开启 checkpoint,重启后只能按启动模式重新来过。

基本信息

位点提交时机随 checkpoint 完成
恢复语义从最近检查点续读,可能重复少量事件
下游要求upsert 与幂等写入消化重复
间隔权衡过小则检查点开销大,过大则恢复回放量大

典型使用场景

  • 生产作业必开:没有检查点就无法从断点恢复
  • 恢复验证:从保存点恢复后确认位点与数据连续性
  • 间隔调优:在恢复时长与检查点开销之间平衡
  • 端到端语义确认:检查 Sink 是否支持事务或幂等
  • 升级演练:把作业重启与升级流程纳入演练剧本

生产建议的检查点配置

生产建议的检查点配置
SET 'execution.checkpointing.interval' = '30s';           -- 检查点间隔
SET 'execution.checkpointing.mode' = 'EXACTLY_ONCE';      -- 检查点语义
-- 恢复示例:flink run -s :savepointPath: -c 主类 app.jar
-- 检查点存储需要配置为分布式存储,不能落在本机磁盘

配置与影响

配置含义影响
checkpointing.interval检查点间隔过小开销大,过大恢复回放多
checkpointing.mode检查点语义精确一次针对 Flink 状态,不等于端到端
检查点存储位置状态快照存放处放本机磁盘则机器故障后无法恢复
savepoint手动触发的一致性快照作业升级与变更时的恢复点
端到端不重复还取决于 sink 是否支持事务或幂等:EXACTLY_ONCE 检查点语义针对的是 Flink 内部状态,不等于整条链路精确一次。
检查点存储放在本机磁盘是常见踩坑点:机器故障后检查点一起丢失,作业只能从头开始,必须放到分布式存储上。
检查点持续失败比作业崩溃更隐蔽:日志里只出现告警,作业看起来还在跑,但一旦重启就会回放很长的历史。把检查点成功率与最近一次成功检查点的时间纳入监控,比只盯作业是否存活更重要。

易错点

  • 误以为开了检查点就是端到端精确一次,下游不做幂等,恢复后出现重复
  • 检查点存储放在本机磁盘,机器故障后无法恢复
  • 未开启检查点的作业重启只能按启动模式重来,全量窗口被白白消耗
  • 检查点间隔设得过长,故障恢复时回放量巨大,追平时间超出预期

数据来源与参考

  • Apache Flink 官方文档(Checkpointing)
  • Flink CDC 官方文档(checkpoint 与位点)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌