在kafka中,topic是乙個儲存訊息的邏輯概念,可以認為是乙個訊息集合。每條訊息傳送到kafka集群的
訊息都有乙個類別。物理上來說,不同的topic的訊息是分開儲存的,
每個topic可以有多個生產者向它傳送訊息,也可以有多個消費者去消費其中的訊息。
每個topic可以劃分多個分割槽(每個topic至少有乙個分割槽),同一topic下的不同分割槽包含的訊息是不同
的。每個訊息在被新增到分割槽時,都會被分配乙個offset(稱之為偏移量),它是訊息在此分割槽中的唯
一編號,kafka通過offset保證訊息在分區內的順序,offset的順序不跨分割槽,即kafka只保證在同乙個
分區內的訊息是有序的。
下圖中,對於名字為test的topic,做了3個分割槽,分別是p0、p1、p2
每一條訊息傳送到broker時,會根據partition的規則選擇儲存到哪乙個partition。如果partition規則
設定合理,那麼所有的訊息會均勻的分布在不同的partition中,這樣就有點類似資料庫的分庫分表的概
念,把資料做了分片處理。
partition是以檔案的形式儲存在檔案系統中,比如建立乙個名為firsttopic的topic,其中有3個
partition,那麼在kafka的資料目錄(/tmp/kafka-log)中就有3個目錄,firsttopic-0~3, 命名規則是
-
sh kafka-topics.sh --create --zookeeper 192.168
.11.156
:2181
--replication-factor 1
--partitions 3
--topic firsttopic
訊息是kafka中最基本的資料單元,在kafka中,一條訊息由key、value兩部分構成,在傳送一條訊息
時,我們可以指定這個key,那麼producer會根據key和partition機制來判斷當前這條訊息應該傳送並
儲存到哪個partition中。我們可以根據需要進行擴充套件producer的partition機制。
預設情況下,kafka採用的是hash取模的分割槽演算法,如果key為null,則會隨機分配乙個分割槽,這個隨機是在這個引數"metadata.max.age.ms"的時間範圍內隨機選擇乙個,對於這個時間段內,如果key為null.則只會傳送到唯一的分割槽,這個值預設情況下是10分鐘更新一次
在實際生產過程中,每個topic都會有多個partitions,多個partitions的好處在於,一方面能夠對
broker上的資料進行分片有效減少了訊息的容量從而提公升io效能。另外一方面,為了提高消費端的消費
能力,一般會通過多個consumer去消費同乙個topic ,也就是消費端的負載均衡機制,也就是我們接下
來要了解的,在多個partition以及多個consumer的情況下,消費者是如何消費訊息的.
同時,在上一節課,我們講了,kafka存在consumer group的概念,也就是group.id一樣的consumer,這些consumer屬於乙個consumer group,組內的所有消費者協調在一起來消費訂閱主題的所有分割槽。當然每乙個分割槽只能由同乙個消費組內的consumer來消費,那麼同乙個consumer group裡面的consumer是怎麼去分配該消費哪個分割槽裡的資料的呢?如下圖所示,3個分割槽,3個消費者,那麼哪個消費者消分哪個分割槽?
**演示(3個partiton對應3個consumer)
ø 建立乙個帶3個分割槽的topic
ø 啟動3個消費者消費同乙個topic,並且這3個consumer屬於同乙個組
ø 啟動傳送者進行訊息傳送
演示結果:consumer1會消費partition0分割槽、consumer2會消費partition1分割槽、consumer3會消費 partition2分割槽
如果是2個consumer消費3個partition呢?會是怎麼樣的結果?
**演示(3個partiton對應2個consumer)
ø 基於上面演示的案例的topic不變
ø 啟動2個消費這消費該topic
ø 啟動傳送者進行訊息傳送
演示結果:consumer1會消費partition0/partition1分割槽、consumer2會消費partition2分割槽
**演示(3個partition對應4個或以上consumer)
演示結果:仍然只有3個consumer對應3個partition,其他的consumer無法消費訊息
如果consumer比partition多,是浪費,因為kafka的設計是在乙個partition上是不允許併發的,所以consumer數不要大於partition數
如果consumer比partition少,乙個consumer會對應於多個partitions,這裡主要合理分配consumer數和partition數,否則會導致partition裡面的資料被取的不均勻。最好partiton數目是consumer數目的整數倍,所以partition數目很重要,比如取24,就很容易設定consumer數目
如果consumer從多個partition讀到資料,不保證資料間的順序性,kafka只保證在乙個partition
上資料是有序的,但多個partition,根據你讀的順序會有不同
增減consumer,broker,partition會導致rebalance,所以rebalance後consumer對應的
partition會發生變化
Kafka學習筆記(六) Kafka資料複製原理
高水位的作用主要是 高水位和 leo 是副本物件的兩個重要屬性。kafka 所有副本都有對應的高水位和 leo 值,而不僅僅是 leader 副本。只不過 leader 副本比較特殊,kafka 使用 leader 副本的高水位來定義所在分割槽的高水位。換句話說,分割槽的高水位就是其 leader ...
kafka學習 四 kafka集群部署
1 broker.id 1 保證每個broker唯一,第一台可以不修改預設為0,後面兩台需要修改,如改為2和3 2 num.partitions 3 分割槽數量一般與broker保持一致 3 listeners plaintext 192.168 172 129 9092 修改為本機ip 4 zoo...
Kafka學習(四) Kafka架構詳解
1 生產者 api 2 消費者 api 說明 kafka訊息保留在磁碟上,並在集群內複製以防止資料丟失 不能提高資料的讀取效率 consumer group 每乙個consumer屬於乙個特定的consumer group 可以為每個consumer指定 groupname broker kafka...