Mysql CDC 多 Source 复用

原文:https://cloud.tencent.com/document/product/849/76650

本页目录:

功能介绍

如何开启 CDC Source 复用功能

使用提醒

目前使用 Flink CDC Connector 做数据同步时,每个表都需要建立一个数据库连接,在多表、整库同步等场景下,对数据库实例的压力非常大,Oceanus 引入了多 Source 复用的优化来解决这种问题。

功能介绍

例如以下作业:

CREATETABLE `source_1`
(
    `f_sequence`   INT,
    `f_random`     INT,
    `f_random_str` VARCHAR,
    PRIMARY KEY (`f_sequence`) NOT ENFORCED
) WITH (
      'connector'='mysql-cdc' ,
      'hostname'='ip1',
      'port'='3306',
      'username'='xxx',
      'password'='xxx',
      'database-name'='db1',
      'table-name'='source_1'
);

CREATETABLE `source_2`
(
    `f_sequence`   INT,
    `f_random`     INT,
    `f_random_1`     INT,
    `f_random_str` VARCHAR,
    `f_random_str_1` VARCHAR,
    PRIMARY KEY (`f_sequence`) NOT ENFORCED
) WITH (
      'connector'='mysql-cdc' ,
      'hostname'='ip1',
      'port'='3306',
      'username'='xxx',
      'password'='xxx',
      'database-name'='db2',
      'table-name'='source_2'
);


CREATETABLE `sink_1`
(
    `f_sequence`   INT,
    `f_random`     INT,
    `f_random_str` VARCHAR,
    PRIMARY KEY (`f_sequence`) NOT ENFORCED
) WITH (
      'connector'='logger'
);

CREATETABLE `sink_2`
(
    `f_sequence`   INT,
    `f_random`     INT,
    `f_random_1`     INT,
    `f_random_str` VARCHAR,
    `f_random_str_1` VARCHAR,
    PRIMARY KEY (`f_sequence`) NOT ENFORCED
) WITH (
      'connector'='logger'
);

insertinto sink_1 select*from source_1;
insertinto sink_2 select*from source_2;

对于来自相同 db 实例的表同步,Flink 会生成两条 pipeline(如下图),每个 CDC 的 Source 都会跟 Mysql 建立一个数据库连接,在表的数量非常多的时候,作业与 Mysql 的连接会非常多,DB 端相应的压力也会非常大。

Mysql CDC 多 Source 复用_第1张图片

我们可以看到在开启了 Source 复用功能之后,读相同 DB 实例的 Mysql CDC Source 会合并成一个 Source (如下图),可以有效的降低对 DB 的链接压力。并且在 Mysql 增量同步阶段,多个 Source 只需要读取一份 binlog 数据即可,避免了多个 Source 重复拉取 binlog 的问题。

Mysql CDC 多 Source 复用_第2张图片

如何开启 CDC Source 复用功能

在 sql 作业的开头,通过 set 命令指定开启 mysql cdc source 合并功能即可。

SET table.optimizer.mysql-cdc-source.merge.enabled=true;

相关 set 参数说明

参数

默认值

含义

table.optimizer.mysql-cdc-source.merge.enabled

false

是否开启 mysql cdc source 复用功能,开启后会自动尝试 merge 同一作业内读相同 DB 的 mysql cdc source 为同一个 source。

table.optimizer.mysql-cdc-source.merge.default-group.splits

1

开启 mysql cdc source 合并功能后,相同 DB 实例 mysql cdc source 会合并成的 source 数量。对于表非常多的场景,当合并成一个 source 不能满足性能要求时,可以通过 set 命令调高这个值,oceanus 会自动将 cdc source 尽量均匀的划分成指定的 group splits 数量。

分组合并功能示例如下,假如 source_1 、source_2、source_3、source_4是来自同一个 DB 实例的 Mysql CDC Source 表(此处省略 source 和 sink 表定义),我们可以用如下的参数来配置 source 复用功能。

SET table.optimizer.mysql-cdc-source.merge.enabled=true;
SET table.optimizer.mysql-cdc-source.merge.default-group.splits=2;

insertinto sink_1 select*from source_1;
insertinto sink_2 select*from source_2;
insertinto sink_3 select*from source_3;
insertinto sink_4 select*from source_4;

最终的运行拓扑图如下,我们可以看到4个 cdc source 自动的划分成2个分组。

Mysql CDC 多 Source 复用_第3张图片

使用提醒

目前该功能不支持写入 kudu,开启该功能作业编译会报错。

你可能感兴趣的:(数据库,flink,大数据,mysql)