Kafka——在zookeeper中存儲結構和查看方式


 

Zookeeper 主要用來跟蹤Kafka 集群中的節點狀態, 以及Kafka Topic, message 等等其他信息. 同時, Kafka 依賴於Zookeeper, 沒有Zookeeper 是不能運行起來Kafka 的. 

  • Controller 選舉:
    • Controller 是一個特殊的Broker, 其負責所有Partition 的leader/follower 關系.
    • Zookeeper 負責從Broker 中選舉出一個作為Controller, 並確保其唯一性. 同時, 當Controller 宕機時, 選舉一個新的.
  • 集群 membership:
    • 記錄集群中都有哪些活躍着的Broker.
  • Topic 配置:
    • 有哪些Topic, Topic 都有哪些Partition, Replica 存放在哪里, Leader 是誰.
  • 配額(0.9.0+):
    • 記錄每個客戶能夠讀寫的數據量.
  • ACLs(0.9.0+):
    • 記錄對Topic 的讀寫控制.

 

1、kafka的ZooKeeper存儲結構

 

  該圖片盜自大牛的博客:http://blog.csdn.net/lizhitao/article/details/23744675

  在ZK 的監視端, 運行ls / , 可以列出所有的頂級節點, 主要包含以下的節點:

  • cluster.
  • brokers.
  • controller.
  • consumer.
  • config.
  • isr_change_notification.

  通過字面意思能夠理解其記錄的內容. 需要說明的是isr_change_notification 節點. 在Kafka 中, Leader 和Follower 的數據同步遵循的是"最終一致"原則, 也就是數據同步會有延遲, 但保證最終數據的一致性.

  isr 是'in-sync' replicas 的縮寫, 代表的是與Leader 數據已經通過過的replica, 它會作為重選Leader 時作為判斷依據.

 

2、連接ZooKeeper

  2.1 kafka自帶zookeeper

  進入kafka的bin目錄,執行以下命令:

[root@localhost bin]# ./zookeeper-shell.sh 172.16.10.91:2181,172.16.10.92:2181,172.16.10.93:2181

 

  2.2 獨立安裝zookeeper

  服務端開啟的情況下,進入客戶端的命令:

{zookeeper目錄}/bin/zkCli.sh

 

3、常用命令

(1)查看數據:ls, ls2

  【ls】會顯示該節點下的子節點信息

  例如:【ls /】:顯示zookeeper根目錄下的子節點

  例如:【ls /brokers/ids】:顯示集群中的Broker列表

  

  【ls2】命令會顯示該節點的子節點信息和屬性信息

  例如:【ls2 /brokers/topics/cwx】:顯示cwx主題的子節點信息和屬性信息

   

(2)獲取數據:get

  get 命令會顯示該節點的節點數據內容和屬性信息

  例如:【get /brokers/topics/topic-01】:可以獲取topic-01 主題的值

  可以看出, 該Topic 只有一個Partition

 

  例如:【get /brokers/topics/topic-01/partitions/0/state】:獲取Topic Partition 的信息

  可以看出, 該Topic 有3個replica, 而且當前狀態都是isr(也就是已處於最新狀態). 同時, 當前的Leader 是Broker 0.

 

(3)獲取數據:rmr 

  rmr 命令刪除指定路徑的節點

  例如:【rmr /brokers/topics/test】:刪除test主題

 

4、主要節點信息描述

  4.1 topic注冊信息

  命令:/brokers/topics/[topic]

  存儲某個topic的partitions所有分配信息

Schema:
{
    "version": "版本編號目前固定為數字1",
    "partitions": {
        "partitionId編號": [
            同步副本組brokerId列表
        ],
        "partitionId編號": [
            同步副本組brokerId列表
        ],
        .......
    }
}
Example:
{
"version": 1,
"partitions": {
"0": [1, 2],
"1": [2, 1],
"2": [1, 2],
}
}

 

  4.2 partition狀態信息

  命令:/brokers/topics/[topic]/partitions/[partitionId]/state

Schema:
{
"controller_epoch": 表示kafka集群中的中央控制器選舉次數,
"leader": 表示該partition選舉leader的brokerId,
"version": 版本編號默認為1,
"leader_epoch": 該partition leader選舉次數,
"isr": [同步副本組brokerId列表]
}
 
Example:
{
"controller_epoch": 1,
"leader": 2,
"version": 1,
"leader_epoch": 0,
"isr": [2, 1]
}

 

  4.3 Broker注冊信息

  命令:/brokers/ids/[0...N] 

  每個broker的配置文件中都需要指定一個數字類型的id(全局不可重復),此節點為臨時znode(EPHEMERAL)

Schema:
{
"jmx_port": jmx端口號,
"timestamp": kafka broker初始啟動時的時間戳,
"host": 主機名或ip地址,
"version": 版本編號默認為1,
"port": kafka broker的服務端端口號,由server.properties中參數port確定
}
 
Example:
{
"jmx_port": 6061,
"timestamp":"1403061899859"
"version": 1,
"host": "192.168.1.148",
"port": 9092
}

 

  4.4 Controller epoch

  命令:/controller_epoch -> int (epoch)

  此值為一個數字,kafka集群中第一個broker第一次啟動時為1,以后只要集群中center controller中央控制器所在broker變更或掛掉,就會重新選舉新的center controller,每次center controller變更controller_epoch值就會 + 1; 

  4.5 Controller注冊信息

  命令:/controller -> int (broker id of the controller)

  存儲center controller中央控制器所在kafka broker的信息

Schema:
{
"version": 版本編號默認為1,
"brokerid": kafka集群中broker唯一編號,
"timestamp": kafka broker中央控制器變更時的時間戳
}
 
Example:
{
"version": 1,
"brokerid": 3,
"timestamp": "1403061802981"
}

 

  4.6 Consumer offset

  命令:/consumers/[groupId]/offsets/[topic]/[partitionId] -> long (offset)

  用來跟蹤每個consumer目前所消費的partition中最大的offset,此znode為持久節點,可以看出offset跟group_id有關,以表明當消費者組(consumer group)中一個消費者失效,重新觸發balance,其他consumer可以繼續消費。

 

  4.7 刪除topics

  命令:/admin/delete_topics

Schema:
{ "fields":
    [ {"name""version""type""int""doc""version id"},
      {"name""topics",
       "type": { "type""array""items""string""doc""an array of topics to be deleted"}
      } ]
}
 
例子:
{
  "version"1,
  "topics": ["foo""bar"]
}

 

  4.8 Topic配置

  命令:/config/topics/[topic_name]

{
  "version": 1,
  "config": {
    "config.a": "x",
    "config.b": "y",
    ...
  }
}

  

5、關閉Leader

    

 

6、關閉Zookeeper 

   

 

7、特別注意事項

  離開了Zookeeper, Kafka 不能對Topic 進行新增操作, 但是仍然可以produce 和consume 消息.

  PS: 在運行過程中, 如果先關閉掉了Zookeeper, 然后再去關閉Kafka, 會發現Kafka 后台一直結束不掉, 這是因為Kafka 會被block 在與Zookeeper 的重連過程中. 解決方法是重啟Zookeeper , 然后先關閉Kafka 再關閉Zookeeper.

 

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

補充參考:

1、命令行工具的一些簡單操作如下:

1. 顯示根目錄下、文件: ls / 使用 ls 命令來查看當前 ZooKeeper 中所包含的內容
2. 顯示根目錄下、文件: ls2 / 查看當前節點數據並能看到更新次數等數據
3. 創建文件,並設置初始內容: create /zk "test" 創建一個新的 znode節點“ zk ”以及與它關聯的字符串
4. 獲取文件內容: get /zk 確認 znode 是否包含我們所創建的字符串
5. 修改文件內容: set /zk "zkbak" 對 zk 所關聯的字符串進行設置
6. 刪除文件: delete /zk 將剛才創建的 znode 刪除
7. 退出客戶端: quit
8. 幫助命令: help
 

2、ZooKeeper 常用四字命令:

      ZooKeeper 支持某些特定的四字命令字母與其的交互。它們大多是查詢命令,用來獲取 ZooKeeper 服務的當前狀態及相關信息。用戶在客戶端可以通過 telnet 或 nc 向 ZooKeeper 提交相應的命令

1. 可以通過命令:echo stat|nc 127.0.0.1 2181 來查看哪個節點被選擇作為follower或者leader
2. 使用echo ruok|nc 127.0.0.1 2181 測試是否啟動了該Server,若回復imok表示已經啟動。
3. echo dump| nc 127.0.0.1 2181 ,列出未經處理的會話和臨時節點。
4. echo kill | nc 127.0.0.1 2181 ,關掉server
5. echo conf | nc 127.0.0.1 2181 ,輸出相關服務配置的詳細信息。
6. echo cons | nc 127.0.0.1 2181 ,列出所有連接到服務器的客戶端的完全的連接 / 會話的詳細信息。
7. echo envi |nc 127.0.0.1 2181 ,輸出關於服務環境的詳細信息(區別於 conf 命令)。
8. echo reqs | nc 127.0.0.1 2181 ,列出未經處理的請求。
9. echo wchs | nc 127.0.0.1 2181 ,列出服務器 watch 的詳細信息。
10. echo wchc | nc 127.0.0.1 2181 ,通過 session 列出服務器 watch 的詳細信息,它的輸出是一個與 watch 相關的會話的列表。
11. echo wchp | nc 127.0.0.1 2181 ,通過路徑列出服務器 watch 的詳細信息。它輸出一個與 session 相關的路徑。

 

 

參考:

http://blog.csdn.net/lizhitao/article/details/23744675

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM