CDC与Flink:数据库变更实时同步
CDC原理 · Flink CDC · Binlog捕获 · 全增量一体 · 实战场景
📋 面试题
什么是CDC?Flink CDC是怎么工作的?你们用CDC做什么?
CDC是什么?
Change Data Capture:捕获数据库的增删改变更,实时同步到下游系统。
MySQL INSERT/UPDATE/DELETE
↓ Binlog
Flink CDC 捕获变更
↓
写入 Kafka / Doris / Hudi / 数仓
传统方案是每天全量同步(T+1),CDC实现了秒级同步。
Flink CDC的核心优势:全增量一体
传统CDC方案(Debezium + Kafka):
全量快照 → Kafka → Flink消费
增量Binlog → Kafka → Flink消费
需要两套流程,切换复杂
Flink CDC(内置):
全量快照 + 增量Binlog → 一个Flink作业搞定
自动从快照切换到增量,无缝衔接
-- Flink SQL直接读MySQL的CDC
CREATE TABLE mysql_orders (
order_id INT,
user_id STRING,
amount DECIMAL(10,2),
status STRING,
update_time TIMESTAMP(3),
PRIMARY KEY (order_id) NOT ENFORCED
) WITH (
'connector' = 'mysql-cdc',
'hostname' = 'mysql-host',
'port' = '3306',
'username' = 'flink',
'password' = 'xxx',
'database-name' = 'shop',
'table-name' = 'orders'
);
-- 直接同步到Doris
INSERT INTO doris_orders SELECT * FROM mysql_orders;
我们用Flink CDC把MySQL的订单表实时同步到Doris做分析。之前是每天凌晨全量同步(T+1),业务看的是昨天的数据。上了CDC后延迟降到秒级,业务终于能看到实时数据了。
常用场景
| 场景 | 说明 |
|---|---|
| 实时数仓ODS层 | 替代离线T+1同步,秒级入仓 |
| 缓存更新 | DB变更→实时更新Redis/ES |
| 数据库迁移 | 旧DB→新DB实时同步 |
| 实时物化视图 | 多表JOIN的结果实时更新 |
注意事项
1. 权限:需要MySQL的REPLICATION SLAVE权限
2. Binlog格式:必须是ROW模式(不能是STATEMENT)
3. 全量阶段锁表:默认全量快照会加全局读锁,
Flink CDC 2.0+支持无锁读取(chunk-based snapshot)
4. Schema变更:加字段可以,改字段类型需要小心
📌 总结
| 记忆点 | 内容 |
|---|---|
| CDC本质 | 捕获数据库增删改,实时同步 |
| Flink CDC优势 | 全增量一体,一个作业搞定 |
| 实战场景 | T+1变实时、缓存更新、DB迁移 |
| 注意事项 | ROW模式Binlog + REPLICATION权限 |
▶ 下一篇预告:DAY 12 维表JOIN
Wood聊大数据 | 9年大数据老兵,聊技术、聊职场、聊成长
小红书正文
CDC = Change Data Capture,捕获数据库的增删改实时同步到下游。传统T+1全量同步的替代方案。
Flink CDC最大的优势:全增量一体。全量快照+增量Binlog一个Flink作业搞定,自动无缝切换。不用像Debezium+Kafka那样搞两套。
SQL写法极简:建表指定mysql-cdc连接器,INSERT INTO目标表 SELECT * FROM源表。几行SQL完成实时同步。
我们用它把MySQL订单表实时同步到Doris。之前T+1业务看的是昨天数据,上了CDC延迟降到秒级。
注意事项:MySQL Binlog必须是ROW模式、需要REPLICATION权限、全量阶段注意锁表问题。