请教一下,为什么Flink CDC2.0还是会拿全局锁?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
Flink CDC 2.0 在某些场景下仍然会使用全局锁(Global Lock),这主要与 MySQL 数据库的 Binlog 模式和 Flink CDC 的工作原理有关。以下是详细的原因分析及解决方案:
在 Flink CDC 中,当使用 MySQL 作为数据源时,默认情况下会在全量阶段(Snapshot 阶段)对表加锁以确保数据一致性。这种锁通常表现为 FLUSH TABLES WITH READ LOCK(FTWRL),即全局读锁。
STATEMENT 或 MIXED,为了保证全量数据和增量数据的一致性,Flink CDC 需要在全量阶段记录 Binlog 的位点,并在此期间阻止表结构变更或数据写入。为了避免全局锁对数据库性能的影响,可以采取以下优化措施:
ROW 格式的 BinlogROW 模式。ROW 模式下,Flink CDC 可以通过读取 Binlog 中的行级变更信息,而无需依赖全局锁来保证一致性。SET GLOBAL binlog_format = 'ROW';
scan.startup.mode=latest-offset
server-idserver-id,以避免多个作业之间的冲突。server-id=5404-5412
server-id 的范围必须大于等于作业的并发数。即使避免了全局锁,Flink CDC 仍可能对数据库造成一定压力。以下是一些进一步的优化建议:
server-id,实现数据源复用。ROW 格式的 Binlog 和增量快照算法来避免全局锁。scan.startup.mode 和 server-id 参数,以确保数据一致性和系统稳定性。如果您仍有疑问或需要更详细的配置指导,请随时告知!