【问题标题】:Backup/restore kafka and zookeeper备份/恢复kafka和zookeeper
【发布时间】:2018-05-27 05:25:07
【问题描述】:

我正在运行一个简单的kafka 3 个节点和zookeeper 的5 个节点来运行kafka,我想知道哪个是备份我的kafka 的好方法,同样适用于我的@987654325 @。

目前我只是将数据目录导出到 s3 存储桶...

谢谢。

【问题讨论】:

  • 因为您在复制模式下运行。备份是什么意思?
  • 如果我的 kafka 所在的数据中心烧毁了我该怎么办?即使我得到了复制,我也希望能够备份并恢复它:)
  • kafka 中的消息的生存时间是有限的,您是要存储当前状态,还是存储 kafka 中包含的每个数据的所有历史序列?
  • 您可以考虑在另一个地理位置运行另一个 Kafka 集群并将流程复制到该集群。
  • @jeff 这是我最近加的,我只想要当前状态

标签: apache-kafka backup apache-zookeeper restore


【解决方案1】:

Apache Kafka 已经使您的数据保持分布式,并且还提供了强大的一致 replication 功能。

首先从架构设计的角度来看,我们需要了解备份对我们意味着什么?

  • 是为了在数据中心故障中幸存下来吗?

    正如您在评论中所说,想象一下当您的整个数据中心出现故障时,这意味着该数据中心中运行的所有东西都消失了,而不仅仅是卡夫卡。要处理此类故障,您需要设计一个实时复制策略到不同的数据中心,您可以使用kafka-mirror maker。您需要在不同的数据中心(不一定具有相同的硬件资源)设置一个 kafka 集群,然后将您当前的数据中心 Kafka 配置为镜像到另一个数据中心。

在数据中心范围内发生故障的情况下,您的所有服务都将从该备用数据中心运行,并且它们将使用您的镜像 Kafka 作为主要 kafka。

然后,一旦另一个数据中心回来,您可以以相反的方式设置镜像,然后您可以回到您的旧(已损坏)数据中心。

  • 是只备份Kafka/Zookeeper数据吗?

Kafka connect 有几个开箱即用的连接器,用于从 kafka 传输数据并保证一致性。因此,也许您可​​以选择 AWS S3 作为您的备份存储,以下连接器可以为您做到这一点。

  • Confluent AWS S3 connector.
  • Pinterest has secor service 将数据传输到 AWS S3、Google 和 Mircosoft 云存储。 我相信您还可以为所有大型云提供商找到一些专用连接器。将 Kafka 数据备份到高可用云存储时需要考虑的事项很少。

  • kafka 对每个主题都有一个数据保留策略,因此旧数据将由 Kafka 自己从 Kafka 服务器中删除,但仍会保留在您的 AWS S3 存储桶中,因此如果您直接将其复制回来以防万一恢复事件之后,您将在 Kafka 代理上看到更多数据,而且将整个数据恢复到现有正在运行的 Kafka 集群中也不是一个好主意,因为您将开始处理旧数据。所以在这个过程中要小心谨慎

  • 对于 zookeeper,您也可以将数据复制到 AWS S3,但由于临时节点,您需要小心恢复。我发现了一些可以提供帮助的链接:

https://jobs.zalando.com/tech/blog/backing-up-kafka-zookeeper/ https://www.elastic.co/blog/zookeeper-backup-a-treatise https://medium.com/@Pinterest_Engineering/zookeeper-resilience-at-pinterest-adfd8acf2a6b

最后,“预防胜于治疗”。因此,如果您在 AWS 等云提供商设置中运行,那么您可以通过将故障提前记在心里来部署集群设置。下面的链接有一些信息。

https://aws.amazon.com/blogs/big-data/best-practices-for-running-apache-kafka-on-aws/

【讨论】:

    【解决方案2】:

    Zalando 最近发表了一篇不错的文章how to backup Kafka and Zookeeper。 Kafka备份一般有2条路径:

    • 维护第二个 Kafka 集群,所有主题都复制到该集群。我尚未验证此设置,但如果还复制了偏移主题,则切换到另一个集群不应损害消费者的处理状态。
    • 将主题转储到云存储,例如使用 S3 连接器(如 Zalando 所述)。在恢复的情况下,您重新创建主题并使用云存储中的数据提供给它。这将允许您进行时间点恢复,但消费者必须从头开始阅读主题。

    首选的备份解决方案取决于您的用例。例如。对于流式应用程序,第一种解决方案可能会减轻您的痛苦,而在使用 Kafka 进行事件溯源时,第二种解决方案可能更理想。

    关于 Zookeeper,Kafka 保存有关主题(持久存储)以及代理发现和领导者选举(临时)的信息。 Zalando 决定使用Burry,它简单地迭代 Zookeeper 树结构,将其转储到文件结构中,然后将其压缩并推送到云存储。它受到a little problem 的影响,但很可能它不会影响 Kafka 持久数据的备份(TODO 验证)。 Zalando 在那里描述,在恢复时,最好先创建 Zookeeper 集群,然后将新的 Kafka 集群连接到它(使用新的唯一代理 ID),然后恢复 Burry 的备份。 Burry 不会覆盖现有节点,不会放置有关旧代理的临时信息,即存储在备份中的内容。

    注意:虽然他们提到了 Exhibitor 的使用,但在使用 Burry 备份时并不需要备份。

    【讨论】:

    • 如果维护另一个 Kafka 集群并想象原始集群由于例如原因而损坏的情况高网络负载或任何其他原因保证第二个集群不会因相同原因而失败,如果该集群的数据被复制到它
    • 没错。虽然我希望 Kafka 不会因为高网络负载而损坏数据,但我希望它仍然可以防止人为错误。 Kafka Streams 越来越流行,它存储处理状态。在某些情况下,停机并可能丢失一些数据,但恢复意外损坏的状态比让它在损坏的状态下运行更容易。不过,这取决于您的用例,您是否真的在乎。对于我们的用例,我们正在从 S3 进行 ~point-in-time restore。
    • @krzychu - 出于好奇,您选择了哪种方法进行时间点恢复?
    • @krzychu 您是否考虑使用 Confluent AWS S3 连接器 docs.confluent.io/current/connect/kafka-connect-s3/index.html 进行备份?
    • @DCaugs 我们还没有确定任何方法。其他任务优先。
    猜你喜欢
    • 1970-01-01
    • 2012-01-14
    • 2011-07-02
    • 2021-08-14
    • 2014-07-24
    • 2013-12-03
    • 2019-06-30
    • 2014-08-10
    • 1970-01-01
    相关资源
    最近更新 更多