1. 程式人生 > 實用技巧 >kafka架構

kafka架構

kafka架構

kafka架構

一個kafka架構包括如下4部分:

  • 若干個Producer,負責發生訊息
  • 一個kafka叢集,包含若干個Broker,負責儲存訊息
  • 若干個consumer group,每個consumer group包含一個或者多個consumer,負責訊息訊息
  • 一個Zookeeper叢集,負責管理叢集配置及服務協同

kafka各個元件詳解

Producer

Producer即訊息生產者,負責釋出訊息到broker,是向broker推送訊息的客戶端。

一個訊息會被髮布到一個特定的topic(主題)上,producer預設會將訊息均衡地分佈到topic的patition(分割槽)上。

在傳送一條訊息時,可以指定這條訊息的key

,Producer會根據這個key和Partition機制來判斷應該將這條訊息傳送到哪個Parition。

Producer傳送訊息並不時即時傳送的,而是進行批量傳送,通常會維護一個傳送緩衝區,當緩衝區滿了或者指定的傳送週期到達了才會真正的向kafka叢集傳送訊息

Broker

Broker即kafka叢集中包含的伺服器,一個單獨的Kafka server就是一個Broker。

Broker的主要工作就是接受生產者發過來的訊息,分配offset,之後儲存到磁碟中,同時,接收消費者、其他Borker的請求,根據請求型別進行相應處理並返回響應。

kafka叢集會選舉其中一臺伺服器作為leader,leader負責管理分割槽的狀態、管理每個分割槽的副本的狀態、監聽Zookeeper中資料的變化等工作。當Leader出現故障時則重新選舉。

對於傳統的訊息佇列而言,一般會刪除已經被消費的訊息,而kafka叢集會保留所有的訊息

因為磁碟限制,叢集是不可能永久保留所有訊息,因此kafka提供了兩種刪除策略來刪除資料:

  • 基於時間,例如kafka刪除2天或一週的資料
  • 基於partition檔案大小,例如在partition檔案超過1GB時刪除資料

Consumer Group

Consumer Group即消費者組,每個consumer group包含一個或者多個consumer,consumer從Topic中消費訊息

consumer在建立的時候會設定一個GroupID屬性,通過GroupID來區分consumer屬於哪一個Consumer Group。

consumer採取拉取模型(poll),由自己控制消費速度,以及消費的進度,消費者可以按照任意的偏移量進行消費。

consumer消費完成後需要向kafka叢集進行commit(提交)操作,kafka叢集根據consumer的提交來管理offset(位移),保證消費不重複。

每條訊息只能被consumer group中的一個Consumer消費,但同一條訊息可以被多個consumer group消費。

kafka保證的是穩定狀態下每一個Consumer只會消費一個或多個特定partition資料,而某個partition的資料只會被某一特定的consumer例項消費。

具體哪個consumer消費哪個partition是隨機分配的,且會根據consumer的增加和減少觸發rebalance(分割槽重平衡)

同一個Consumer Group的consumer的數量只能小於或者等於patition數量,如果consumer大於patition數量則會有consumer無法消費資料,造成浪費。

zookeeper

Zookeeper叢集在kafka整體架構中的主要作用是儲存元資料,broker會在zookeeper註冊並保持相關的元資料(topic,partition資訊等)更新。

客戶端會在zookeeper上註冊相關的watcher。一旦zookeeper發生變化,客戶端能及時感知並作出相應調整。這樣就保證了新增或去除broker時,各broker間仍能自動實現負載均衡。

Zookeeper在Kafka中的作用有如下幾方面

  • Broker管理:記錄每個Broker的ID和對應的資訊(主要是host和IP)
  • Topic管理:記錄topic的名稱,每個topic的patition數量和分佈情況
  • 生產者負載均衡:提供負責均衡演算法幫助生產者需要將訊息合理地傳送到這些分散式的Broker上
  • 消費者負載均衡: 負載均衡來實現多個消費者合理地從對應的Broker伺服器上接收訊息
  • 消費者管理:記錄消費者組和每個消費者組包含的數量和詳細資訊
  • 消費Offset記錄:記錄每個分割槽上消費的offset情況

下圖展示了Kafka在Zookeeper儲存的資訊的情況

Kafka在Zookeeper儲存的資訊

需要注意的是kafka正在逐步弱化對應zookeeper的依賴,在較新版本的kafka中消費者的Offset記錄以及不再儲存在zookeeper中,但是其他重要的元資料還是儲存在zookeeper中,所以kafka叢集工作還是依賴zookeeper。