Flink CDC中用 SQL 方式配置 Flink CDC 任务,同一个 Job 中声明了多张表,最后任务提交后发现 MySQL 侧是多次订阅,这种场景有什么好的解决方案吗,保证 MySQL 侧只订阅一次?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在 Flink CDC 中,如果同一个 Job 中声明了多张表,可能会导致 MySQL 侧多次订阅 Binlog 数据的问题。这种场景下,可以通过以下解决方案来优化,确保 MySQL 侧只订阅一次 Binlog 数据:
Flink 提供了 Source 复用的功能,可以将具有相同配置参数的 MySQL 源表合并为一个 Binlog 连接,从而减少对 MySQL 的压力。
SET
命令开启 Source 复用功能:
SET 'table.optimizer.source-merge.enabled' = 'true';
当多个 MySQL CDC 源表使用相同的配置时,可以通过为这些表配置相同的 server-id
范围来实现数据源的复用,从而避免多次订阅 Binlog 数据。
在 SQL 语句中为每个 MySQL CDC 源表指定相同的 server-id
范围。例如:
INSERT INTO target_table_1
SELECT * FROM source_table_1 /*+ OPTIONS('server-id' = '5400-5408') */;
INSERT INTO target_table_2
SELECT * FROM source_table_2 /*+ OPTIONS('server-id' = '5400-5408') */;
server-id
范围中的唯一 ID 数量必须大于等于作业的并发度。例如,范围 5400-5408
提供了 9 个唯一的 server-id
,因此作业最多可以设置 9 个并发。如果 MySQL 侧的压力过大,可以考虑将表的数据先同步到 Kafka 消息队列中,再通过消费 Kafka 中的数据进行解耦。
如果通过 CTAS(Create Table As Select)方式同步数据导致 MySQL 压力过大,可以将多个 CTAS 作业合并为一个作业运行,并为每个 MySQL CDC 源表配置相同的 server-id
,从而实现数据源的复用。
CREATE TABLE target_table_1 AS SELECT * FROM source_table_1;
CREATE TABLE target_table_2 AS SELECT * FROM source_table_2;
server-id
配置一致。如果需要监控多张表,可以通过正则表达式匹配表名,从而减少重复声明表的数量。
table-name
参数中使用正则表达式匹配多张表。例如:
'table-name' = 'user_.*'
user_
为前缀的表。|
)连接并用小括号包围。例如:
'table-name' = '(user|product)'
为了进一步优化性能,可以结合 Flink 的自动调优功能(Autopilot)来动态调整资源分配。
Active
模式。server-id
范围。通过以上方法,可以有效减少 MySQL 侧的多次订阅问题,同时提升整体作业的性能和稳定性。您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。