CDC 介绍
CDC 的全称是 Change Data Capture
在广义的概念上,只要是能 捕获数据变更 的技术,都可以称为 CDC 。
目前通常描述的 CDC,捕获数据库中数据变更,将这些变更发送到 消息中间件、数据库中
应用场景
数据同步:用于备份,容灾;
数据分发:一个数据源分发给多个下游系统;
数据采集:面向数据仓库 / 数据湖的 ETL 数据集成,是非常重要的数据源。
分类
CDC 的技术方案非常多,目前业界主流的实现机制可以分为两种:
基于查询的 CDC
离线调度查询作业,批处理。把一张表同步到其他系统,每次通过查询去获取表中最新的数据;
无法保障数据一致性,查的过程中有可能数据已经发生了多次变更;
不保障实时性,基于离线调度存在天然的延迟。
基于日志的 CDC
实时消费日志,流处理,例如 MySQL 的 binlog 日志完整记录了数据库中的变更,可以把 binlog 文件当作流的数据源;
保障数据一致性,因为 binlog 文件包含了所有历史变更明细;
保障实时性,因为类似 binlog 的日志文件是可以流式消费的,提供的是实时数据。
常见开源 CDC 对比
| 比较维度 | Flink CDC | DataX | Canal | Sqoop | Maxwell |
|---|---|---|---|---|---|
| 增量同步 | 支持 (基于日志) | 不支持 (仅支持模拟,如加时间戳) | 支持 (核心功能) | 不支持 (仅支持模拟) | 支持 (核心功能) |
| 断点续传 | 支持 (基于Checkpoint) | 不支持 (需依赖外部调度) | 支持 (记录位点) | 不支持 | 支持 (记录位点) |
| 全量同步 | 支持 (无锁并行) | 支持 (擅长离线批量) | 不支持 (通常需配合其他工具) | 支持 (核心功能) | 不支持 |
| 全量+增量 | 支持 (一体化无缝切换) | 不支持 | 不支持 (需手动拼接) | 不支持 | 不支持 |
| 架构模式 | 分布式 (基于Flink集群) | 单机 (多线程) | 单机/集群 (通常作为独立服务) | 单机 (MapReduce任务) | 单机 (独立进程) |
| 核心生态 | Apache Flink (流计算) | 阿里开源 (插件化) | 阿里开源 (模拟Slave) | Apache Hadoop (MapReduce) | MySQL Binlog解析 |
| 维护状态 | 活跃 (Apache孵化项目) | 活跃 (社区维护) | 活跃 (但逐渐被Flink CDC取代) | 维护 (功能已稳定,更新较少) | 维护 (功能稳定,更新较少) |
对比增量同步能力
- 基于日志的方式,可以很好的做到增量同步;
- 而基于查询的方式是很难做到增量同步的。
对比全量同步能力
基于查询或者日志的 CDC 方案基本都支持,除了 Canal。
对比全量 + 增量同步的能力
只有 Maxwell、Flink CDC、Debezium、Oracle Goldengate 支持较好。
架构对比
在大数据 分布式系统中, Flink CDC 可以很好的将数据存储到分布式的系统,如 Hive、HDFS、Iceberg、Hudi 等
对比 数据转换 / 数据清洗
- 在 Flink CDC 上操作相当简单,可以通过 Flink SQL 去操作这些数据;
- 但是像 DataX、Debezium 等则需要通过脚本或者模板去做,所以用户的使用门槛会比较高。
生态方面
Flink CDC 下游有丰富的 Connector,例如将数据写入到 TiDB、MySQL、Pg、HBase、Kafka、ClickHouse 等常见的一些系统,也支持各种自定义 connector。
https://blog.csdn.net/qq_46045632/article/details/122310689