【问题标题】:what is the best approach to keep two kafka clusters in Sync保持两个kafka集群同步的最佳方法是什么
【发布时间】:2017-02-06 18:50:09
【问题描述】:

我必须在两个不同的数据中心 (DC) 中设置两个 kafka 集群,它们具有相同的主题和配置。原因是两个数据中心之间的连接很糟糕,我们无法创建一个全球性的。

我们让生产者和消费者发布和订阅每个 DC 的主题。

问题是我需要让两个集群保持同步。 可以说:写入第一个 DC 的所有消息最终都应该复制到第二个 DC,反之亦然。

我正在评估 kafka MirrorMaker 工具,方法是通过使用第一个消息并生成第二个消息来创建镜像。但是也需要将数据从第二个复制到第一个,因为在两个集群中都允许写入数据。

我认为 Kafka MirrorMaker 工具不适合我们的情况。 有什么建议吗?

提前致谢。

【问题讨论】:

  • 请参阅confluent.io/blog/…,这可能会有所帮助。
  • 感谢@amethystic 的建议,但这不是我们的实际情况。我的情况是,我们有一个应用程序在两个不同的 DC 中运行,由两个 Kafka 集群支持。两者都在播放活动模式(不是主从模式),这意味着如果一个 DC 中的实例消费了一条消息,它将被复制到另一个 DC,但不会由相同的实例类型处理。你对此有什么想法吗?我遇到了一个问题,我们如何识别在一个 DC 中处理的消息,不会在另一个 DC 中处理。

标签: apache-kafka


【解决方案1】:

根据您的具体要求,您可以将 MirrorMaker 用于您的用例。

一种选择是只有两个单独的主题,让它们在集群 1 上称为 topic1,在集群 2 上称为 topic2。所有生产线程都写入“本地”主题,然后使用 mirrormaker 将此主题复制到远程集群.

对于您的消费者,您只需在离您最近的集群上订阅这两个主题,这样您就可以获得写入任一集群的所有记录。 我创建了一个插图,希望对您有所帮助:

或者,您可以在两个集群上创建聚合主题并使用 MirrorMaker 将数据复制到该主题中,这样您就可以将所有数据放在一个主题中以供使用。 通过这种方式,您将在同一个集群上拥有重复的数据,但您可以通过降低输入主题的保留设置来解决这个问题。 再次,希望下面的图片有助于解释我的想法: 为了使其工作,您需要配置 MirrorMaker 以将主题复制到具有不同名称的主题中,这不是标准的做法,我已经写了一个小的 blog post 来说明如何做到这一点,如果您想进一步研究此选项。

【讨论】:

  • 感谢@sönke-liebau 的清晰解释。解决了两个 DC 之间的复制问题。但是,我们在多个区域部署了一个应用程序。假设所有服务都是无状态的,我怎么知道在 DC1 中由实例处理的消息不会在 DC2 中处理相同的实例类型。非常感谢您的帮助。
  • 嗨@Van,为了确保我正确理解你,你想要做的是处理分布在两个 DC 上的所有消息(继续上面的示例 - 主题“Sales_All”),同时确保没有消息被处理两次?
  • 是的,这是我的意图
  • 这实际上是一件非常困难的事情,老实说,我认为你应该重新考虑你的架构,并在走这条路之前尝试想出一个绕过这个问题的解决方案!基本上我可以想到两种方法来做到这一点:提出某种分区策略来在 DC 之间分配数据,确保两个 DC 中的处理器只处理它们负责的消息。或者,您可以创建某种通用系统来跟踪哪些消息已被处理,哪些消息尚未处理(Zookeeper f.ex)。
  • 感谢@sönke-liebau 的建议。我们将重新考虑这种方式。基本上我们想要实现的是构建一个应用程序支持多个区域,这样区域内的用户可以访问一个单一的全球数据平台。我不确定您是否可以为本案例研究提出最佳实践?
猜你喜欢
  • 2011-02-13
  • 2020-09-27
  • 1970-01-01
  • 2018-02-16
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
相关资源
最近更新 更多