關於Kafka分割槽策略和分割槽分配策略的理解

2021-10-04 01:52:27 字數 1691 閱讀 8743

1)分割槽的原因

(1)方便在集群中擴充套件,每個 partition 可以通過調整以適應它所在的機器,而乙個 topic

又可以有多個 partition 組成,因此整個集群就可以適應任意大小的資料了;

(2)可以提高併發,因為可以以 partition 為單位讀寫了。

2)分割槽的原則

我們需要將 producer 傳送的資料封裝成乙個 producerrecord 物件。

(1)指明 partition 的情況下,直接將指明的值直接作為 partiton 值;

(2)沒有指明 partition 值但有 key 的情況下,將 key 的 hash 值與 topic 的 partition

數進行取餘得到 partition 值;

(3)既沒有 partition 值又沒有 key 值的情況下,第一次呼叫時隨機生成乙個整數(後面每次呼叫在這個整數上自增),將這個值與 topic 可用的 partition 總數取餘得到 partition

值,也就是常說的 round-robin 演算法。

理解:這裡第三點,若為預設情況,未指定partition和key,則根據隨機數依次輪詢分割槽寫入資料(注意:如果topic a有0 1 2三個分割槽,這裡有可能是從0 1 2三個分割槽的任何乙個開始,起點取決於第一次呼叫生成的隨機數)。

乙個 consumer group 中有多個 consumer,乙個 topic 有多個 partition,所以必然會涉及

到 partition 的分配問題,即確定那個 partition 由哪個 consumer 來消費。

kafka 有兩種分配策略,一是 roundrobin,一是 range(預設)。

(1) range 範圍分割槽策略是對每個 topic 而言的。首先對同乙個 topic 裡面的分割槽按照序號進行排序,並對消費者按照字母順序進行排序。通過partitions數/consumer數來決定每個消費者應該消費幾個分割槽。如果除不盡,那麼前面幾個消費者將會多消費 1 個分割槽。

(2) roundrobin 輪詢分割槽策略,是把所有的 partition 和所有的 consumer 都列出來,然後按照 hascode 進行排序,最後通過輪詢演算法來分配 partition 給到各個消費者。

例:topic a 有0 1 2三個分割槽,現有2個customer分別為b c

那麼根據上面的公式,分割槽分配結果為b:0 1,c:3,而不是採用輪詢的方式。

注意:不要被消費者接收到的資料所迷惑,根據我在上面分割槽策略中的理解,這裡寫入的資料,從三個分割槽都有可能為最開始接收到資料的分割槽。

例如我在生產者輸入1 2 3 4 5

消費者分別從分割槽中pull中接收到1 3 4和2 5,這並不能說明,兩個消費者分配到的分割槽不是連續的,而是因為我上面提到的最開始寫入資料的分割槽是隨機的(這裡正好是從1分割槽開始)

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...