一、什么是 Flink CDC?
CDC(Change Data Capture)即变更数据捕获,核心目的是实时获取数据库中的数据变化。
以 MySQL 为例:
MySQL → Flink CDC → StarRocks
Flink CDC 负责从 MySQL 获取:
-
历史数据:Snapshot
-
实时变更:Binlog
-
任务状态:Checkpoint
最终将数据同步到下游系统。
二、Flink CDC 的核心流程
整体可以理解为:
MySQL
│
┌────────┴────────┐
│ │
Snapshot Binlog
│ │
└────────┬────────┘
↓
Flink CDC
│
↓
StarRocks
核心流程:
Snapshot 全量
↓
捕获期间产生的 Binlog
↓
追平 Binlog
↓
持续消费 Binlog
三、Snapshot:同步历史数据
第一次启动 CDC 时,数据库中已经存在大量历史数据,需要先进行全量同步。
Flink CDC 会对 MySQL 做 Snapshot。
对于大表,通常会使用 Incremental Snapshot,按照主键范围把数据拆成多个 Chunk:
1000万数据
Chunk 1:1 ~ 100万
Chunk 2:100万 ~ 200万
Chunk 3:200万 ~ 300万
...
多个 Chunk 可以并行读取,提高全量同步效率。
四、Snapshot 期间如何处理数据变化?
这是 CDC 最关键的地方。
Snapshot 进行过程中,MySQL 仍然可以正常执行:
INSERT
UPDATE
DELETE
这些变化会进入 MySQL Binlog。
因此不能简单理解成:
先做全量
↓
全量完成
↓
再开始监听 Binlog
否则 Snapshot 期间产生的数据变化就可能丢失。
实际逻辑是:
Snapshot
│
│ MySQL继续写入
↓
Binlog
│
↓
Snapshot完成后继续处理对应Binlog
│
↓
持续增量
Flink CDC 会协调 Snapshot 和 Binlog 的位置,使 Snapshot 数据和期间产生的 Binlog 变化能够正确衔接。
五、Binlog:同步实时变化
Snapshot 完成后,Flink CDC 进入持续增量阶段。
MySQL 的:
INSERT
UPDATE
DELETE
都会记录到 Binlog。
Flink CDC 持续读取这些 Binlog 事件,然后发送到下游。
例如:
MySQL
UPDATE user SET name = 'Tom' WHERE id = 1
↓
Binlog
↓
Flink CDC
↓
StarRocks
这样 MySQL 的数据变化就可以实时同步到下游。
六、Checkpoint:故障恢复
Flink CDC 运行过程中还需要解决一个问题:
如果任务挂了,恢复以后从哪里继续?
这由 Flink 的 Checkpoint 机制解决。
Checkpoint 会保存任务当前的状态和 Source 消费进度。
例如:
Binlog
100
101
102
103
104
Checkpoint 已经成功保存到:
103
如果任务处理过程中发生故障,恢复后可以根据 Checkpoint 恢复之前的状态和消费位置。
因此:
Snapshot → 解决历史数据
Binlog → 解决实时变化
Checkpoint → 解决故障恢复
七、为什么 Flink CDC 比较方便?
传统方案可能是:
MySQL
↓
Canal
↓
自研消费者
↓
StarRocks
需要自己处理:
-
全量和增量衔接
-
Binlog 位点
-
失败重试
-
状态保存
-
故障恢复
使用 Flink CDC 后,可以把这些能力放到 Flink 作业中统一管理:
MySQL
↓
Flink CDC
├── Snapshot
├── Binlog
└── Checkpoint
↓
StarRocks
八、MySQL → StarRocks 实际架构
如果业务是把 MySQL 数据同步到 StarRocks,可以直接使用:
MySQL
│
│ Snapshot + Binlog
↓
Flink CDC
│
│ StarRocks Connector
↓
StarRocks
StarRocks 侧通常使用适合 CDC 的表模型承接:
INSERT
UPDATE
DELETE
具体表模型和 Connector 配置需要根据 StarRocks 和 Flink CDC 的版本确定。
九、总结
Flink CDC 的核心其实就是三个东西:
Snapshot
↓
获取历史数据
Binlog
↓
获取实时变化
Checkpoint
↓
保存状态,实现故障恢复
完整流程:
MySQL
│
├── Snapshot ──────────┐
│ ↓
└── Binlog ───────→ Flink CDC
│
Checkpoint
│
↓
StarRocks
最重要的一点是:
Snapshot 不是做完以后才开始增量,而是需要和 Binlog 协同,保证全量初始化期间产生的变更不会丢失。
这也是 Flink CDC 能够完成"全量 + 增量"一致衔接的核心。