【问题标题】:Avoid re-consumption with Apache Kafka MirrorMaker 2 in an active-active configuration?避免在主动-主动配置中重复使用 Apache Kafka MirrorMaker 2?
【发布时间】:2022-06-13 18:06:46
【问题描述】:

我在多个活动的 Kafka (2.6) 集群(名为 prod1prod2)上运行 Apache MirrorMaker 2.7。所以prod1 上的topic 被MirrorMaker2 复制为prod2 集群上的prod1.topic

我在 prod1prod2 上使用相同的 kafka 消费者组 ID 运行 Kafka 消费者服务。

我的 MirrorMaker2 配置中有 emit.checkpoints.interval.seconds=1,导致每秒从 topicprod1.topic

问题是,每次我的生产者在prod1 上向topic 生成数据时,数据都会复制到prod2 上的prod1.topic,并由我的消费者在prod2 上使用,在最新提交偏移之前我的 prod1 消费者被 MirrorMaker2 翻译成 prod2

如果我在数据生成到prod1 几秒钟后启动我的prod2 消费者,则不会发生这种情况,因为到那时,prod2 上的最新提交偏移量将到达,但是,@987654342 上的两个消费者@ 需要实时运行,因为我使用 prod1/2 作为主动-主动部署配置。

那么我如何确保生成的任何数据只被prod1/prod2 消费者中的任何一个消费一次?

【问题讨论】:

    标签: apache-kafka apache-kafka-mirrormaker


    【解决方案1】:

    我一直在尝试为在 2 个数据中心中运行的应用程序实现类似的设置,遗憾的是,目前 MM2 似乎不能保证完全使用一次,因为消息和相应的偏移量不会同时复制

    您可以使用以下设置减少偏移提交间隔: emit.checkpoints.interval.seconds=1

    这里有一些关于这个的参考:https://ibm-cloud-architecture.github.io/refarch-eda/technology/kafka-mirrormaker/#replication-considerations

    Exactly-once 在分布式系统中很难实现。 对于 Kafka,生产者、经纪人和消费者都在工作 一起确保只有一条消息被端到端处理。和 编码实践和配置设置,在一个独特的集群中, Kafka 可以保证只处理一次。无重复记录 在生产者和代理之间,以及在消费者端提交的读取, 在消费者重启的情况下不会重新处理。

    但对于跨集群复制,语义至少基于 一旦接近。镜像制造商源任务时可能会发生重复 在将其偏移量提交到源主题之前停止。重启会 从可以生成的最后提交的偏移量加载记录 重复。

    重复处理应由应用程序完成。 您可以使用不同的消费者组 id,或者将连接到目标的应用程序配置为不从复制的主题中消费,如果源发生故障,请重新配置您的应用程序以开始从这些主题中消费(或部署一个实例来消费这些主题中的剩余消息主题)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 2017-04-12
      • 2022-06-30
      相关资源
      最近更新 更多