开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

请教下各位大佬:binlog阶段mysql cdc connector捕获到的ddl语句,虽然带有b

请教下各位大佬:binlog阶段mysql cdc connector捕获到的ddl语句,虽然带有binlog位点,但是不是提交checkpoint时不会被存入checkpoint backend、重启job后这条ddl会被重复消费?

展开
收起
爱喝咖啡嘿 2023-01-03 14:50:33 183 0
1 条回答
写回答
取消 提交回答
  • 是的,在 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 语句重复消费。

    2024-02-26 16:54:17
    赞同 展开评论 打赏

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

相关电子书

更多
PolarDB-X 2.0 全局 Binlog 与备份恢复能 立即下载
阿里云MySQL云数据库产品体系介绍 立即下载
One Box: 解读事务与分析一体化数据库 HybridDB for MySQL 立即下载

相关镜像