Apache Kafka的故障发生在Kafka集群或其某些组件失效时,导致服务中断或降级。Kafka旨在处理高吞吐量、容错的数据流和消息传递,但可能因各种原因而失败,包括基础设施故障、错误配置和运行问题。
为什么会发生Kafka故障
Broker故障
过多的数据负载或过大的硬件导致Broker无响应,硬盘崩溃、内存耗尽或Broker网络问题。
ZooKeeper问题
Kafka依赖于Apache ZooKeeper来管理集群元数据和领导者选举。ZooKeeper故障(由于网络分区、错误配置或资源耗尽)可能会干扰Kafka操作。如果集群已配置为使用后续版本3.5的Apache Kafka中的KRaft模式,则可以省略ZooKeeper问题。
主题错误配置
不足的复制因子或不正确的分区配置可能导致Broker故障时数据丢失或服务中断。
网络分区
Broker、客户端或ZooKeeper之间的通信故障可能降低可用性或导致脑裂情况。
错误配置
集群设置配置不当(保留策略、副本分配等)可能导致意外行为和故障。
负荷过重
生产者或消费者流量突然增加可能使集群负荷过重。
数据损坏
Kafka 日志损坏(由于磁盘问题或突然关机)可能导致启动或数据检索问题。
监控和警报不足
如果未能识别和解决早期警告信号(如磁盘使用率激增或延迟过长),小问题可能导致完全故障。
Apache Kafka 主题和配置的备份对于灾难恢复至关重要,因为它们允许我们在硬件故障、软件问题或人为错误发生时恢复我们的数据和设置。Kafka 没有用于主题备份的内置工具,但我们可以通过几种方法实现这一点。
如何备份 Kafka 主题和配置
我们可以采用多种方式来备份主题和配置。
Kafka 消费者
我们可以使用Kafka消费者从主题读取消息,并将它们存储在外部存储中,如HDFS、S3或本地存储。使用可靠的Kafka消费者工具,如内置的kafka-console-consumer.sh
或自定义消费者脚本,可以从最早的偏移量消费主题中的所有消息。这个过程简单且可定制,但对于高吞吐量的主题需要大量存储,并可能丢失元数据,如时间戳或标头。
Kafka Connect
通过使用Kafka Connect等工具将消息从主题流式传输到对象存储。我们可以设置Kafka Connect与一个接收器连接器(例如S3接收器连接器、JDBC接收器连接器等),配置连接器以从特定主题读取,并写入备份目的地。当然,我们需要为Kafka Connect进行额外的设置。
集群复制
Kafka的镜像功能允许我们管理现有Kafka集群的副本。它使用Kafka消费者从源集群消费消息,并将这些消息重新发布到另一个Kafka集群,后者可以作为备份使用嵌入式Kafka生产者。我们需要确保备份集群位于单独的物理或云区域以实现冗余。可以实现无缝复制并支持增量备份,但维护备份集群的操作开销更高。
文件系统级别的复制
文件系统级别的备份,比如直接从Kafka brokers 复制 Kafka 日志目录,可以通过识别 Kafka 日志目录 (log.dirs
在 server.properties
中)来执行。这种方法允许保留偏移量和分区数据。然而,需要细致的恢复过程来确保一致性并避免潜在问题。
Kafka 配置和元数据
就 Kafka 配置而言,我们可以指定有关主题、访问控制 (ACL)、server.properties
文件从所有 brokers,以及 ZooKeeper 数据目录 (由 ZooKeeper 配置中的 dataDir 参数定义) 的元数据。随后,将输出保存到文件以供参考。我们需要确保所有自定义设置 (例如 log.retention.ms
, num.partitions
) 都有文档记录。使用内置脚本 kafka-acls.sh
,所有的 acl 属性可以整合到一个平面文件中。
要点
上述讨论的实践主要适用于部署在本地的集群,且限于集群中配置为个位数的节点。然而,托管服务提供商处理运行平台的最佳操作实践,因此我们不需要担心检测和修复问题。
通过阅读本文,希望您能获得有关在本地部署中应对 Apache Kafka 中断的实用见解和经过验证的策略。
Source:
https://dzone.com/articles/avoid-kafka-outages-with-topic-and-configuration-backups