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

Flink CDC中2个sink属于同一个事务还是两个独立的事务?

Flink CDC中2个sink属于同一个事务还是两个独立的事务?如果是独立的事务,重试时source会重新抽了,会不会有重复数据写入sink了?

展开
收起
小小鹿鹿鹿 2024-04-26 23:00:50 122 0
1 条回答
写回答
取消 提交回答
    1. Flink CDC 中的 2 个 Sink 是否属于同一个事务?

    在 Flink CDC 中,每个 Sink 的写入操作通常是独立事务的。这意味着,即使在一个 Flink 作业中配置了两个不同的 Sink(如分别写入 Elasticsearch 和 Doris),这两个 Sink 的数据写入操作各自维护自己的事务边界,互不影响。Flink 保证每个 Sink 内部的数据一致性,但不会在多个 Sink 之间创建跨系统的全局事务。

    1. 如果 Sink 是独立事务,重试时 Source 会重新抽取,会不会有重复数据写入 Sink?

    在处理可能的故障和重试时,确实存在重复数据写入 Sink 的风险。这是因为 Flink CDC Source 通常会按照数据库的 Binlog 或者 Change Log 进行读取,当遇到故障导致任务重启或某个算子重试时,Source 会从上次保存的 checkpoint 或 savepoint 复位点开始重新消费变更数据流。如果在故障发生时,某些数据已经成功写入某个 Sink,但在故障恢复后由于 Source 重新消费,这些数据可能再次被发送到 Sink。

    为避免这种重复写入问题,通常需要采取以下策略之一或组合:

    幂等写入: 确保 Sink 端的写入操作具有幂等性。这意味着,即使接收到相同的记录多次,写入操作的结果也应保持一致,不会导致数据的重复。例如,Elasticsearch 提供了 _id 字段可以用来实现幂等写入,Doris 也可以通过主键约束或 Upsert(Insert or Update)语义来防止重复插入。

    使用精确一次语义(Exactly-Once): Flink 支持在某些 Sink 上实现精确一次语义,这意味着即使在故障和重试的情况下,每个记录也只会被写入一次。要实现这一点,通常需要 Sink 支持事务性写入或具有幂等写入的能力,并且 Flink 作业必须启用两阶段提交(Two-phase commit, 2PC)或者事务性写入模式。虽然 Flink CDC 目前可能不直接支持所有 Sink 的两阶段提交,但可以通过适配器或者自定义 Sink 实现该功能。

    使用唯一标识符与外部去重: 如果 Sink 不支持事务性写入或幂等写入,可以在数据中携带一个全局唯一的标识符(如数据库主键或自增序列),并在 Sink 端实现一个外部的去重机制,如使用一个临时的去重表或布隆过滤器来过滤掉已经写入的记录。

    合理的 checkpoint 频率与超时设置: 调整 Flink 作业的 checkpoint 频率和超时设置,使其能在保证数据一致性的同时,尽可能减少故障恢复时需要重放的数据量,从而降低重复数据的风险。

    综上所述,Flink CDC 中的多个 Sink 通常是独立事务,重试时有可能导致重复数据写入。为了避免这种情况,应结合 Sink 特性与应用场景,选择合适的策略来确保数据的精确一次处理,如实现幂等写入、启用精确一次语义、使用唯一标识符进行外部去重,以及合理配置 checkpoint 参数。

    2024-04-27 10:09:18
    赞同 1 展开评论 打赏

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

相关产品

  • 实时计算 Flink版
  • 相关电子书

    更多
    Flink CDC Meetup PPT - 龚中强 立即下载
    Flink CDC Meetup PPT - 王赫 立即下载
    Flink CDC Meetup PPT - 覃立辉 立即下载