【问题标题】:Replicating messages from one Kafka topic to another kafka topic将消息从一个 Kafka 主题复制到另一个 Kafka 主题
【发布时间】:2020-02-29 02:29:05
【问题描述】:

我想从生产集群中的 Kafka 集群/主题流到开发环境中的另一个 Kafka 集群,以进行可扩展性和回归测试。

对于鸭带解决方案,我级联了一个 Kafka 消费者和生产者,但我的直觉告诉我应该有更好的方法。但是,我还没有找到任何好的解决方案。谁能帮帮我?

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    如果您想将数据从一个集群复制到另一个集群,那么有一个名为 MirrorMaker 的 kafka 工具。

    Kafka 附带了一个用于在 Kafka 集群之间镜像数据的工具。该工具从源集群读取并写入目标集群。数据将从源集群中的主题读取并写入目标集群中的同名主题。

    这是运行MirrorMaker工具的语法:

    bin/kafka-run-class.sh kafka.tools.MirrorMaker
           --consumer.config consumer.properties
           --producer.config producer.properties --whitelist my-topic
    

    你可以在 kafka 安装目录中找到这个脚本。在这里,您需要提供您的source clusterconsumer.properties 和您的destination clusterproducer.properties。您可以通过--whitelist 选项将应镜像的主题列入白名单。

    你可以找到更多关于Mirroring data between clusters的信息

    注意: MirrorMaker 将数据复制到与destination cluster 相同的topic_name 中,与source cluster 相同

    【讨论】:

    • 很棒的工具!但是如果我只需要来自主题 T 的最后 N 条消息怎么办?在我们的例子中,prod 主题太大了,我们每天只需要其中的一部分(比如最后 1M 条消息)就可以在 uat 环境中使用。
    • 原topic和新topic的offset怎么办?
    • 就我而言,我希望将部分数据窗口从原始主题转移到新主题。
    【解决方案2】:

    虽然镜像使跨集群解决方案的工作完美,但是,对于同一个集群,您的ducktap 解决方案还不错,因为 MirrorMaker 假设您正在从一个集群拉到另一个集群。

    因此,如果您只想在同一集群中的不同主题之间复制数据,kafkacat 是您的朋友。

    export BOOTSTRAP_SERVERS=localhost:9096
    export SOURCE_TOPIC=source_topic
    export TARGET_TOPIC=target_topic
    
    kafkacat -C -b $BOOTSTRAP_SERVERS -o beginning -e -t $SOURCE_TOPIC  | kafkacat -P -b $BOOTSTRAP_SERVERS  -t $TARGET_TOPIC
    

    【讨论】:

    • 对于那些想知道的人,kafkacat 是 Magnus Edenhill 的一个工具,可以在 GitHub 上找到 github.com/edenhill/kafkacat
    • 当我尝试这个时,它复制了主题而不是消息。
    • 键未反映在新主题中。此外,多行消息似乎被简化为任意一行,因此这是不一致的复制。 :(
    • 这只会复制消息值:它不会保留标题和键
    • @ChrisBlom 原始时间戳是什么?
    【解决方案3】:

    Kafka 基本上是一个消息队列,因此它具有被动行为:必须将消息放入它 (producer),并且必须从 提取消息> 它(consumer)。

    如果你想在两个 kafka 主题之间建立一种管道,以便来自一个主题的消息会自动发送到另一个主题,你需要一些代码,它具有来自第一个主题的消费者属性和一个第二个话题的制作人。

    根据您的编程语言,您可以选择一些现成的、有据可查的生产者和/或消费者解决方案。

    对于更复杂的案例,您可以查看 Apache Storm 等。

    【讨论】:

    • 您也可以使用不同的消费者组。示例:Consumer1 使用 groupId 'first-group-name' Consumer2 使用 groupId 'second-group-name',以便其中两个消费者读取相同的消息,而无需添加新主题。只需修改您的主题的侦听器以适应这一点。
    【解决方案4】:

    如果您需要将消息从一个主题复制到另一个主题,可能需要一些额外的逻辑或转换,您还可以使用 Kafka Streams

    https://docs.confluent.io/current/streams/index.html

    例子

    https://github.com/confluentinc/kafka-streams-examples/blob/5.4.0-post/src/main/java/io/confluent/examples/streams/WordCountLambdaExample.java

    或者,检查MirrorMaker

    【讨论】:

    • 就Kafka流方式而言,您的意思是我们使用多个@Bean Java.until.Consumer 收听该主题吗?或者还有其他使用 Kafka Stream 的方法吗?仅供参考,我正在使用 Spring Cloud Stream 3.0。谢谢
    猜你喜欢
    • 1970-01-01
    • 2020-05-09
    • 2019-10-09
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2021-06-17
    相关资源
    最近更新 更多