一、生產者負載均衡
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]