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;
相关推荐
juniperhan2 小时前
Flink 系列第10篇:Flink 分布式缓存详解
分布式·缓存·flink
武子康5 小时前
大数据-269 实时数仓-Flink+HBase+DIM层数据处理实战:构建地区维度数据仓库
大数据·后端·flink
lifallen1 天前
Flink Checkpoint 流程、Barrier 流动与 RocksDB 排障
java·大数据·flink
lifallen1 天前
一篇文章讲透 Flink State
大数据·数据库·python·flink
csgo打的菜又爱玩1 天前
3.HAService启动流程解析
flink
大大大大晴天️1 天前
Flink技术实践-FlinkSQL Join技术全解
大数据·flink
csgo打的菜又爱玩1 天前
4.BlobServer 源码解析
大数据·架构·flink
tian_jiangnan1 天前
flink mysql集群增删改查
大数据·mysql·flink
武子康1 天前
大数据-268 实时数仓-ODS 层 Flink+Kafka+HBase实时流处理:Kafka数据写入维度表实战
大数据·后端·flink