一圖全解Kafka在Zookeeper中的數據結構
在kafka_2.8.0之前,kafka還是需要依賴zookeeper運行,kafka中的很多數據都存儲在zk中, 例如 「Broker的注冊信息」、「Topic的信息」 、 「運維操作臨時信息 」、 「配置信息」等等其他信息。
下面我們用用一張圖來窺探kafka在zookeeper中的全貌,建議收藏!!!
一圖知全貌
kafka在zookeeper中的數據結構
1/cluster
01- /cluster/id 持久數據節點
集群ID 當第一臺Broker啟動的時候, 發現/cluster/id不存在,那么它就會把自己的cluster.id配置寫入zk; 標記當前zk是屬于集群哪個集群; 后面其他的Broker啟動的時候會去獲取該數據, 如果發現數據跟自己的配置不一致; 則拋出異常,加入的不是同一個集群; 數據示例:{"version":"1","id":"0"}
2/controller_epoch 持久數據節點
Controller選舉次數;
3/Controller 臨時數據節點
當前Controller角色的BrokerId,數據示例:{"version":1,"brokerid":0,"timestamp":"1624415590383"}刪除該節點立馬觸發重新選舉
4/log_dir_event_notification
zk的數據中有一個節點/log_dir_event_notification/,這是一個序列號持久節點 這個節點在kafka中承擔的作用是: 當某個Broker上的LogDir出現異常時(比如磁盤損壞,文件讀寫失敗,等等異常): 向zk中新增一個子節點/log_dir_event_notification/log_dir_event_序列號 ;Controller監聽到這個節點的變更之后,會向Brokers們發送LeaderAndIsrRequest請求; 然后做一些副本脫機的善后操作
5/isr_change_notification/log_dir_event_{序列號}
當Isr有變更的時候,會寫入這個節點Controller監聽變更
6/admin
01 -/admin/delete_topics/{topicName} 持久節點,待刪除Topic
存在此節點表示 當前Topic需要被刪除
02 - /admin/reassign_partitions 持久數據節點
如果有此節點,表示當前正在進行數據遷移,里面的數據就是正在遷移的配置 示例數據:
7/brokers
01 -/brokers/seqid
/brokers/seqid: 全局序列號里面沒有數據,主要是用了節點的dataVersion信息來當全局序列號
在kafka中的作用: 自動生成BrokerId主要是用來自動生成brokerId; 一個集群如果特別大,配置brokerId的時候不能重復,一個個設置比較累; 可以讓Broker自動生成BrokerId
server.properties 配置
- ## 設置Brokerid能夠自動生成
- broker.id.generation.enable=true
- ## 設置BrokerId<0 (如果>=0則以此配置為準)
- broker.id=-1
- ## 自動生成配置的起始值
- reserved.broker.max.id=20000
BrokerId計算方法
brokerId = {reserved.broker.max.id} +/brokers/seqid.dataVersion
每次想要獲取/brokers/seqid的dataVersion值的時候都是用 set方法,set的時候會返回version數據,并不是get;每次set這個節點數據,版本信息就會自增;所以就實現了全局自增ID了;
02 - /brokers/ids/{id} 臨時數據節點 : 在線BrokerID
在線的Broker都會在這里注冊一個節點; 下線自動刪除
03 - /brokers/topics/{topicName}持久數據節點
存儲 topic的分區副本分配信息 例如:{"version":1,"partitions":{"0":[0]}}
/brokers/topics/{topicName}/{分區號}/state 持久數據節點
存儲指定分區的leader和isr等信息 例如:{"controller_epoch":203,"leader":0,"version":1,"leader_epoch":0,"isr":[0]}
本文轉載自微信公眾號「石臻臻的雜貨鋪」,可以通過以下二維碼關注。轉載本文請聯系石臻臻的雜貨鋪公眾號。