Kafka 中各種分配策略

2021-09-23 07:58:03 字數 2959 閱讀 2259

將所有broker(n個)和partition排序

將第i個partition分配到第(i mode n)個broker上

當key和partition都為空時,訊息隨機傳送到各個分割槽(各個版本會有不同,有的是採用輪詢的方式,有的是隨機,有的是一定時間內只傳送給固定partition,隔一段時間後隨機換乙個)

當partition空,單key不為空時,用key的ha』sh值對partion個數取模,決定要把訊息傳送到哪個partition上

當key和partition都不為空時,只會根據partition傳送到對應的partition上

當key為空、partition不為空時,根據partition傳送到指定的partition上

1.rangepartitionassignor(預設):

針對每乙個topic:

n = 分割槽數/消費者數量

m = 分割槽數%消費者數量

前m個消費者每個分配n+1個分割槽,後面的 (消費者數量-m)個消費者每個分配n個分割槽

假如有10個分割槽,3個消費者,把分割槽按照序號排列0,1,2,3,4,5,6,7,8,9;消費者為c1,c2,c3,那麼用分割槽數除以消費者數來決定每個consumer消費幾個partition,除不盡的前面幾個消費者將會多消費乙個 

最後分配結果如下

c1:0,1,2,3 

c2:4,5,6 

c3:7,8,9

如果有11個分割槽將會是:

c1:0,1,2,3 

c2:4,5,6,7 

c3:8,9,10

假如我們有兩個主題t1,t2,分別有10個分割槽,最後的分配結果將會是這樣:

c1:t1(0,1,2,3) t2(0,1,2,3) 

c2:t1(4,5,6) t2(4,5,6) 

c3:t1(7,8,9) t2(7,8,9)

在這種情況下,c1多消費了兩個分割槽

2.roundrobinassignor

將所有的topic和partition按照字典順序排序,然後對每個consumer進行輪詢分配

roundrobin策略針對於全域性所有的topic和消費者,分配步驟如下: 

1. 消費者按照字典排序,例如c0, c1, c2… …,並構造環形迭代器。 

2. topic名稱按照字典排序,並得到每個topic的所有分割槽,從而得到所有分割槽集合。 

3. 遍歷第2步所有分割槽集合,同時輪詢消費者。 

4. 如果輪詢到的消費者訂閱的topic不包括當前遍歷的分割槽所屬topic,則跳過;否則分配給當前消費者,並繼續第3步。

所以對於某個topic來說: 

如果有5個分割槽(p0, p1, p2, p3, p4),且訂閱這個topic的消費者組有2個消費者(c0, c1)。那麼p0, p2, p4將被c0消費,p1, p3將被c1消費。

roundrobin策略如下圖所示: 

如圖所示: 

3個topic:t0(3個分割槽0, 1, 2), t1(兩個分割槽0, 1), t2(4個分割槽0, 1, 2, 3); 

3個consumer: c0訂閱了[t0, t1], c1訂閱了[t1, t2], c2訂閱了[t2, t0];

roundrobin結果分配結果如下: 

t0-p0分配給c0,t0-p1分配給c2,t0-p2分配給c0, 

t1-p0分配給c1,t1-p1分配給c0, 

t2-p0分配給c1,t2-p1分配給c2,t2-p2分配給c1,t0-p3分配給c2;

推算過程: 

分割槽t0-p0,消費者c0,c0訂閱了這個分割槽所在topic即t0,所以t0-p0分配給c0; 

輪詢到下乙個分割槽t0-p1和下乙個消費者c1; 

分割槽t0-p1,消費者c1,c1沒有訂閱t0,取下乙個消費者c2,c2訂閱了t0,所以t0-p1分配給c2; 

輪詢到下乙個分割槽t0-p2和下乙個消費者c0; 

分割槽t0-p2,消費者c0,c0訂閱了t0,所以t0-p2分配給c0; 

輪詢到下乙個分割槽t1-p0和下乙個消費者c1; 

分割槽t1-p0,消費者c1,c1訂閱t1,所以t1-p0分配給c1; 

以此類推即可。

3.自定義分配策略:實現abstractpartitionassignor類的assign()方法

將全部n broker和待分配的i個partition排序. 

將第i個partition分配到第(i mod n)個broker上. 

將第i個partition的第j個副本分配到第((i + j) mod n)個broker上.

reblance本質上是一種協議,規定了乙個consumer group下的所有的consumer如何達成一致來分配訂閱topic的每個partition。比如某個group下有5個consumer,它訂閱了乙個具有10個分割槽的topic。正常情況下,kafka平均會為每個consumer分配2個分割槽。這個分配的過程就叫rebalance。

rebalance的觸發條件:

1.有新的消費者加入consumer group

2.有消費者下線,可能由於長時間未向groupcoordinator(協調者)傳送心跳,groupcoordinator會認為其已下線

3.有消費者主動退出consumer group

4.訂閱的topic分割槽出現變化

5.呼叫unsubscribe()取消對某topic的訂閱

即consumer或者topic自身發生變化時,會觸發rebalance。

kafka的分割槽分配策略

將所有broker n個 和partition排序 將第i個partition分配到第 i mode n 個broker上 當key為空時,訊息隨機傳送到各個分割槽 各個版本會有不同,有的是採用輪詢的方式,有的是隨機,有的是一定時間內只傳送給固定partition,隔一段時間後隨機換乙個 用key的...

Kafka的分割槽分配策略

用過 kafka 的同學應該都知道,每個 topic 一般會有很多個 partitions。為了使得我們能夠及時消費訊息,我們也可能會啟動多個 consumer 去消費,而每個 consumer 又會啟動乙個或多個streams去分別消費 topic 對應分割槽中的資料。我們又知道,kafka 存在...

詳解Kafka分割槽分配策略

前言 乙個consumer group中有多個consumer,乙個topic有多個partition,所以必然會涉及到partition的分配問題,即確定那個partition由哪個consumer來消費。kafka有兩種分配策略,一是roundrobin,二是range 1.roundrobin...