Kafka的介紹可參考:
Zookeeper在Kafka中的使用
從上面的介紹可以看出Kafka是一個分佈式的消息系統,分佈式主要體現在Producer,Broker,Consumer的分佈式,下面章節主要講解Zookeeper如何支持相關對象的分佈式特性
Broker註冊
Broker在zookeeper中保存爲一個臨時節點,節點的路徑是/brokers/ids/[brokerid],每個節點會保存對應broker的IP以及端口等信息.
Topic註冊
在kafka中,一個topic會被分成多個區並被分到多個broker上,分區的信息以及broker的分佈情況都保存在zookeeper中,根節點路徑爲/brokers/topics,每個topic都會在topics下建立獨立的子節點,每個topic節點下都會包含分區以及broker的對應信息,例如下圖中的狀態
生產者負載均衡
當Broker啓動時,會註冊該Broker的信息,以及可訂閱的topic信息。生產者通過註冊在Broker以及Topic上的watcher動態的感知Broker以及Topic的分區情況,從而將Topic的分區動態的分配到broker上.
消費者
kafka有消費者分組的概念,每個分組中可以包含多個消費者,每條消息只會發給分組中的一個消費者,且每個分組之間是相互獨立互不影響的。
消費者與分區的對應關係
對於每個消費者分組,kafka都會爲其分配一個全局唯一的Group ID,分組內的所有消費者會共享該ID,kafka還會爲每個消費者分配一個consumer ID,通常採用hostname:uuid的形式。在kafka的設計中規定,對於topic的每個分區,最多隻能被一個消費者進行消費,也就是消費者與分區的關係是一對多的關係。消費者與分區的關係也被存儲在zookeeper中
節點的路勁爲 /consumers/[group_id]/owners/[topic]/[broker_id-partition_id],該節點的內容就是消費者的Consumer ID
例如下圖的狀態:
消費者負載均衡
消費者服務啓動時,會創建一個屬於消費者節點的臨時節點,節點的路徑爲 /consumers/[group_id]/ids/[consumer_id],該節點的內容是該消費者訂閱的Topic信息。
每個消費者會對/consumers/[group_id]/ids節點註冊Watcher監聽器,一旦消費者的數量增加或減少就會觸發消費者的負載均衡。
例如下圖的狀態:
消費者還會對/brokers/ids/[brokerid]節點進行監聽,如果發現服務器的Broker服務器列表發生變化,也會進行消費者的負載均衡
消費者的offset
在kafka的消費者API分爲兩種(1)High Level Api:由zookeeper維護消費者的offset (2) Low Level API,自己的代碼實現對offset的維護。由於自己維護offset往往比較複雜,所以多數情況下都是使用High Level的API
offset在zookeeper中的節點路徑爲/consumers/[group_id]/offsets/[topic]/[broker_id-part_id],該節點的值就是對應的offset
轉自http://www.itnose.net/detail/6318531.html