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;
相关推荐
渣渣盟12 小时前
Flink并行数据源:ClickSource实现详解
flink·scala
渣渣盟12 小时前
Flink单流转换算子实战解析
flink·scala
渣渣盟13 小时前
Apache Flink物理分区算子全解析
大数据·flink·apache
csgo打的菜又爱玩20 小时前
11.JobManager 启动流程总结
大数据·开发语言·qt·microsoft·flink
大大大大晴天️20 小时前
Flink技术实践-Flink重启策略选型指南
java·大数据·flink
Justice Young2 天前
Flink第三章:Flink运行及部署
大数据·flink
Justice Young2 天前
Flink第四章:运行架构
大数据·flink
二十六画生的博客3 天前
每个subtask都提交一份快照到hdfs,会把10个小的快照合并成一个大的吗?谁来合并?
大数据·hadoop·hdfs·flink
juniperhan3 天前
Flink 系列第24篇:Flink SQL 集成维度表指南:存储选型、参数调优与实战避坑
大数据·数据仓库·sql·flink
Justice Young3 天前
Flink第五章:DataStream API
大数据·flink