漫遊Kafka實現篇之分佈式

原文地址:http://blog.csdn.net/honglei915/article/details/37932819

Zookeeper節點標記

當路徑中的元素包括在方括號裏比如[xyz],則表示xyz表示的值是不固定的,每個可能的值都有一個Zookeeper節點。比如/topics/[topic]表示每個topic名稱對應/topics的一個子目錄。也可以用類似[0...5]表示一個數值範圍來表示含有子目錄0,1,2,3,4的目錄。箭頭->表示znode的節點含有某個內容,比如/hello->word表示一個含有“world”的節點。

/brokers/ids/[0...N] --> host:port (ephemeral node)

表示一個broker節點的列表,每個節點提供了一個供consumers識別的broker id,這個id必須在配置文件中指明。啓動時,broker節點會用紙的id在/brokers/ids下給自己註冊一個znode,broker可以被轉移到另外一臺機器上,只要id不變就不會影響consumers.如果試圖註冊一個已經存在的broker id(比如兩個節點配置了同樣的id)將會產生錯誤。

Broker註冊的Zookeeper節點是臨時節點,如果一個broker節點關閉了,註冊也就失效了,並通知consumer這個節點不再活動了。

Consumers和Consumer組

Consumers也在Zookeeper中註冊自己,目的是在消費消息時進行負載均衡,並跟蹤消費的每個分區的offset.

Consumers可以組成一個組,共同消費一個copic,組中的每個consumer共享一個組id.組id配置在consumer的配置參數中。可以參考前面文章的consumer實例。

組中的consumer會均勻分配topic的分區,每個分區只會被組裏的一個consumer消費。

Consumer Id註冊

除了共享的組id,每個consumer還會沒分配一個臨時的唯一的consumer_id,格式爲:hostname:uuid。consumer_id被註冊到以下的目錄中:

/consumers/[group_id]/ids/[consumer_id] --> {"topic1": #streams, ..., "topicN": #streams} (ephemeral node)
每個consumer都註冊到組的下面,並用consumer_id創建一個znode.znode的值包含一個<topic, #streams>.的map.Znode節點是臨時的,如果consumer線程結束了,這個節點就會消失。

Consumer Offset 跟蹤

Consumer跟蹤它在每個分區中消費的最大的offset,並保存在以下的Zookeeper目錄中:

/consumers/[group_id]/offsets/[topic]/[broker_id-partition_id] --> offset_counter_value ((persistent node)

分區歸屬註冊

每個分區只會被組中的一個consumer消費,consumer在消費之前必須建立和分配的分區的歸屬關係,把它的consumerid寫入broker分區下的一個臨時節點。

/consumers/[group_id]/owners/[topic]/[broker_id-partition_id] --> consumer_node_id (ephemeral node)

Broker節點註冊

Broker節點基本是獨立的,只需發佈自己擁有的信息。當一個節點加入,它把自己註冊到broker node目錄中,並寫入host name和port的信息到broker topic記錄中。Broker也要註冊一個topic列表,新的topic會被動態的註冊。

Consumer註冊規則

當一個consumer啓東時,它將遵循以下步驟:

  1. 把自己註冊到組下面的consumer id記錄中。
  2. 註冊一個監聽器,監聽consumer id記錄的的“變更(新的consumer加入或老的退出)”,每次“變更”都會觸發一次組中各consumer之間的再平衡。
  3. 註冊一個監聽器,監聽broker id記錄的“變更(新的broker加入或者老的退出)”,每次變更都會觸發一次所有組中所有sonsumers之間的再平衡。
  4. 如果consumer消息流是使用了topic過濾器,也需要註冊一個監聽器去監聽broker topic記錄的變更(新的topic加入)。每次變更都會觸發一次對所有的topics的重新評估以決定是否符合這個過濾器。一個新的copic會觸發一次在所有consumers中的再平衡.
  5. 在它所在的組進行一次再平衡。
Kafka視頻教程同步首發,歡迎觀看!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章