您好,登錄后才能下訂單哦!
如何為Kafka集群確定合適的分區數以及分區數過多帶來的弊端,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
Kafka高吞吐量的原因之一就是通過partition將topic中的消息保存到Kafka集群中不同的broker中。無論是Kafka的producer,還是consumer都可以并發操作topic中的partition,因此partition是Kafka并行度調優的最小單元。
理論上說,如果一個topic分區越多,理論上整個集群所能達到的吞吐量就越大。
但是,實際生產中Kafka topic的分區數真的配置越多越好嗎?很顯然不是!
分區數過多會有以下弊端:
Kafka0.8.2之后,在客戶端producer有個參數batch.size,默認是16KB。它會為每個分區緩存消息,在數據積累到一定大小或者足夠的時間時,積累的消息將會從緩存中移除并發往broker節點。這個功能是為了提高性能而設計,但是隨著分區數增多,這部分緩存所需的內存占用也會更多。
與此同時,consumer端在消費消息時的內存占用、以及為達到更高的吞吐性能開啟的consumer線程數也會隨著分區數增加而增加。比如有10000個分區,同時consumer線程數要匹配分區數(大部分情況下是最佳的消費吞吐量配置)的話,那么在consumer client就要創建10000個線程,那么在consumer client就要創建10000個線程,也需要創建大約10000個Socket去獲取分區數據。線程的開銷成本很顯然是不容小覷的!
Kafka端對端延遲定義為producer端發布消息到consumer端接收消息所需要的時間,即consumer接收消息的時間減去producer發布消息的時間。
Kafka只有在消息提交之后,才會將消息暴露給消費者。例如,消息在所有in-sync副本列表同步復制完成之后才暴露。因此,in-sync副本復制所花時間將是kafka端對端延遲的最主要部分。在默認情況下,每個broker從其他broker節點進行數據副本復制時,該broker節點只會為此工作分配一個線程,該線程需要完成該broker所有partition數據的復制。
注意,上述問題可以通過增大kafka集群來進行緩解。例如,將1000個分區leader放到一個broker節點和放到10個broker節點,他們之間的延遲是存在差異的。在10個broker節點的集群中,每個broker節點平均需要處理100個分區的數據復制。此時,端對端的延遲將會從原來的數十毫秒變為僅僅需要幾毫秒。
Kafka通過多副本復制技術,實現Kafka集群的高可用和穩定性。每個partition都會有多個數據副本,每個副本分別存在于不同的broker。所有的數據副本中,有一個數據副本為leader,其他的數據副本為follower。
在Kafka集群內部,所有的數據副本皆采用自動化的方式進行管理,并且確保所有的數據副本的數據皆保持同步狀態。不論是producer端還是consumer端發往partition的請求,都通過leader數據副本所在的broker進行處理。當broker發生故障時,對于leader數據副本在該broker的所有partition將會變得暫時不可用。Kafka將會自動在其它數據副本中選擇出一個leader,用于接收客戶端的請求。這個過程由Kafka controller節點broker自動完成,主要是從Zookeeper讀取和修改受影響partition的一些元數據信息。
在通常情況下,當一個broker有計劃地停止服務時,那么controller會在服務停止之前,將該broker上的所有leader一個個地移走。由于單個leader的移動時間大約只需要花費幾毫秒,因此從客戶層面看,有計劃的服務停機只會導致系統在很小時間窗口中不可用。(注:在有計劃地停機時,系統每一個時間窗口只會轉移一個leader,其他leader皆處于可用狀態。)
然而,當broker非計劃地停止服務時(例如,kill -9方式),系統的不可用時間窗口將會與受影響的partition數量有關。假如,一個2節點的kafka集群中存在2000個partition,每個partition擁有2個數據副本。當其中一個broker非計劃地宕機,所有1000個partition同時變得不可用。假設每一個partition恢復時間是5ms,那么1000個partition的恢復時間將會花費5秒鐘。因此,在這種情況下,用戶將會觀察到系統存在5秒鐘的不可用時間窗口。
總而言之,通常情況下Kafka集群中越多的partition會帶來越高的吞吐量。但是,如果Kafka集群中partition總量過大或者單個broker節點partition過多,都可能會對系統的可用性和消息延遲帶來潛在的負面影響,需要引起我們的重視。
在partition級別上達到均衡負載是實現吞吐量的關鍵,合適的partition數量可以達到高度并行讀寫和負載均衡的目的,需要根據每個分區的生產者和消費者的目標吞吐量進行估計。
可以遵循一定的步驟來確定分區數:根據某個topic日常"接收"的數據量等經驗確定分區的初始值,然后測試這個topic的producer吞吐量和consumer吞吐量。假設它們的值分別是Tp和Tc,單位可以是MB/s。然后假設總的目標吞吐量是Tt,那么numPartitions = Tt / max(Tp, Tc)
關于如何為Kafka集群確定合適的分區數以及分區數過多帶來的弊端問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。