Flink CDC流程图及详细解释

8 次阅读

Flink CDC(Change Data Capture)是一种基于数据变更日志实现实时数据同步的技术方案,可以将数据库中的新增、更新、删除操作捕获,并实时传输到下游系统。随着实时数仓、数据湖、数据同步场景的发展,Flink CDC凭借低延迟、高可靠以及与Flink生态的深度结合,成为企业构建实时数据链路的重要技术组件。

理解Flink CDC的工作流程,有助于掌握数据库日志采集、数据转换、消息传递以及实时计算整个链路。下面通过流程图和详细解析介绍Flink CDC的核心执行过程。

Flink CDC整体流程图

Flink CDC完整的数据处理流程可以概括为:

        数据源数据库
             |
             |
     +---------------+
     | 数据变更日志   |
     | Binlog/RedoLog |
     +---------------+
             |
             |
     +---------------+
     |  CDC Connector |
     |  日志捕获组件  |
     +---------------+
             |
             |
     +---------------+
     | Flink Source  |
     | 数据读取阶段   |
     +---------------+
             |
             |
     +---------------+
     | 数据转换处理   |
     | Flink SQL/DataStream |
     +---------------+
             |
             |
     +---------------+
     | Sink连接器     |
     | 写入目标系统   |
     +---------------+
             |
             |
   Kafka / Elasticsearch /
   MySQL / Hudi / Iceberg

整个流程可以分为五个主要阶段:

  1. 数据库产生变更日志

  2. CDC连接器捕获变化事件

  3. Flink Source读取数据

  4. Flink进行实时计算处理

  5. Sink写入目标系统


第一阶段:数据库产生数据变更日志

Flink CDC并不是直接扫描数据库表数据,而是读取数据库自身维护的数据变化日志。

不同数据库对应不同日志类型:

数据库日志类型
MySQLBinlog
PostgreSQLWAL
OracleRedo Log
SQL ServerTransaction Log
MongoDBOplog

例如MySQL执行:

SQL
UPDATE user SET name='Tom' WHERE id=1;

数据库不会立即通知Flink CDC,而是先将该事务记录到Binlog中:

{
  "operation":"UPDATE",
  "table":"user",
  "before":{
      "id":1,
      "name":"Jack"
  },
  "after":{
      "id":1,
      "name":"Tom"
  }
}

CDC组件通过读取这些日志,获取数据库变化信息。


第二阶段:CDC Connector捕获变化事件

Flink CDC通过各种Connector连接数据库日志系统。

常见Connector包括:

  • MySQL CDC Connector

  • PostgreSQL CDC Connector

  • Oracle CDC Connector

  • MongoDB CDC Connector

Connector主要负责三个任务:

1. 建立数据库连接

CDC需要具备数据库访问权限,例如MySQL需要开启:

properties
binlog_format=ROW
binlog_row_image=FULL

同时创建具有复制权限的账号:

SQL
CREATE USER 'cdc'@'%'
IDENTIFIED BY 'password';

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT 
ON *.* TO 'cdc'@'%';

2. 初始化数据快照

第一次启动CDC任务时,需要获取已有历史数据。

例如:

数据库表:

user

id   name
1    Jack
2    Lucy
3    Mike

CDC会先执行Snapshot:

Snapshot阶段

读取已有数据
        |
        |
    Flink Source

将历史数据发送到Flink计算链路。


3. 捕获增量变化

快照完成后,CDC自动切换到增量读取模式。

流程:

Snapshot完成

      ↓

记录Binlog位置

      ↓

持续监听Binlog

      ↓

获取INSERT/UPDATE/DELETE事件

这样可以保证数据同步不会遗漏。


第三阶段:Flink Source读取数据

Flink CDC Connector会将数据库变化转换成Flink可以处理的数据流。

例如MySQL一条更新:

SQL
UPDATE order_table
SET status='paid'
WHERE id=100;

转换后:

+I
{
 id:100,
 status:"created"
}


-U
{
 id:100,
 status:"created"
}


+U
{
 id:100,
 status:"paid"
}

其中:

  • +I:Insert新增数据

  • -U:Update之前的数据

  • +U:Update之后的数据

  • -D:Delete删除数据

这种变化事件模型是Flink CDC处理数据变更的核心。


第四阶段:Flink实时计算处理

数据进入Flink之后,可以使用Flink SQL或者DataStream API进行处理。

例如:

数据清洗

过滤无效数据:

SQL
SELECT *
FROM user
WHERE status='active';

数据关联

订单表关联用户表:

SQL
SELECT
order.id,
user.name,
order.amount
FROM order
JOIN user
ON order.user_id=user.id;

实时聚合

统计实时交易金额:

SQL
SELECT
product_id,
SUM(amount)
FROM orders
GROUP BY product_id;

Flink负责:

  • 状态管理

  • 时间窗口计算

  • Exactly Once一致性

  • 故障恢复

确保实时数据处理可靠。


第五阶段:Sink写入目标系统

处理后的数据通过Sink连接器写入目标系统。

常见目标包括:

写入Kafka

流程:

MySQL
 |
Flink CDC
 |
Kafka

适用于:

  • 数据分发

  • 事件驱动架构

  • 多系统消费


写入数据仓库

例如:

MySQL
 |
Flink CDC
 |
Flink SQL
 |
Hive/Iceberg/Hudi

用于实时数仓建设。


写入搜索系统

例如:

MySQL
 |
Flink CDC
 |
Elasticsearch

实现数据库数据实时搜索。


Flink CDC核心架构解析

Flink CDC整体架构主要包含以下组件:

+----------------------+
|      Database        |
| MySQL/PostgreSQL/... |
+----------------------+
            |
            |
      Log Reader
            |
            |
+----------------------+
|   CDC Connector      |
+----------------------+
            |
            |
+----------------------+
|    Flink Runtime     |
| Source -> Operator   |
| -> Sink              |
+----------------------+
            |
            |
+----------------------+
|   Target System      |
+----------------------+

其中:

Source层

负责:

  • 连接数据库

  • 读取日志

  • 生成Change Event


Operator层

负责:

  • 数据转换

  • 状态计算

  • 业务逻辑处理


Sink层

负责:

  • 数据输出

  • 外部系统写入

  • 数据一致性保证


Flink CDC中的Snapshot与Incremental流程

Flink CDC启动时通常包含两个阶段:

Snapshot阶段

流程:

启动任务

 ↓

读取数据库表结构

 ↓

扫描历史数据

 ↓

发送历史数据

 ↓

保存日志位点

特点:

  • 一次性读取旧数据

  • 保证初始数据完整


Incremental阶段

流程:

监听Binlog

 ↓

捕获变化

 ↓

生成事件

 ↓

实时同步

特点:

  • 持续运行

  • 延迟低

  • 支持实时同步


Flink CDC数据一致性机制

企业应用中最关注的问题之一就是数据一致性。

Flink CDC主要通过以下机制保证可靠性:

1. Checkpoint机制

Flink定期保存任务状态:

任务运行

 ↓

Checkpoint

 ↓

保存offset

 ↓

故障恢复

任务异常恢复后,可以继续从正确位置读取日志。


2. Exactly Once语义

通过:

  • 两阶段提交

  • 状态快照

  • 事务写入

保证数据不会重复或丢失。


3. Schema变化处理

数据库字段变化时,例如:

SQL
ALTER TABLE user
ADD COLUMN age INT;

Flink CDC可以感知Schema变化,并同步到下游。


Flink CDC常见应用场景

1. 实时数据同步

例如:

业务数据库
      |
  Flink CDC
      |
 数据仓库

减少传统ETL批处理延迟。


2. 实时数仓建设

通过CDC采集业务库数据,实时生成:

  • 明细层

  • 汇总层

  • 数据指标


3. 数据备份与迁移

例如:

MySQL
 |
Flink CDC
 |
新数据库

实现不停机迁移。


4. 搜索数据实时更新

数据库修改后:

用户修改商品信息

↓

CDC捕获

↓

更新ES索引

↓

搜索结果同步变化

Flink CDC常见问题分析

1. 数据延迟较高

可能原因:

  • 数据库压力过大

  • Flink并行度不足

  • Sink写入速度慢

优化方式:

  • 增加Source并行度

  • 调整Checkpoint参数

  • 优化目标数据库写入


2. 数据重复消费

原因:

  • Checkpoint失败

  • Sink不支持事务

解决:

  • 使用幂等写入

  • 开启Exactly Once模式


3. Binlog读取失败

检查:

  • Binlog是否开启

  • 用户权限是否正确

  • 日志格式是否为ROW


总结

Flink CDC的数据流程核心可以概括为:

数据库变化
      ↓
日志捕获
      ↓
CDC Connector解析
      ↓
Flink实时计算
      ↓
结果写入目标系统

它通过读取数据库日志,将传统离线同步模式升级为实时数据流处理模式。理解Flink CDC流程图,不仅能够帮助开发人员快速搭建实时同步链路,也能更好地解决数据一致性、延迟优化以及数据架构设计中的实际问题。