Flink CDC里MySQL源Binlog复用这块社区有没有什么优化方案?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Flink CDC中,针对MySQL源表的Binlog复用问题,社区和阿里云实时计算Flink版均提供了一些优化方案。以下是具体的优化措施和配置建议:
当同一个作业中有多个MySQL CDC源表时,每个源表都会启动一个独立的Binlog Client,这会导致数据库连接数增加,从而对数据库造成较大压力。为了解决这一问题,可以通过开启Source复用功能来减少Binlog连接数。
配置方法: 在SQL作业中使用以下SET命令开启Source复用功能:
SET 'table.optimizer.source-merge.enabled' = 'true';
注意事项:
SET 'sql-gateway.exec-plan.enabled' = 'false';
pipeline.operator-chaining
设为false
,因为断开算子链会增加序列化和反序列化的开销,尤其是在合并多个Source时,性能开销会显著增加。开启Source复用后,Binlog连接数的变化如下: - 全量读取阶段:Binlog连接数等于Source并发度。 - 增量读取阶段:Binlog连接数等于1。
通过这种方式,可以显著减少MySQL实例的连接压力,尤其是在多表同步场景下。
在全量阶段,为了提高读取效率,通常采用并发的方式读取历史数据;而在增量阶段,由于Binlog数据量较少且需要保证全局有序,通常只需单并发读取。为了平衡资源使用和性能,可以结合自动调优功能来动态调整并发度。
配置方法: 在作业运维页面,将自动调优模式设置为Active
模式。
工作原理: 自动调优会监控MySQL CDC Source的每个task的流量。当进入Binlog阶段时,如果只有一个task负责Binlog读取,其他task均空闲,自动调优会自动缩小Source的CU数和并发度。
如果多个CDC作业导致数据库压力过大,可以考虑将MySQL的Binlog数据同步到Kafka消息队列中,再通过消费Kafka中的数据进行解耦。这种方式可以有效降低MySQL实例的压力。
在增量阶段,MySQL连接器会解析Binlog文件生成变更消息。为了加速Binlog文件的解析,可以通过调整Debezium参数来优化性能。
推荐配置:
debezium.max.queue.size: 162580
debezium.max.batch.size: 40960
debezium.poll.interval.ms: 50
参数说明:
debezium.max.queue.size
:阻塞队列可以容纳的记录的最大数量,默认值为8192。debezium.max.batch.size
:每次迭代处理的事件条数最大值,默认值为2048。debezium.poll.interval.ms
:连接器请求新变更事件前的等待时间,默认值为1000毫秒(1秒)。在Flink计算引擎VVR 8.0.7及以上版本中,支持开启并行解析和解析过滤功能,以进一步加速Binlog文件的解析。
配置方法:
'scan.only.deserialize.captured.tables.changelog.enabled' = 'true', -- 仅对指定表的变更事件进行解析
'scan.parallel-deserialize-changelog.enabled' = 'true' -- 使用多线程对Binlog进行解析
适用场景: 该功能适用于需要高效解析大量Binlog数据的场景,能够显著提升增量阶段的读取性能。
通过以上优化方案,可以有效解决Flink CDC中MySQL源表Binlog复用的问题,包括减少数据库连接数、降低带宽消耗以及提升增量阶段的读取效率。具体优化措施包括开启Source复用、结合自动调优功能、通过Kafka解耦Binlog读取、优化Debezium参数以及启用并行解析和解析过滤功能。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。