本文主要查看kafka在zookeeper中的一些存儲結構,便於更好的理解kafka的工作原理,其測試環境如下:
kafka 0.8.1.1
zookeeper 3.4.5
1 Broker node 註冊
當一個kafka broker啓動後,會向zookeeper註冊自己的節點信息,該節點爲一個臨時節點,噹噹broker斷開和zookeeper的連接時,其臨時節點將會被刪除。
其路徑爲:
/broker/ids/[0...N]
其中[0..N]表示broker id(broker id唯一,不可以重複),znode的值爲對應broker的相關信息,如下:
{
"jmx_port": -1, //JMX的端口號
"timestamp": "1460082147315",//broker啓動的時間戳
"host": "xx.xxx.xxx.xxx",//host
"version": 1,//默認的版本
"port": 9092 //broker進程的對外監聽的端口號
}
如下爲zk下的運行實例圖:
2 Broker Topic 註冊
當一個broker啓動時,會向zookeeper註冊自己持有的topic和partitions信息。
其路徑爲:
/broker/topics/[topic]/partitions/[0...N]
其中[0..N]表示partition索引號。其zonode下的信息如下:
{
"controller_epoch": 17,//中央控制器的總的選舉次數
"leader": 0, //此partition的broker leader的id
"version": 1, //默認版本號
"leader_epoch": 1,//此partition的leader選舉的次數
"isr": [
0
] //同步副本組brokerId順序列表
}
如下爲zk下的運行實例圖:
3 Consumer id 註冊
在kafka consumer的配置參數中有:
#消費者的ID,若是沒有設置的話,會自增
consumer.id
當然,consumer id也可以手動設置。
在zookeeper查看相關consumer id的註冊信息,其路徑如下:
/consumers/[group_id]/ids/[consumer_id]
這仍然是一個臨時的znode,此節點的值爲格式如下:
{
"version": 1,
"subscription": {
"user11": 1
},
"pattern": "static",
"timestamp": "1460083658252"
}
{“topic_name”:#streams…},即表示此consumer目前所消費的topic + partitions列表。
如下爲zk下的運行實例圖:
4 Consumer offset 跟蹤
用來跟蹤每個consumer group目前所消費的partition中最大的offset。
其路徑爲:
/consumers/[group_id]/offsets/[topic]/[partition_id]
此znode爲永久節點,可以看出offset跟group_id有關,以表明當group中一個消費者失效,其他consumer可以繼續消費。
如下爲zk下的運行實例圖:
5 Partition Owner 註冊
用來標記partition被哪個consumer消費,爲臨時節點。
其路徑爲:
/consumers/[group_id]/owners/[topic]/[partition_id]
如下爲zk下的運行實例圖: