请教下各位大佬:binlog阶段mysql cdc connector捕获到的ddl语句,虽然带有binlog位点,但是不是提交checkpoint时不会被存入checkpoint backend、重启job后这条ddl会被重复消费?
是的,在 MySQL CDC 中,DDL 语句不会在提交 Checkpoint 时存储在 Checkpoint Backend 中。这意味着,如果在 Checkpoint 之间发生故障并重新启动作业,则已捕获的 DDL 语句将被重复消费。
这是因为:
DDL 语句会立即应用到下游表中。
Checkpoint 仅保存表中已应用更改的状态。
因此,DDL 语句不会被视为表状态的一部分,因此不会存储在 Checkpoint 中。
如何避免 DDL 语句重复消费:
有几种方法可以避免 DDL 语句重复消费:
使用外部事务协调器,如 Debezium 和 Maxwell。这些协调器负责跟踪已执行的 DDL 语句并防止它们重复执行。
使用 Flink 的 Exactly-Once 保证。这可以通过使用 Flink 的 Exactly-Once 语义和 Kafka 的事务性保证来实现。有关详细信息,请参阅 Flink 文档:https://ci.apache.org/projects/flink/flink-docs-stable/ops/transactions.html
在 Source 端过滤 DDL 语句。你可以使用 Flink 的 FilterFunction 或 RichFunction 来过滤掉 DDL 语句。
其他注意事项:
如果 DDL 语句导致表架构发生更改,则需要相应地更新 Flink 作业的配置。这可以通过重新部署作业来完成。
Flink 1.15 及更高版本引入了 DeserializationSchema 接口,其中包含一个 isEndOfStream 方法,可以用来检测 DDL 语句。这可以用来在 Source 端过滤 DDL 语句。
推荐:
对于生产环境,建议使用外部事务协调器或 Flink 的 Exactly-Once 保证来避免 DDL 语句重复消费。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。