當 Kafka 集群或其某些組件失敗時,就會發生 Apache Kafka 停機,導致服務中斷或降級。Kafka 設計用於處理高吞吐量、容錯的數據流和消息,但它可能因為各種原因而失敗,包括基礎設施故障、配置錯誤和操作問題。
Kafka 停機的原因
Broker 失敗
過多的數據負載或過大的硬件導致 Broker 變得無響應,硬盤崩潰、內存耗盡或 Broker 網絡問題都可能導致硬件失敗。
ZooKeeper 問題
Kafka 依賴於 Apache ZooKeeper 來管理集群元數據和領導者選舉。ZooKeeper 失敗(由於網絡分割、配置錯誤或資源耗盡)可能會干擾 Kafka 操作。如果集群已配置為使用 Apache Kafka 的 3.5 版本後的 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代理複製Kafka日誌目錄,可以通過識別Kafka日誌目錄(log.dirs
在server.properties
中)來執行。此方法允許保留偏移量和分區數據。然而,這需要細緻的還原過程來確保一致性並避免潛在問題。
Kafka配置和元數據
就Kafka配置而言,我們可以指定有關主題、訪問控制(ACL)、所有代理的server.properties
文件,以及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