我正在运行一个包含3个kafka
节点和5个zookeeper
节点的简单系统来运行kafka
,我想知道备份kafka
和zookeeper
的好方法是什么。
目前为止,我只是将我的数据目录导出到s3存储桶中...
谢谢。
我正在运行一个包含3个kafka
节点和5个zookeeper
节点的简单系统来运行kafka
,我想知道备份kafka
和zookeeper
的好方法是什么。
目前为止,我只是将我的数据目录导出到s3存储桶中...
谢谢。
Zalando最近发表了一篇相当不错的文章,如何备份Kafka和Zookeeper。通常有两种Kafka备份路径:
优选的备份解决方案将取决于您的用例。例如,对于流应用程序,第一种解决方案可能会带来更少的痛苦,而在使用Kafka进行事件源时,第二种解决方案可能更为理想。
关于Zookeeper,Kafka保留有关主题的信息(持久存储),以及用于代理发现和领导者选举(短暂)。Zalando决定使用Burry,它简单地迭代Zookeeper树形结构,将其转储到文件结构中,稍后将其压缩并推送到云存储。它存在一些小问题,但很可能不会影响备份Kafka的持久数据(TODO验证)。Zalando在那里描述,当进行恢复时,最好先创建Zookeeper集群,然后将新的Kafka集群连接到它(具有新的唯一代理ID),然后还原Burry的备份。Burry不会覆盖现有节点,也不会放置有关旧代理的短暂信息,这些信息存储在备份中。Apache Kafka已经将您的数据分布式存储,并提供了强大的一致性复制功能。
从架构设计的角度来看,首先需要了解备份对我们意味着什么?
是为了应对数据中心故障而做的准备吗?
正如您在评论中所说,想象一下整个数据中心都崩溃的情况,这意味着运行在该数据中心中的所有内容都消失了,不仅仅是Kafka。为了处理此类故障,您需要设计实时复制策略到另一个数据中心,并且可以使用kafka-mirror maker。您需要在不同的数据中心中设置一个kafka集群(不一定具有相同的硬件资源),然后将当前数据中心的Kafka配置为在此其他数据中心上进行镜像。
在数据中心范围的故障情况下,所有服务都将从此回退数据中心运行,并且它们将使用您的镜像Kafka作为主Kafka。
然后,一旦另一个数据中心恢复正常,您可以以相反的方式设置镜像,并返回到旧的(被摧毁的)数据中心。
Kafka connect具有一些开箱即用的连接器,可保证从kafka传输数据的一致性。因此,您可以选择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/