当前位置: 代码迷 >> 综合 >> 28 kafka Mirror Maker
  详细解决方案

28 kafka Mirror Maker

热度:81   发布时间:2023-12-05 18:32:02.0

Kafka Mirror Maker 是用于在两个集群之间同步数据的工具,原理是从源集群消费消息,然后将消息生产到目标集群中,就是普通是生产者和消费者。只需要在启动 Kafka Mirror Make 时指定一些简单的消费端和生产端配置就可以实现准实时的数据同步。
在这里插入图片描述
如图,我们需要将 Cluster1 的数据同步到 Cluster2 中。就需要通过 Kafka Mirror Maker做一个中转站。

上一节中的 Kafka Connect 和 Kafka Mirror Maker的区别在于:Kafka Connect 用于其他数据存储系统与 Kafka 之间的数据复制,而不是 Kafka 与 Kafka 之间的数据复制。

Kafka Mirror Maker 可以在两个不同的数据中心(两个集群位于不同的数据中心)中同步(镜像)数据。我们可以在两个不同的数据中心中部署一个集群,各个数据中心持有集群中的部分 broker 节点,通过将副本分散到不同的数据中心来实现不同数据中心的数据同步。但这样有一个严重的问题,即高延迟,这个问题会严重影响 Kafka 和 ZooKeeper 的性能,还有可能引发严重的异常。

Kafka Mirror Maker的使用具体对应 Kafka 中的 kafka-mirror-maker.sh 脚本。参考上图,我们演示从 Cluster 1 中将主题 topic-mrror 的数据同步打 Cluster 2 中,首先创建两个配置文件,consumer.properties 和 producer.properties 这两个配置文件中的配置对应消费者客户端和生产者客户端的配置,参考如下:

# consumer.properties的配置
bootstrap.servers=cluster1:9092
group.id=groupIdMirror
client.id=sourceMirror
partition.assignment.strategy=org.apache.kafka.clients.consumer.RoundRobinAssignor
# producer.properties的配置 
bootstrap.servers=cluster2:9092
client.id=sinkMirror

启动 Kafka Mirror Maker :

# bin/kafka-mirror-maker.sh --consumer.config consumer.properties --producer.config producer.properties --whitelist 'topic-mirror'

在这里插入图片描述
注意,不要在单个集群内使用 Kafka Mirror Make,否则会循环复制。 如果consumer.properties中配置的 bootstrap.servers 节点和 producer.properties 配置的 bootstrap.servers 节点属于同一个集群,那么启动 Kafka Mirror Maker后,只要往主题 topic-mirror 中发生一条消息就会内部无限循环复制,直到Kafka Mirror Maker关闭。

Kafka-mirror-marker.sh 脚本是启动一个生产者和消费者进行数据同步的,但是数据同步完成之后并不会自动关闭而是继续等待新的数据进行数据同步,所以需要用户自己查看数据是否同步完成然后手动关闭。主题的分区数及副本因子可以与源集群中该主题对应的分区数及副本因子不一致。可以将目标集群中的 auto.create.topics.enable 参数配置为 true,以确保在同步操作时有对应的主题,不过建议在同步之前先确认是否有相关的主题,如果没有则手工创建,或者采用自定义的元数据同步工具进行创建。
在这里插入图片描述
源集群和目标集群是两个完全独立的实体。对每个主题而言,两个集群之间的分区数可能不同;就算分区数相同,经过消费在生产后消息发送到的分区号也可能不同;就算分区号相同,消息的 offset 也可能不同。

参考上图,源集群中由于执行了某次日志清理操作,某个分区的 logStartOffset 值变为10,而目标集群中对应分区的 logStartOffset 还是0,那么从源集群中原封不动地复制到目标集群时,同一条消息的 offset 也不会相同。如果要实现客户端生产消费的迁移(将通信链路从源集群中切换到目标集群中),在数据同步完成之后,也不可能不做任何改变就能实现完美的切换。

不过,如果能够做到源集群中的消息除 offset 外都在目标集群中一致(比如消息的分区号相同,主题的分区数相同),那么可以试着通过 kafka-consumer-group.sh 脚本重置消费位移(参考第27节)来实现合理的客户端迁移切换。或者先将生产者的链路切换到目标集群,然后等待消费者消费完源集群中的消息之后再将它的链路切换到目标集群。