Kafka的Consumer負載均衡演算法

ens發表於2018-09-27

有一個topic:test,然後這個topic的partition和他們所在的broker的圖如下:

Kafka的Consumer負載均衡演算法

    1. 其中 broker有兩個,也就是伺服器有兩臺。
    2. partition有6個,分佈按照如圖所示,按照雜湊取模的演算法分配。
    3. 消費者有8個,他們屬於同一個消費組。
複製程式碼

如果按照如圖所示,那麼這一個消費組中的消費者會怎麼取kafka的資料呢?

其實kafka的消費端有一個均衡演算法,演算法如下:

    1. A=(partition數量/同組內消費者總個數) 
    2. M=對上面所得到的A值小數點第一位向上取整 
    3. 計算出該消費者拉取資料的patition合集:Ci = [P(M*i )~P((i + 1) * M -1)]
複製程式碼

按照如圖所示,那麼這裡:

    A=6/8=0.75
    M=1
    C0=[P(1*0)~P((0+1)*1-1)]=[P0~P0] 
    
    同理:
    C1=[P(1*1)~P((1+1)*1-1)]=[P1~P1] 
    C2=[P(1*2)~P((2+1)*1-1)]=[P2~P2] 
    C3=[P(1*3)~P((3+1)*1-1)]=[P3~P3] 
    C4=[P(1*4)~P((4+1)*1-1)]=[P4~P4] 
    C5=[P(1*5)~P((5+1)*1-1)]=[P5~P5] 
    C6=[P(1*6)~P((6+1)*1-1)]=[P6~P6] 
    C7=[P(1*7)~P((7+1)*1-1)]=[P7~P7]
複製程式碼

那麼按照上面的演算法:

    C0消費者消費P0的資料 
    C1消費者消費P1的資料 
    C2消費者消費P2的資料 
    C3消費者消費P3的資料 
    C4消費者消費P4的資料 
    C5消費者消費P5的資料
    
    C6消費者消費P6的資料 
    C7消費者消費P7的資料
複製程式碼

但是partition只有P0-P5根本就沒有P6和P7,所以這兩個消費者相當於是會被閒置的,就相當於佔用資源,卻沒什麼用,所以在這裡真正起到作用的就是C0-C5。
如下圖所示:

Kafka的Consumer負載均衡演算法
如果這個消費組裡面的消費者少於partition數量呢(比如5個)? 那麼還是依葫蘆畫瓢,根據上面的演算法:

    A=6/5=1.2 
    M=2
    
    C0=[P(2*0)~P((0+1)*2-1)]=[P0~P1] 
    C1=[P(2*1)~P((1+1)*2-1)]=[P2~P3] 
    C2=[P(2*2)~P((2+1)*2-1)]=[P4~P5]
    
    C3=[P(2*3)~P((3+1)*2-1)]=[P6~P7] 
    C4=[P(2*4)~P((4+1)*2-1)]=[P8~P9]
複製程式碼

同上面一樣C3和C4沒有起到任何作用。

如下所示:

Kafka的Consumer負載均衡演算法

總結:

1. 按照如上的演算法,所以如果kafka的消費組需要增加組員,最多增加到和partition數量一致,超過的組員只會佔用資源,而不起作用。

2. kafka的partition的個數一定要大於消費組組員的個數,並且partition的個數對於消費組組員取模一定要為0,不然有些消費者會佔用資源卻不起作用。

3.如果需要增加消費組的組員個數,那麼也需要根據上面的演算法,調整partition的個數。

參考來源blog.csdn.net/qq_20641565…

相關文章