完整教程: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_orders,shipments → ods_shipments,…
2. 参数与语义
| 参数 | 含义 | 是否必填 |
|---|---|---|
source-table | 源表 Table ID(支持正则) | 必填 |
sink-table | 目标表 Table ID(支持符号替换) | 必填 |
replace-symbol | 在 sink-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.user → sink_db.user,source_db.order_01 → sink_db.order_01。
3.4 批量“加前缀/后缀”(多→多,批量改名)
route:
- source-table: 'app_db\..*'
sink-table: 'ods_db.ods_<>'
replace-symbol: '<>'
description: '整库路由并为目标表统一加 ods_ 前缀'
app_db.orders → ods_db.ods_orders,app_db.shipments → ods_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 的字段治理与主键策略,你可以在不中断上游的前提下,持续演进下游的数据形态与命名规范。
浙公网安备 33010602011771号