完整教程:Flink CDC Route 把多源表“按你想要的名字和去向”落到下游

1. Route 是什么?

定义:Route 指定一组匹配规则,将符合条件的源表(支持正则)映射为目标表(支持符号替换)。
作用场景

  • 分表并表app_db.order_01/02/...ods_db.ods_orders
  • 整库迁移source_db.*sink_db.*(保持同名)
  • 批量改名app_db.*ods_db.ods_*(加统一前缀/后缀)
  • 逐表定向orders → ods_ordersshipments → ods_shipments,…

2. 参数与语义

参数含义是否必填
source-table源表 Table ID(支持正则)必填
sink-table目标表 Table ID(支持符号替换必填
replace-symbolsink-table 中出现的“特殊符号”;会被原始源表名替换可选
description规则描述可选

一个 Route 模块可以包含多条规则第一条命中的规则生效(建议按“最具体 → 最宽泛”的顺序书写)。

Table ID 回顾

  • MySQL/Doris/StarRocks:database.table
  • PostgreSQL/Oracle:database.schema.table / schema.table
  • Kafka:topic
    在 YAML 中写正则时,请用引号,并把点号写成 \.

3. 经典路由范式(可拷贝)

3.1 单表改名/迁移(1→1)

route:
- source-table: 'mydb.web_order'
sink-table: 'ods_db.ods_web_order'
description: '将 web_order 同步到 ods_web_order'

3.2 分表并表(多→1)

route:
- source-table: 'mydb\.order_.*'   # order_01/order_02/...
sink-table: 'ods_db.ods_orders'
description: '将分表并到一张明细表'

⚠️ 并表主键冲突:如果不同分表里存在相同主键的数据,下游 Upsert/幂等语义会冲突。建议结合 Transform 注入“分片标识”后,用复合主键(示例见 §5)。

3.3 整库迁移(多→多,保持同名)

利用 符号替换(把目标里的占位符替换成源表名本体):

route:
- source-table: 'source_db\..*'
sink-table: 'sink_db.<>'
replace-symbol: '<>'
description: '整库迁移,保持同名'

source_db.usersink_db.usersource_db.order_01sink_db.order_01

3.4 批量“加前缀/后缀”(多→多,批量改名)

route:
- source-table: 'app_db\..*'
sink-table: 'ods_db.ods_<>'
replace-symbol: '<>'
description: '整库路由并为目标表统一加 ods_ 前缀'

app_db.ordersods_db.ods_ordersapp_db.shipmentsods_db.ods_shipments

3.5 复杂组合(多条规则,先精确后通配)

route:
- source-table: 'mydb.orders'
sink-table: 'ods_db.ods_orders'
- source-table: 'mydb.shipments'
sink-table: 'ods_db.ods_shipments'
- source-table: 'mydb.products'
sink-table: 'ods_db.ods_products'
- source-table: 'mydb\..*'
sink-table: 'ods_db.<>'
replace-symbol: '<>'
description: '兜底:其它表保持同名迁移'

4. 与 Transform/Schema 的协同策略

  • 顺序思路:先用 Route 决定“去哪里、叫什么”,再用 Transform字段治理(投影、改名、派生、过滤)与键位重建
  • Schema 演进:Route 只管“路由与命名”,字段层的新增/改长/改名等,建议在 Transform + 下游轻量级变更(Doris/StarRocks)配合完成。
  • Exactly-Once:并表后请确保下游主键/唯一键能表达幂等语义(见下一节的“并表 + 复合主键”模板)。

5. 分表并表的“强壮版”模板(含复合主键与元数据注入)

目标:把 shop_db.order_01/02/... 并到 ods_db.ods_orders;为避免主键冲突,注入 shard_tbl(来源表名),并把主键改为 order_id, shard_tbl

# 1) 路由:多张源表 → 1 张目标表
route:
- source-table: 'shop_db\.order_.*'
sink-table: 'ods_db.ods_orders'
description: '并表到 ODS 明细表'
# 2) Transform:注入源表名、复合主键、可选建表属性
transform:
- source-table: 'shop_db\.order_.*'
projection: "*, __table_name__ AS shard_tbl, localtimestamp AS etl_ts"
primary-keys: "order_id, shard_tbl"
table-options: "comment=orders merged from shards,compression=zstd"
description: '为并表注入分片标识,设置复合主键与表注释'

__table_name__ 为元数据字段之一(仅在投影中显式引用时生效)。
也可注入 __namespace_name__/__schema_name__ 进行更细粒度的来源追踪。

6. 最小可跑与生产可用模板

6.1 最小可跑:整库迁移并加前缀(MySQL → Doris/StarRocks 均适用)

source:
type: mysql
hostname: localhost
port: 3306
username: root
password: 123456
tables: 'app_db\..*'
server-id: 5400-5404
server-time-zone: UTC
route:
- source-table: 'app_db\..*'
sink-table: 'ods_db.ods_<>'
replace-symbol: '<>'
sink:
type: doris          # 若用 StarRocks,改成 starrocks,并设置对应参数
fenodes: 127.0.0.1:8030
username: root
password: ""
table.create.properties.replication_num: 1
pipeline:
name: Route Demo
parallelism: 2

6.2 生产友好:并表 + 复合主键 + 软删除标记(MySQL → StarRocks)

source:
type: mysql
hostname: localhost
port: 3306
username: root
password: 123456
tables: 'shop_db\.order_.*'
server-id: 5400-5404
server-time-zone: UTC
route:
- source-table: 'shop_db\.order_.*'
sink-table: 'ods_db.ods_orders'
transform:
- source-table: 'shop_db\.order_.*'
projection: "*, __table_name__ AS shard_tbl, __data_event_type__ AS op_type"
primary-keys: "order_id, shard_tbl"
table-options: "comment=orders merged from shards"
# 可选:将 DELETE 转为 INSERT,并用 op_type='-D' 标记(需在 projection 中保留 op_type)
# converter-after-transform: SOFT_DELETE
sink:
type: starrocks
jdbc-url: 'jdbc:mysql://127.0.0.1:9030'
load-url: '127.0.0.1:8030'     # 若镜像用 8080 暴露 FE HTTP,请改成 8080
username: root
password: ""
table.create.properties.replication_num: 1
# 若要 upsert 语义,可设为主键模型(视版本能力):
# table.create.properties.duplicate_key: false
# table.create.properties.primary_key: "order_id, shard_tbl"
pipeline:
name: Sharded Orders Merge
parallelism: 4

7. 踩坑与自检清单

  • 规则优先级:多条规则先命中先用;把“精确匹配”放前面,“通配兜底”放后面。
  • 正则与转义:整库要写 'db\..*';请用引号包住字符串,避免 YAML/正则双重转义混乱。
  • 符号替换sink-table 中出现的 replace-symbol 会被原始表名替换;可自定义符号,例如 __TABLE__
  • 并表主键:合并多表到一表,务必设计复合主键或其它去重策略,确保 Upsert/幂等成立。
  • Schema 对齐:被并入的源表字段集合/类型尽量一致;不一致请通过 Transform 做补齐/改名/类型修正。
  • 软删除:若保留删除轨迹,用 SOFT_DELETE + 投影 __data_event_type__ 为业务列(如 op_type)。
  • 时区一致server-time-zone 与下游/使用方一致,避免时间列错位。
  • 回滚策略:重大路由变更前打 Savepoint,支持灰度与回退。

结语

Route 让“表去哪、叫什么”变成声明式配置,把分表并表、整库迁移、批量改名等繁琐工作收束为几条清晰的 YAML 规则。配合 Transform 的字段治理与主键策略,你可以在不中断上游的前提下,持续演进下游的数据形态与命名规范。

posted @ 2025-12-10 15:22  clnchanpin  阅读(1)  评论(0)    收藏  举报