Kafka 負載均衡策略


一、生產者負載均衡

1、分區器

使用分區器,kafka生產消息時,根據分區器將消息投遞到指定的分區中。

Kafka默認的分區器時DefaultPartitioner。它的分區策略是根據key進行分配的。

如果key不為null: 對key值進行Hash計算,算出一個分區號; 擁有相同Key值被寫入同一個分區;

如果key為null: 消息將以輪詢方式,在所有可用分區中分別寫入消息。

 

如果不想使用Kafka默認分區器,可以實現Partitioner接口,自己實現分區方法。

 

並非分區數量越多,效率越高:
Topic 每個 partition 在 Kafka 路徑下都有一個自己的目錄,該目錄下有兩個主要的文件:base_offset.log 和 base_offset.index。Kafka 服務端的 ReplicaManager 會為每個 Broker 節點保存每個分區的這兩個文件的文件句柄。所以如果分區過多,ReplicaManager 需要保持打開狀態的文件句柄數也就會很多。

每個 Producer, Consumer 進程都會為分區緩存消息,如果分區過多,緩存的消息越多,占用的內存就越大;

n 個分區有 1 個 Leader,(n-1) 個 Follower,如果運行過程中 Leader 掛了,則會從剩余 (n-1) 個 Followers 中選舉新 Leader;如果有成千上萬個分區,那么需要很長時間的選舉,消耗較大的性能。

參考: https://blog.csdn.net/u010711495/article/details/113678248

 

 

二、消費者負載均衡

1、再均衡

再均衡是消費者層面的負載均衡

 當一個group中,有consumer加入或者離開時,會觸發partitions均衡,從而提升topic的並發消費能力。

 

引起消費者再平衡的情況

1、新的消費者加入消費組
2、某個消費者從消費組中退出(異常或正常)
3、增加訂閱主題的分區(kafka的分區數,可以動態的增加,但不能減少)
4、某台broker宕機,新的協調器ZK當選
5、某個消費者在心跳會話時間內沒有發送心跳請求(配置參數:session.timeout.ms), 組ZK認為該消費者已經退出。

 

如下圖所示,分區partitions有: P0, P1,P2,P3

加入group的消費者consumer有: C0, C1

流程如下:

1、 根據partitions索引號對partitions進行排序,P0, P1,P2,P3

2、根據consumer id排序,C0,C1

3、計算倍數 M = [P0, P1,P2,P3].size / [ C0, C1].size = 4 / 2 = 2;

4、然后依次分配Ci = [P(i * M),P((i + 1) * M -1)], 當i=0時, C0=[P0,P1]; 當i=1時, C1=[P2,P3]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM