如何将主题从kafka集群复制到另一个kafka集群?

How to copy a topic from a kafka cluster to another kafka cluster?

如 Kafka 文档所示,一种方法是通过 kafka.tools.MirrorMaker,它可以做到这一点。但是,我需要将一个主题(比如 test 与 1 个分区)(其内容和元数据)从生产环境复制到开发环境没有连接的地方。不过,我可以在环境之间进行简单的文件传输。 我的问题:如果我将 *.log.index 从文件夹 test-0 移动到目标 Kafka 集群是否足够好?或者还有更多我需要做的事情,比如我需要移动的元数据和 ZooKeeper 相关数据?

仅复制日志和索引是不够的 - kafka 在 zookeeper 中存储偏移量和主题元数据。 MirrorMaker 实际上是一个非常简单的工具,它为源主题生成消费者,为目标主题生成生产者,并运行直到所有消费者都消费了源队列。您找不到更简单的主题迁移过程。

在您的场景中,对我有用的是以下操作序列:

  1. 在 Kafka 中创建主题,稍后您将在其中插入文件(具有 1 个分区和 1 个副本以及适当的 retention.ms 配置,以便 Kafka 不会删除您可能已过时的段)。
  2. 停止你的 Kafka 和 Zookeeper。
  3. 找到您在第 1 步中在 Kafka 中创建的 0 分区文件的位置(类似于 kafka-logs-<hash>/<your-topic>-0)。
  4. 在此文件夹中,删除现有文件并将您的文件复制到其中。
  5. 启动 Kafka 和 Zookeeper。

如果您的 Kafka 是 docker-compose 的 运行,这也适用(当然,您必须设置适当的音量)。

使用kafkacat

除非你的数据是二进制的,

您可以使用库存卡夫卡猫。

将主题写入文件:

kafkacat -b broker:9092 -e -K, -t my-topic > my-topic.txt

写文件回主题:

kafkacat -b broker:9092 -K, -t my-topic -l my-topic.txt

如果你的数据是二进制的,

不幸的是,您必须从 this branch 构建自己的 kafkacat,这是一个尚未合并的 PR。

将二进制值的主题写入文件:

kafkacat -b broker:9092 -e -Svalue=base64 -K, -t my-topic > my-topic.txt

写文件回主题:

kafkacat -b broker:9092 -Svalue=base64 -K, -t my-topic -l my-topic.txt