Flink CDC—数据同步

文档结构

1、概念简介

Flink CDC = Apache Flink + CDC (Change Data Capture,变更数据捕获);

Flink CDC 是一套能实时监听数据库变化,并把这些变化流式处理的技术方案。

2、环境搭建

(1)Flink CDC 主文档 - 所有 Connector 总览

地址:https://nightlies.apache.org/flink/flink-cdc-docs-stable/docs/connectors/overview/

(2)Pipeline 模式支持的 Connector(YAML 用)

地址:https://nightlies.apache.org/flink/flink-cdc-docs-stable/docs/connectors/pipeline-connectors/overview/

(3)SQL 模式支持的 CDC Source 列表

地址:https://nightlies.apache.org/flink/flink-cdc-docs-stable/docs/connectors/sql-cdc-connectors/overview/

2.1、版本映射

Flink CDC 和 flink 版本本身需要兼容,具体如下:

Flink CDC 版本 支持的 Flink 版本
3.6.x 1.20.x, 2.2.x
3.5.x 1.19.x, 1.20.x
3.4.x 1.19.x, 1.20.x
3.3.x 1.18.x, 1.19.x, 1.20.x, 2.1.x
3.2.x 1.17.x, 1.18.x, 1.19.x, 1.20.x
3.1.x 1.16.x, 1.17.x, 1.18.x, 1.19.x
3.0.x 1.14.x, 1.15.x, 1.16.x, 1.17.x, 1.18.x
2.4.x 1.13.x, 1.14.x, 1.15.x, 1.16.x, 1.17.x
2.3.x 1.13.x, 1.14.x, 1.15.x, 1.16.x
2.2.x 1.13.x, 1.14.x
2.1.x 1.13.x
2.0.x 1.13.x
1.4.0 1.13.x
1.3.0 1.12.x
1.2.0 1.12.x
1.1.0 1.11.x
1.0.0 1.11.x

2.2、安装部署

下载地址:https://github.com/apache/flink-cdc/releases

公共包(必须下载)

包名 作用 是否必须
Apache Flink CDC 3.2.0 (tar) 核心运行环境、启动脚本、基础依赖 ✅ 两种模式都必须

分模式(按需下载)

模式 你当前场景 需要下载的连接器 Jar
Pipeline 模式(YAML 配置) MySQL → Kafka(YAML 同步) MySQL Pipeline Connector Jar Kafka Pipeline Connector Jar
Flink SQL 模式(写 SQL) MySQL → Kafka(Flink SQL 同步) MySQL Source Connector Jar Kafka Sink Connector Jar

3、数据同步

3.1、pipeline模式

bash 复制代码
######################################################################
# 这就是你想要的:纯配置同步 MySQL → Kafka,不用写SQL
######################################################################
source:
  type: mysql
  hostname: 192.168.1.100
  port: 3306
  username: root
  password: 123456
  server-id: 1
  server-time-zone: Asia/Shanghai

  # 同步哪些库、哪些表
  database: test_db
  table: user,order,product  # 可以配多张表
  # 或者配通配符:table-include-pattern: test_db\\..*

sink:
  type: kafka
  name: Kafka Sink
  brokers: 192.168.1.200:9092
  topic: ods_${database}_${table}   # 自动按规则生成topic名

  # 格式:默认就是 Debezium-JSON(before/after/op)
  format: debezium-json

  # 主键作为 Kafka key,保证有序
  key.fields: pk
  value.fields: include:.*

pipeline:
  name: mysql-to-kafka
  parallelism: 3

3.1.1、topic映射

当通过flink cdc 进行数据从数据库同步到 kafka时,flink cdc 支持三种 表和 topic 的映射方式:

1)默认格式(不指定)

源端:db.tablename

topic:db.tablename

2)自定义映射

通过 sink.tableId-to-topic.mapping 参数指定映射关系;

bash 复制代码
source:
  type: mysql
  tables: mydb.user, mydb.order, mydb.product
sink:
  type: kafka
  properties.bootstrap.servers: kafka:9092
  # 核心映射配置
  sink.tableId-to-topic.mapping: >
    mydb.user:ods_user;
    mydb.order:ods_order;
    mydb.product:ods_product

说明:这种格式下,表和topic 的映射规则只能是一一映射,无法进行一些复杂的或者批量映射以及正则匹配映射;

3)route 规则(最灵活)

yaml 复制代码
source:
  type: mysql
  tables: app_db.*
sink:
  type: kafka
  properties.bootstrap.servers: kafka:9092
# 路由映射
route:
  - source-table: app_db.orders
    sink-table: kafka_ods_orders
  - source-table: app_db.shipments
    sink-table: kafka_ods_shipments
  - source-table: app_db.products
    sink-table: kafka_ods_product
  • 整库同步
yaml 复制代码
route:
  - source-table: test_db\..*          # 正则匹配 test_db 所有表(官方语法)
    sink-table: ods_test_db_<>         # 目标 Topic/表名
    replace-symbol: <>                # 官方占位符(<> 替换为原表名)
    description: 整库同步加前缀(官方标准写法)
  • 分表合并
yaml 复制代码
route:
  - source-table: test_db\.order_\d+  # 正则匹配 order_01、order_02...(官方)
    sink-table: ods_test_db_order_all # 合并到同一个目标
    description: 分表合并(官方核心场景)

说明:Flink CDC 3.1.0 支持通过 route 将多个分表合并为一个目标表;

  • 正则捕获组
yaml 复制代码
route:
  - source-table: test_db\.t_(.*)     # 捕获 t_ 后内容(官方捕获组语法)
    sink-table: ods_$1                # $1 = 捕获组(官方引用)
    description: 去掉前缀 t_(官方高级用法)

官方说明:

正则捕获组可以实现(批量去掉前缀 / 重命名)功能更高级;

(.*):正则捕获组(官方支持)

$1:引用第一个捕获组(官方标准)

效果:t_user → ods_user、t_order → ods_order

  • 多规则优先级
yaml 复制代码
route:
  # 规则1:VIP表特殊路由(优先)
  - source-table: test_db\.vip_user
    sink-table: ods_vip_user_special
    description: VIP表单独映射

  # 规则2:其余表通用规则
  - source-table: test_db\..*
    sink-table: ods_test_db_<>
    replace-symbol: <>
    description: 普通表通用路由
  • sql 模式
bash 复制代码
-- 1. MySQL 源表
CREATE TABLE mysql_user (
    id INT,
    name STRING,
    phone STRING,
    create_time TIMESTAMP,
    PRIMARY KEY (id) NOT ENFORCED  -- 必须声明主键!
) WITH (
    'connector' = 'mysql-cdc',
    'hostname' = '192.168.1.100',
    'port' = '3306',
    'username' = 'root',
    'password' = '123456',
    'database-name' = 'test_db',
    'table-name' = 'user'
);

-- 2. Doris 目标表
CREATE TABLE doris_user (
    id INT,
    name STRING,
    phone STRING,
    create_time TIMESTAMP,
    PRIMARY KEY (id) NOT ENFORCED
) WITH (
    'connector' = 'doris',
    'fenodes' = '192.168.1.200:8030',
    'table.identifier' = 'ods_db.user_table',
    'username' = 'root',
    'password' = '',
    'sink.label-prefix' = 'doris_user_label',
    'sink.enable-2pc' = 'false',
    'sink.buffer-count' = '10000',
    'sink.buffer-flush.interval' = '1s'
);

-- 3. 同步
INSERT INTO doris_user
SELECT * FROM mysql_user;
相关推荐
大大大大晴天️3 小时前
Flink Resource Providers 深度解析:机制原理、部署模式与最佳实践
大数据·flink
大大大大晴天15 小时前
Flink Resource Providers 深度解析:机制原理、部署模式与最佳实践
flink
uyermw_4111 天前
PyTorch数据集与加载器全解析
flink·etcd
阿坤带你走近大数据1 天前
Flink中背压的详细介绍
大数据·flink
yyoc971 天前
本地 Flink on K8s + Iceberg + MinIO 实时数仓平台 — AI部署指南与踩坑实录
大数据·ai·flink·kubernetes·iceberg
阿坤带你走近大数据1 天前
flink的架构介绍
大数据·架构·flink
HEADKON2 天前
Synagis帕利佐单抗给药季节为11月至次年4月,过敏体质者需备肾上腺素
flink
korry242 天前
flink实时计算实例(保姆级操作)
大数据·flink
陆水A4 天前
【实时数仓·3】Flink多表JOIN状态爆炸——Event Time Temporal JOIN + TTL分层治理
大数据·数据仓库·数据分析·flink·数据库开发·bigdata
INGNIGHT4 天前
Flink 的三种一致性语义
大数据·flink·linq