Flink CDC在一个Job里,如果有多个源表,有什么办法公用一个server-id不。一个SQL有多个源表,会建立多个binlog Dump....多了 会吧MySQL搞死?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Flink CDC作业中,如果一个Job包含多个源表,默认情况下每个源表都会启动一个独立的Binlog Client,并且需要为每个源表配置不同的server-id
。这种行为可能会导致MySQL实例的压力过大,尤其是在源表数量较多的情况下。为了避免这种情况,可以通过以下方法实现多个源表共用一个server-id
,从而减少对MySQL的压力。
实时计算引擎VVR 8.0.7及以上版本支持MySQL CDC Source复用功能。当多个CDC源表的配置项(除了数据库名、表名和server-id
外)完全相同时,可以将这些源表合并为一个Source节点,从而实现server-id
的复用。
SET
命令开启Source复用功能:
SET 'table.optimizer.source-merge.enabled' = 'true';
pipeline.operator-chaining
设为false
,因为断开算子链会增加序列化和反序列化的开销,尤其是在合并多个Source时性能影响更明显。SET 'sql-gateway.exec-plan.enabled' = 'false';
通过开启Source复用,可以有效减少Binlog Dump连接数,降低MySQL的压力。
如果多个源表的数据同步是通过CTAS(CREATE TABLE AS)语句完成的,可以通过STATEMENT SET语法将多个CTAS语句作为一个作业提交。在这种情况下,如果多个CDC源表的配置项完全一致,Flink会自动对这些源表进行合并复用,从而实现server-id
的共享。
USE CATALOG holo;
BEGIN STATEMENT SET;
-- 同步web_sales表
CREATE TABLE IF NOT EXISTS web_sales
AS TABLE mysql.tpcds.web_sales
/*+ OPTIONS('server-id'='8001-8004') */;
-- 同步user分库分表
CREATE TABLE IF NOT EXISTS user
AS TABLE mysql.`wp.*`.`user[0-9]+`
/*+ OPTIONS('server-id'='8001-8004') */;
END;
OPTIONS
配置必须完全一致,才能成功合并。server-id
的使用,降低MySQL的连接压力。即使在未开启Source复用的情况下,也可以通过合理配置server-id
范围来减少MySQL的压力。例如,当并行度大于1时,可以为每个源表指定一个server-id
范围,确保范围内可用的server-id
数量不小于并行度。
SELECT * FROM source_table1 /*+ OPTIONS('server-id'='123456-123457') */
LEFT JOIN source_table2 /*+ OPTIONS('server-id'='123458-123459') */
ON source_table1.id = source_table2.id;
server-id
范围,否则会导致Binlog消费冲突。server-id
范围,进一步减少连接数。如果上述方法仍无法满足需求,可以考虑将MySQL表的数据先同步到Kafka消息队列中,再通过Flink消费Kafka中的数据。这种方式可以解耦MySQL与Flink之间的直接连接,显著降低MySQL的压力。
server-id
的复用。server-id
范围,避免不同作业之间的冲突。通过以上方法,可以有效解决多个源表导致MySQL压力过大的问题,同时提升作业的稳定性和性能。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。