zookeeper 學習筆記

zookeeper 學習筆記

基本概念

  1. 角色 zookeeper 集羣中的節點共有三種角色,每個節點同時只能是一種角色。集羣中的所有機器通過一個 Leader 選舉過程來選定一臺被稱爲 Leader 的機器。 Leader:接受所有 Follower 的提案請求並統一協調發起提案的投票,負責與所有的 Follower 進行內部的數據交換 Follower:直接爲客戶端服務並參與提案的投票,同時與 Leader 進行數據交換 Observer:直接爲客戶端服務但不參與提案的投票,同時也與 Leader 進行數據交換

  2. 會話 zookeeper 中客戶端啓動時會與服務器建立一個 TCP 連接,從第一次連接建立開始,客戶端會話的生命週期就開始了,通過這個連接,客戶端能夠通過心跳檢測與服務器保持有效的會話,也能夠向服務器發送請求並接受響應,還能夠接收來自服務器的 watch 事件通知。

  3. 節點 一般在分佈式語境下的節點是指組成集羣的每一臺服務器,在 zookeeper 中還有另外一層意思,稱之爲數據節點(ZNode)。  zookeeper 的整個名字空間的結構是層次化的,和 Linux 文件系統結構相似,是一顆樹。名字空間的層次由斜槓(/)來進行分割,在名稱空間裏面的每一個節點的名字空間由這個結點的路徑來確定。 每個 ZNode 上都會保存自己的數據內容,同時還會保存一系列屬性信息。

  4. 版本 對於每個 ZNode ,zookeeper 都會爲它維護一個叫 Stat 的數據結構,Stat 中記錄了 ZNode 的三個數據版本,version(當前ZNode數據內容的版本號)、cversion(當前ZNode子節點的版本號)、aversion(當前ZNode的ACL變更版本號)

  5. watcher zookeeper 允許用戶在指定節點上註冊一些 watcher,並且在特定事件觸發的時候,zookeeper 服務端會將事件通知到感興趣的客戶端,該機制是 zookeeper 實現分佈式協調服務的重要特性。

客戶端命令

這裏列出常用的客戶端命令,所謂客戶端命令指使用 zkCli 連接到 zookeeper 服務器之後使用的命令,zkCli 連接的語法如下: zkCli -server host:port cmd args zkCli 是客戶端可執行文件名,根據具體操作系統環境可能是 zkCli.sh 或 zkCli.cmd host 是服務器IP或域名,port 是服務器端口號,如果有多個服務器地址則用逗號分隔 cmd 是具體命令、args 是命令的參數,也可以連接上服務器之後再執行命令。

  1. 查看節點 ls /path 查看名爲 /path 的子節點,但只能查看指定節點下的第一級的所有子節點。 ls2 /path 查看名爲 /path 的子節點,並且能看到更新次數等屬性信息。

  2. 創建節點 create [-s] [-e] /path data 創建一個名叫 /path 的節點,幷包含數據 data。加上 -s 表示創建的是順序節點,加上 -e 表示創建的是臨時節點,如果都不加則默認爲創建持久節點。

  3. 刪除節點 delete /path 刪除名爲 /path 的節點

  4. 設置節點數據 set /path data 設置名爲 /path 的節點的數據爲 data

  5. 返回節點數據 get /path 返回名爲 /path 的節點的數據和屬性信息

  6. 強制同步數據 sync /path 將名爲 /path 的節點強制同步爲最新的數據

  7. 幫助信息 help 幫助命令,顯示客戶端支持的命令及語法格式

  8. 退出 quit 退出當前客戶端,會話結束。

運維命令

zookeeper 提供了一些四字命令用於獲取 zookeeper 服務端的當前狀態及相關信息,這些命令在系統運維時很有用。用戶在客戶端可以通過 telnet 或 nc 向zookeeper 提交相應的命令,比如 nc 方式: echo cmd|nc host port cmd 是具體的命令(因爲一般是四個字母所以又叫做四字命令),host 是zookeeper 服務器 IP 地址或域名,port 是 zookeeper 端口號

  1. conf 顯示服務配置的詳細信息,比如數據文件目錄、日誌文件目錄、間隔單位時間、選舉算法、選舉端口等。

  2. cons 列出所有連接到服務器的客戶端的完全的連接/會話的詳細信息。包括”接受 / 發送”的包數量、會話 id 、操作延遲、最後的操作執行等。

  3. crst 重置所有連接。

  4. dump 列出未經處理的會話和臨時節點。

  5. envi 顯示關於服務器環境的詳細信息,比如 zookeeper 版本、操作系統版本、jdk 地址等。

  6. reqs 列出未經處理的請求。

  7. ruok 測試服務是否處於正確狀態。如果確實如此,那麼服務返回“imok ”,否則不做任何相應。

  8. stat 輸出關於性能和連接的客戶端的列表。

  9. wchs 列出服務器 watch 的詳細信息。

  10. wchc 通過 session 列出服務器 watch 的詳細信息,它的輸出是一個與 watch 相關的會話的列表。

  11. wchp 通過路徑列出服務器 watch 的詳細信息,它的輸出是一個與 session 相關的路徑。

上面列出的是一些常用的四字命令,更詳細信息可以參考zookeeper的官方文檔,裏面的【ZooKeeper Commands】一節有具體介紹。

特性

  1. 一致性 zookeeper 很好地保證在分佈式高併發情況下節點的創建一定是全局唯一性,即保證客戶端無法重複創建一個已經存在的數據節點。 根據 CAP 理論,分佈式系統只能滿足一致性(Consistence)、可用性(Availability)、分區容錯性(partitioning)三項中的兩項而不可能滿足全部三項。對於 zookeeper 來說,其實現了 A 可用性、P 分區容錯性、C 中的寫入強一致性,喪失的是 C 中的讀取一致性。 更進一步解釋,zookeeper 的一致性保證包括以下幾點:
  • 順序一致性 一個客戶端的更新將按照發送的順序被寫入到服務端。
  • 原子性 更新要麼成功,要麼失敗,沒有部分結果。
  • 單一系統鏡像 客戶端只會連接 host 列表中狀態最新的那些實例。如果正在連接到的實例掛了,客戶端會嘗試重新連接到集羣中的其他實例,那麼此時滯後於故障實例的其它實例都不會接收該連接請求,只有和故障實例版本相同或更新的實例才接收該連接請求。
  • 持久性 寫操作完成之後將會被持久化存儲,不受服務器故障影響。
  • 併發一致性 zookeeper 並不保證在某個時刻兩個不同客戶端具有一致的數據視圖,因爲網絡的延遲一個客戶端可能在另一個客戶端得到修改通知之前進行更新。如果不同客戶端讀取到相同的值很重要,那麼客戶端應該在執行讀取操作之前調用 sync() 方法,使得讀操作的連接所連的 zookeeper 實例能與 leader 進行同步,從而能讀到最新的類容。
  1. watcher 監聽 客戶端如果對一個節點註冊 watcher 監聽,那麼當該節點的內容或其子節點發生變更時,zookeeper 服務器會向訂閱的客戶端發送變更通知。

  2. 臨時節點 對在 zookeeper 上創建的臨時節點,一旦客戶端與服務器之間的會話失效,那麼該臨時節點就被自動清除。

  3. 順序節點 客戶端申請創建該節點時 zookeeper 會自動在節點路徑末尾添加遞增序號

應用場景

  1. 數據訂閱發佈 將應用中的配置信息放在 zookeeper 中集中管理。應用在啓動時主動到zk服務端進行一次配置信息的獲取,同時在指定節點註冊一個 watcher 監聽。這樣只要配置信息發生變更,服務端都會實時通知到所有訂閱的客戶端。

  2. 域名服務 將域名配置信息放在 zookeeper 上,對外提供一套域名註冊、域名解析、域名可用性檢測的服務。基於此提供一套動態的 DNS 服務。

  3. 全局唯一 ID 可以利用順序節點的特性生成全局唯一的 ID。

  4. 分佈式協調通知 利用 watcher 監聽實現系統間的協調和通知,從而實現數據變更的處理。不同客戶端都對 zookeeper 上同一個數據節點進行 watcher 註冊,如果數據節點發生變化,那麼所有訂閱的客戶端都能受到通知。

  5. Master 選舉 利用 zookeeper 創建節點時的強一致性,由客戶端集羣定時往 zookeeper 上創建同一個名字的臨時節點。在這個過程中只有一個客戶端能夠創建成功,那麼該客戶端就成了 Master,同時其他沒有創建成功的客戶端都在該節點註冊一個節點變更的 watcher,用於監控當前 Master 機器是否存活,一旦發現 Master 掛掉其餘客戶端重新進行 Master 選舉。

  6. 分佈式鎖

  • 排他鎖 利用強一致性,將 zookeeper 上的一個臨時節點表示爲一個排他鎖,所有客戶端同時創建該節點,最終只有一個客戶端能創建成功,那麼就認爲該客戶端獲得了鎖,同時註冊該節點的 watcher 監聽。當移除該節點就認爲釋放了鎖。

  • 共享鎖 利用強一致性,將 zookeeper 上的一個臨時順序節點表示爲一個共享鎖,並註冊同級子節點的 watcher 監聽。判斷讀寫順序時根據不同需求關注比自己序號小的同級子節點類型。

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