刪除Kafka無用主題可提升40%效能

banq發表於2022-12-01

linkedin啟動TopicGC刪除Kafka不用的topic後,已經刪除了近20%的topic,大大降低了Kafka叢集的後設資料壓力。客戶端請求效能提高了 40% 左右,CPU 使用率降低了 30%。 

Apache Kafka 是一個開源的事件流平臺,使用者可以在其中建立 Kafka 主題作為資料傳輸單元,然後與生產者和消費者釋出或訂閱該主題。雖然大多數 Kafka 主題都被積極使用,但由於業務需求發生變化或主題本身是短暫的,因此不再需要某些主題。
Kafka 本身沒有自動檢測未使用的主題並刪除它們的機制。這通常不是什麼大問題,因為 Kafka 叢集可以容納相當多的主題,數百到數千個。
但是,如果主題數量不斷增長,它最終會遇到瓶頸並對整個 Kafka 叢集產生破壞性影響。
linkedin的TopicGC 服務就是為了解決這個問題而誕生的。事實證明,刪除約 20% 的主題可以減少 Kafka 的壓力:

後設資料壓力
出於主題管理的目的,Kafka 將主題的後設資料儲存在多個位置,包括 Apache ZooKeeper 和每個代理上的後設資料快取。主題後設資料包含分割槽和副本分配的資訊。 
我們這裡做個簡單的計算:topic A可以有25個partition,複製因子為3,也就是說每個partition有3個replicas。即使主題 A 不再被使用,Kafka 仍然需要將所有 75 個副本的位置資訊儲存在某個地方。
後設資料壓力對單個主題的影響可能不那麼明顯,但如果主題很多,它就會產生很大的影響。後設資料可以消耗來自 Kafka 代理和 ZooKeeper 節點的記憶體,並且可以向後設資料請求新增有效負載。 

獲取請求
在 Kafka 中,follower 副本定期向 leader 副本傳送獲取請求以與 leader 保持同步。即使對於空主題和分割槽,追隨者仍會嘗試與領導者同步。因為 Kafka 不知道一個主題是否永久未使用,它總是強制跟隨者從領導者那裡獲取。這些冗餘的獲取請求將進一步導致建立更多的獲取執行緒,這可能會導致額外的網路、CPU 和記憶體佔用,並可能支配請求佇列,導致其他請求被延遲甚至丟棄。

控制器初始化
Kafka 控制器是協調和管理 Kafka 叢集中其他代理的代理。許多 Kafka 請求必須由控制器處理,因此控制器可用性對 Kafka 至關重要。 
在控制器故障轉移時,必須選出一個新控制器並接管管理叢集的角色。新的controller在充當controller之前,會從ZooKeeper中載入整個叢集的後設資料,這個時間叫做controller initialization time。正如本文前面提到的,未使用的主題會生成額外的後設資料,使控制器初始化速度變慢,並威脅到 Kafka 的可用性。當 ZooKeeper 響應大於 1MB 時,可能會出現問題。對於我們最大的叢集之一,ZooKeeper 響應已經達到 0.75MB,我們預計在兩到三年內它將遇到瓶頸。

詳細點選標題


 

相關文章