天天看點

Kafka架構圖

1.架構圖

如上圖,一個kafka架構包括若幹個Producer(伺服器日志、業務資料、web前端産生的page view等),若幹個Broker(kafka支援水準擴充,一般broker數量越多叢集的吞吐量越大),若幹個consumer group,一個Zookeeper叢集(kafka通過Zookeeper管理叢集配置、選舉leader、consumer group發生變化時進行rebalance)。

2.名稱解釋

  • Broker

消息中間件處理節點(伺服器),一個節點就是一個broker,一個Kafka叢集由一個或多個broker組成

  • Topic

Kafka對消息進行歸類,發送到叢集的每一條消息都要指定一個topic

  • Partition

實體上的概念,每個topic包含一個或多個partition,一個partition對應一個檔案夾,這個檔案夾下存儲partition的資料和索引檔案,每個partition内部是有序的

  • Producer

生産者,負責釋出消息到broker

  • Consumer

消費者,從broker讀取消息

  • ConsumerGroup

每個consumer屬于一個特定的consumer group,可為每個consumer指定group name,若不指定,則屬于預設的group,一條消息可以發送到不同的consumer group,但一個consumer group中隻能有一個consumer能消費這條消息

3.關系解釋

  • Topic & Partition

一個topic為一類消息,每條消息必須指定一個topic。實體上,一個topic分成一個或多個partition,每個partition有多個副本分布在不同的broker中,如下圖3.1。

每個partition在存儲層面是一個append log檔案,釋出到此partition的消息會追加到log檔案的尾部,為順序寫人磁盤(順序寫磁盤比随機寫記憶體的效率還要高)。每條消息在log檔案中的位置成為offset(偏移量),offset為一個long型數字,唯一标記一條消息。如下圖3.2

每個消費者唯一儲存的中繼資料是offset值,這個位置完全為消費者控制,是以消費者可以采用任何順序來消費記錄,如下圖3.3

Kafka架構圖

圖3.1

另外,對于傳統的消息隊列而言,一般會删除已經被消費的消息,而kafka叢集會保留所有的消息。因為磁盤限制,不可能永久保留所有消息,是以kafka提供了兩種政策删除資料:1.基于時間,讓kafka删除2天或一周的資料;2.基于partition檔案大小:讓kafka在partition檔案超過1GB時删除資料

Kafka架構圖

圖3.2

Kafka架構圖

圖3.3

kafka中隻能保證partition中記錄是有序的,而不保證topic中不同partition的順序

  • Consumer group & consumer

一個消費組由一個或多個消費者執行個體組成,便于擴容與容

錯。kafka是釋出與訂閱模式,這個訂閱者是消費組,而不是消費者執行個體。每一條消息隻會被同一個消費組裡的一個消費者執行個體消費,不同的消費組可以同時消費同一條消息,如下圖

Kafka架構圖

為了實作傳統的消息隊列中消息隻被消費一次的語義,kafka保證同一個消費組裡隻有一個消費者會消費一條消息,kafka還允許不同的消費組同時消費一條消息,這一特性可以為消息的多元化處理提供了支援,kafka的設計理念之一就是同時提供離線處理和實時處理,是以,可以使用Storm這種實時流處理系統對消息進行實時線上處理,同時使用Hadoop這種批處理系統進行離線處理,還可以同時将資料實時備份到另一個資料中心,隻需要保證這三個操作的消費者執行個體在不同consumer group 即可

建立一個topic(名為topic1,3個partition 0,1,2),group1有1個consumer,group2中有3個consumer,通過producer向topic1發送3條消息(key分别為1,2,3),結果group1中的1個consumer收到了所有這2條消息,group2中的3個consumer分别收到了這3條消息,如下圖

Kafka架構圖
  • Consumer Rebalance

kafka保證了同一個消費組中隻有一個消費者執行個體會消費某條消息,實際上,kafka保證的是穩定狀态下每一個消費者執行個體隻會賣二手手遊賬号平台地圖消費一個或多個特定partition資料,而某個partition的資料隻會被某一特定的consumer執行個體消費,這樣設計的劣勢是無法讓同一個消費組裡的consumer均勻消費,優勢是每個consumer不用跟大量的broker通信,減少通信開銷,也降低了配置設定難度。而且,同一個partition資料是有序的,保證了有序被消費。根據consumer group中的consumer數量和partition數量,可以分為以下3種情況:

  1. 若consumer group中的consumer數量少于partition數量,則至少有1個consumer會消費多個partition資料
  2. 若consumer group中的consumer數量多于partition數量,則會有部分consumer無法消費該topic中任何一條消息
  3. 若consumer group中的consumer數量等于partition數量,則正好一個consumer消費一個partition資料

測試如下,topic1中有3個partition分别為0,1,2:

  • 當group1中隻有1個consumer1時,該consumer1可消費這3個partition的所有資料
Kafka架構圖
  • 增加1個consumer2後,consumer1消費2個partition資料,consumer2消費1個partition資料
Kafka架構圖
  • 再增加1個consumer3後,consumer 1,2,3 分别消費 partition 1,2,3
Kafka架構圖
  • 再增加1個consumer4後,3個consumer可分别消費1個partition,另1個consumer4不能消費topic1任何資料
  • 此時關閉consumer1,剩下的consumer可分别消費1個partition的資料
Kafka架構圖
  • 再關閉consumer2,剩下的consumer3可消費2個partition,consumer4可消費1個partition
  • 再關閉consumer3,剩下的consumer4可消費3個partition

繼續閱讀