Flink CDC全量和增量同步数据如何保证数据的一致性
Apache Flink 的 Change Data Capture (CDC) 功能主要用于实时捕获数据库中的变更记录,并将其转换为事件流以供下游处理。为了保证全量和增量数据同步时数据的一致性、不丢失和不重复读取,Flink CDC 采用了以下策略:
一、保证一致性与不丢失
1、使用事务
当进行全量或增量同步时,Flink CDC通过与数据库的事务机制结合使用,Flink会将操作封装为一个事务,使用事务以确保数据的完整性和一致性。
Flink CDC 依赖于数据库的日志(如mysql binlog)来捕获事务级别的更改,意味着它能识别事务的开始和结束,从而确保在处理变更事件时保持事务的一致性。
2、幂等性处理(精准一次处理)
Flink 作为流处理引擎本身支持精确一次(exactly-once)的状态一致性保证,重复性变更数据,Flink CDC只会将其处理一次。通过 checkpoint 和两阶段提交机制,Flink 能够在故障恢复时准确地回滚或重放事件,从而避免数据丢失和重复处理。
如下游为iceberg v2表,iceberg支持去重
3、基于时间戳的检查点
Flink CDC使用基于时间戳的检查点机制来保证数据的不丢失。当进行全量同步时,Flink CDC使用数据库的全量数据时间戳确保读取到的全量数据是最新的。增量同步过程中,使用mysql binlog时间戳确保只读到修改变更。Flink会记录当前处理的位置,并在发生故障时从最近的检查点恢复,这样可以确保不会重复读取已经处理过的数据。
二、全量与增量衔接
1、全量同步阶段
在初次全量同步时,Flink CDC 可以通过扫描数据库表的全量数据并生成某一时刻对应的初始化快照来保证全量数据的一致性。然后开始同步全量数据到目标系统,保证目标库有完整数据副本。
2、增量同步阶段
完成全量同步之后,Flink CDC 会从日志中订阅后续的增量变更,从全量扫描时快照完成的时间点,开始同步数据库的binlog更新日志。增量数据以有序的方式被摄入到流处理系统中,与全量数据的末尾自然衔接。
3、全量和增量平滑过渡
在 Flink CDC 中,全量和增量数据可以无缝整合,确保了在任何给定时间点,下游系统的数据视图都是完整且最新的。
对于具有事务性的变更日志,全量快照和增量日志中的事件是可以按顺序叠加处理的,这样就能形成一个完整的、一致的数据视图。
通过这些机制,Flink CDC 实现了全量数据导入和增量数据实时追加之间的平滑过渡,有效保证了数据的完整性与一致性。