Kafka 各組件架構簡介
1.Broker
每個 kafka server 稱爲一個 Broker,多個 borker 組成 Kafka Cluster。
一個機器上可以部署一個或者多個 Broker,這多個 Broker 連接到相同的 ZooKeeper 就組成了 Kafka 集羣。
2.Topic
Kafka 是一個發佈訂閱消息系統,它的邏輯結構如下:
Topic 就是消息類別名,一個 topic 中通常放置一類消息。每個 topic 都有一個或者多個訂閱者,也就是消息的消費者 consumer。
Producer 將消息推送到 topic,由訂閱該 topic 的 consumer 從 topic 中拉取消息。
3.Topic 與 Broker
一個 Broker 上可以創建一個或者多個 Topic, 同一個 topic 可以在同一集羣下的多個 Broker 中分佈。
4. Partition log
Kafka 會爲每個 topic 維護了多個分區(partition),每個分區會映射到一個邏輯的日誌(log)文件:
-
每當一個 message 被髮布到一個 topic 上的一個 partition,broker 應會將該 message 追加到這個邏輯 log 文件的最後一個 segment 上。這些 segments 會被 flush 到磁盤上,Flush 時可以按照時間來進行,也可以按照 message 數來執行。
-
每個 partition 都是一個有序的、不可變的結構化的提交日誌記錄的序列。在每個 partition 中每一條日誌記錄都會被分配一個序號,通常稱爲 offset,offset 在 partition 內是唯一的。論點邏輯文件會被化分爲多個文件 segment(每個 segment 的大小一樣的)。
-
Broker 集羣將會保留所有已發佈的 message records,不管這些消息是否已被消費。保留時間依賴於一個可配的保留週期。例如:如果設置了保留策略是 2day,那麼每一條消息發佈兩天內是被保留的,在這個 2day 的保留時間內,消息是可以被消費的。過期後不再保留。
5.Partition distribution
日誌分區是分佈式的存在於一個 kafka 集羣的多個 broker 上。每個 partition 會被複制多份存在於不同的 broker 上。這樣做是爲了容災。具體會複製幾份,會複製到哪些 broker 上,都是可以配置的。經過相關的複製策略後,每個 topic 在每個 broker 上會駐留一到多個 partition。如圖:
對於同一個 partition,它所在任何一個 broker,都有能扮演兩種角色:leader、follower。看上面的例子,紅色的代表是一個 leader。
對於 topic1 的 4 個 partition:
Part 1 的 leader 是 broker1,followers 是 broker2\3。Part2 的 leader 是 broker2,followers 是 broker1\4。Part3 的 leader 是 broker3,followers 是 broker1\3。Part4 的 leader 是 broker4,followers 是 broker2\3。
對於 topic2 的 3 個 partition:
Part1 的 leader 是 broker1,followers 是 broker2。Part2 的 leader 是 broker2,followers 是 broker3。Part3 的 leader 是 broker3,followers 是 broker4。
對於 topic2 的 4 個 partition:
Part 1 的 leader 是 broker4,followers 是 broker1\2\3。Part2 的 leader 是 broker2,followers 是 broker1\3\4。Part3 的 leader 是 broker3,followers 是 broker1\2\4。Part4 的 leader 是 broker1,followers 是 broker2\3\4。
下面是一個真實的例子:
圖中的 partition 0 的 leader 是 broker 2,它有 3 個 replicas:2,1,3。
In-Sync Replica:在同步中,也就是有哪些 broker 正處理同步中。partition 0 的 ISR 是 2,1,3,說明了 3 個 replica 都是正常狀態。如果有一個 broker down,那麼它就不會在 ISR 中出現。
之後把 broker1 停止後:
每個 partition 的 Leader 的用於處理到該 partition 的讀寫請求的,每個 partition 的 followers 是用於異步的從它的 leader 中複製數據的。
Kafka 會動態維護一個與 Leader 保持一致的同步副本(in-sync replicas (ISR))集合,並且會將最新的同步副本(ISR )集合持久化到 zookeeper。如果 leader 出現問題了,就會從該 partition 的 followers 中選舉一個作爲新的 leader。
所以呢,在一個 kafka 集羣中,每個 broker 通常會扮演兩個角色:在一個 partition 中扮演 leader,在其它的 partition 中扮演 followers。Leader 是最繁忙的,要處理讀寫請求。這樣將 leader 均分到不同的 broker 上,目的自然是要確保負載均衡。
6.Producer
Producer 作爲消息的生產者,在生產完消息後需要將消息投送到指定的目的地(某個 topic 的某個 partition),Producer 可以根據指定選擇 partition 的算法或者是隨機方式來選擇發佈消息到哪個 partition。
7.Consumer
-
在 Kafka 中,同樣有 consumer group 的概念,它是邏輯上將一些 consumer 分組。因爲每個 kafka consumer 是一個進程,所以一個 consumer group 中的 consumers 將可能是由分佈在不同機器上的不同的進程組成的。
-
Topic 中的每一條消息可以被多個 consumer group 消費,然而每個 consumer group 內只能有一個 consumer 來消費該消息。所以,如果想要一條消息被多個 consumer 消費,那麼這些 consumer 就必須是在不同的 consumer group 中。
-
每個 consumer 可以訂閱多個 topic。
-
每個 consumer 會保留它讀取到某個 partition 的 offset,而 consumer 是通過 zookeeper 來保留 offset 的。
架構圖
對上述各組件介紹後,現在就應該可以很容易的理解 Kafka 的架構圖:
在 0.8 版本之後,consumer 不會再與 zookeeper 直接通信了,所以該架構圖也應該有所調整了:
作者:Natasha_
來源:juejin.cn/post/6890398563004579854
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/bkeZjcFGc47g2lXVD0TnSw