备份/恢复Kafka和Zookeeper

12

我正在运行一个包含3个kafka节点和5个zookeeper节点的简单系统来运行kafka,我想知道备份kafkazookeeper的好方法是什么。

目前为止,我只是将我的数据目录导出到s3存储桶中...

谢谢。


由于您正在复制模式下运行,那么备份的含义是什么? - Abhimanyu
2
如果托管Kafka的数据中心发生故障,我该怎么办?即使有备份复制,我也希望能够备份和恢复数据 :) - starttter
1
Kafka中的消息有一个有限的生存时间,您想要存储当前状态还是包含在kafka中的每个数据的所有历史系列? - Lorenzo Belli
您可以考虑在另一个地理位置运行另一个Kafka集群,并将流复制到该集群中。 - jeff
@jeff,这是我最近添加的内容,我只想要当前状态。 - starttter
2个回答

12

Zalando最近发表了一篇相当不错的文章,如何备份Kafka和Zookeeper。通常有两种Kafka备份路径:

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

优选的备份解决方案将取决于您的用例。例如,对于流应用程序,第一种解决方案可能会带来更少的痛苦,而在使用Kafka进行事件源时,第二种解决方案可能更为理想。

关于Zookeeper,Kafka保留有关主题的信息(持久存储),以及用于代理发现和领导者选举(短暂)。Zalando决定使用Burry,它简单地迭代Zookeeper树形结构,将其转储到文件结构中,稍后将其压缩并推送到云存储。它存在一些小问题,但很可能不会影响备份Kafka的持久数据(TODO验证)。Zalando在那里描述,当进行恢复时,最好先创建Zookeeper集群,然后将新的Kafka集群连接到它(具有新的唯一代理ID),然后还原Burry的备份。Burry不会覆盖现有节点,也不会放置有关旧代理的短暂信息,这些信息存储在备份中。
注意:虽然他们提到了Exhibitor的使用,但在使用Burry进行备份时,实际上并不需要它。

如果要维护另一个Kafka集群,并且想象一种情况,即原始集群因高网络负载或任何其他原因而中断,那么如果数据被复制到第二个集群,什么可以保证第二个集群不会因同样的原因而失败。 - peetasan
没错。虽然我期望Kafka不会因为高网络负载而破坏数据,但我希望它仍然能够受到人为错误的保护。Kafka Streams变得越来越流行,并且它存储处理状态。有些情况下,与其让它在损坏的状态下运行,不如让它停机并可能丢失一些数据,但是恢复意外损坏的状态更容易解决问题。但这将取决于您的用例,您是否真的关心这个问题。对于我们的用例,我们正在努力从S3进行时间点还原。 - krzychu
@krzychu - 出于好奇,你为点时间还原选择了哪种方法? - DCaugs
@krzychu,你考虑过使用Confluent AWS S3连接器 https://docs.confluent.io/current/connect/kafka-connect-s3/index.html 来进行备份吗? - Omnipresent
@DCaugs 我们还没有确定任何方法。其他任务优先级更高。 - krzychu
@Omnipresent 我们正在研究这个问题,但我不记得我们当时的想法了。我认为它只适用于备份,但是对于恢复,我们需要额外的东西来纠正已提交的偏移量 - 如果Kafka的保留策略清除了旧集群中的记录,那么旧集群中的偏移量将与新集群中的偏移量不匹配。 - krzychu

7

Apache Kafka已经将您的数据分布式存储,并提供了强大的一致性复制功能。

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

  • 是为了应对数据中心故障而做的准备吗?

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

在数据中心范围的故障情况下,所有服务都将从此回退数据中心运行,并且它们将使用您的镜像Kafka作为主Kafka。

然后,一旦另一个数据中心恢复正常,您可以以相反的方式设置镜像,并返回到旧的(被摧毁的)数据中心。

  • 仅备份Kafka / Zookeeper数据吗?

Kafka connect具有一些开箱即用的连接器,可保证从kafka传输数据的一致性。因此,您可以选择AWS S3作为备份存储,以下连接器可以为您完成此操作:

  • Confluent AWS S3连接器。
  • Pinterest有secor服务,可以将数据传输到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/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接