漫游Kafka实现篇之分布式
原文地址:http://blog.csdn.net/honglei915/article/details/37932819
Zookeeper節(jié)點(diǎn)標(biāo)記
當(dāng)路徑中的元素包括在方括號(hào)里比如[xyz],則表示xyz表示的值是不固定的,每個(gè)可能的值都有一個(gè)Zookeeper節(jié)點(diǎn)。比如/topics/[topic]表示每個(gè)topic名稱對應(yīng)/topics的一個(gè)子目錄。也可以用類似[0...5]表示一個(gè)數(shù)值范圍來表示含有子目錄0,1,2,3,4的目錄。箭頭->表示znode的節(jié)點(diǎn)含有某個(gè)內(nèi)容,比如/hello->word表示一個(gè)含有“world”的節(jié)點(diǎn)。
/brokers/ids/[0...N] --> host:port (ephemeral node)
表示一個(gè)broker節(jié)點(diǎn)的列表,每個(gè)節(jié)點(diǎn)提供了一個(gè)供consumers識(shí)別的broker id,這個(gè)id必須在配置文件中指明。啟動(dòng)時(shí),broker節(jié)點(diǎn)會(huì)用紙的id在/brokers/ids下給自己注冊一個(gè)znode,broker可以被轉(zhuǎn)移到另外一臺(tái)機(jī)器上,只要id不變就不會(huì)影響consumers.如果試圖注冊一個(gè)已經(jīng)存在的broker id(比如兩個(gè)節(jié)點(diǎn)配置了同樣的id)將會(huì)產(chǎn)生錯(cuò)誤。
Broker注冊的Zookeeper節(jié)點(diǎn)是臨時(shí)節(jié)點(diǎn),如果一個(gè)broker節(jié)點(diǎn)關(guān)閉了,注冊也就失效了,并通知consumer這個(gè)節(jié)點(diǎn)不再活動(dòng)了。
Consumers和Consumer組
Consumers也在Zookeeper中注冊自己,目的是在消費(fèi)消息時(shí)進(jìn)行負(fù)載均衡,并跟蹤消費(fèi)的每個(gè)分區(qū)的offset.
Consumers可以組成一個(gè)組,共同消費(fèi)一個(gè)copic,組中的每個(gè)consumer共享一個(gè)組id.組id配置在consumer的配置參數(shù)中。可以參考前面文章的consumer實(shí)例。
組中的consumer會(huì)均勻分配topic的分區(qū),每個(gè)分區(qū)只會(huì)被組里的一個(gè)consumer消費(fèi)。
Consumer Id注冊
除了共享的組id,每個(gè)consumer還會(huì)沒分配一個(gè)臨時(shí)的唯一的consumer_id,格式為:hostname:uuid。consumer_id被注冊到以下的目錄中:
/consumers/[group_id]/ids/[consumer_id] --> {"topic1": #streams, ..., "topicN": #streams} (ephemeral node) 每個(gè)consumer都注冊到組的下面,并用consumer_id創(chuàng)建一個(gè)znode.znode的值包含一個(gè)<topic, #streams>.的map.Znode節(jié)點(diǎn)是臨時(shí)的,如果consumer線程結(jié)束了,這個(gè)節(jié)點(diǎn)就會(huì)消失。
Consumer Offset 跟蹤
Consumer跟蹤它在每個(gè)分區(qū)中消費(fèi)的最大的offset,并保存在以下的Zookeeper目錄中:
/consumers/[group_id]/offsets/[topic]/[broker_id-partition_id] --> offset_counter_value ((persistent node)
分區(qū)歸屬注冊
每個(gè)分區(qū)只會(huì)被組中的一個(gè)consumer消費(fèi),consumer在消費(fèi)之前必須建立和分配的分區(qū)的歸屬關(guān)系,把它的consumerid寫入broker分區(qū)下的一個(gè)臨時(shí)節(jié)點(diǎn)。
/consumers/[group_id]/owners/[topic]/[broker_id-partition_id] --> consumer_node_id (ephemeral node)
Broker節(jié)點(diǎn)注冊
Broker節(jié)點(diǎn)基本是獨(dú)立的,只需發(fā)布自己擁有的信息。當(dāng)一個(gè)節(jié)點(diǎn)加入,它把自己注冊到broker node目錄中,并寫入host name和port的信息到broker topic記錄中。Broker也要注冊一個(gè)topic列表,新的topic會(huì)被動(dòng)態(tài)的注冊。
Consumer注冊規(guī)則
當(dāng)一個(gè)consumer啟東時(shí),它將遵循以下步驟:
總結(jié)
以上是生活随笔為你收集整理的漫游Kafka实现篇之分布式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 漫游Kafka实现篇之消息和日志
- 下一篇: 内存管理:_CrtDumpMemoryL