角色 zookeeper 集羣中的節點共有三種角色,每一個節點同時只能是一種角色。集羣中的全部機器經過一個 Leader 選舉過程來選定一臺被稱爲 Leader 的機器。 Leader:接受全部 Follower 的提案請求並統一協調發起提案的投票,負責與全部的 Follower 進行內部的數據交換 Follower:直接爲客戶端服務並參與提案的投票,同時與 Leader 進行數據交換 Observer:直接爲客戶端服務但不參與提案的投票,同時也與 Leader 進行數據交換html
會話 zookeeper 中客戶端啓動時會與服務器創建一個 TCP 鏈接,從第一次鏈接創建開始,客戶端會話的生命週期就開始了,經過這個鏈接,客戶端可以經過心跳檢測與服務器保持有效的會話,也可以向服務器發送請求並接受響應,還可以接收來自服務器的 watch 事件通知。算法
節點 通常在分佈式語境下的節點是指組成集羣的每一臺服務器,在 zookeeper 中還有另一層意思,稱之爲數據節點(ZNode)。 zookeeper 的整個名字空間的結構是層次化的,和 Linux 文件系統結構類似,是一顆樹。名字空間的層次由斜槓(/)來進行分割,在名稱空間裏面的每個節點的名字空間由這個結點的路徑來肯定。 每一個 ZNode 上都會保存本身的數據內容,同時還會保存一系列屬性信息。apache
版本 對於每一個 ZNode ,zookeeper 都會爲它維護一個叫 Stat 的數據結構,Stat 中記錄了 ZNode 的三個數據版本,version(當前ZNode數據內容的版本號)、cversion(當前ZNode子節點的版本號)、aversion(當前ZNode的ACL變動版本號)服務器
watcher zookeeper 容許用戶在指定節點上註冊一些 watcher,而且在特定事件觸發的時候,zookeeper 服務端會將事件通知到感興趣的客戶端,該機制是 zookeeper 實現分佈式協調服務的重要特性。網絡
這裏列出經常使用的客戶端命令,所謂客戶端命令指使用 zkCli 鏈接到 zookeeper 服務器以後使用的命令,zkCli 鏈接的語法以下: zkCli -server host:port cmd args zkCli 是客戶端可執行文件名,根據具體操做系統環境多是 zkCli.sh 或 zkCli.cmd host 是服務器IP或域名,port 是服務器端口號,若是有多個服務器地址則用逗號分隔 cmd 是具體命令、args 是命令的參數,也能夠鏈接上服務器以後再執行命令。session
查看節點 ls /path 查看名爲 /path 的子節點,但只能查看指定節點下的第一級的全部子節點。 ls2 /path 查看名爲 /path 的子節點,而且能看到更新次數等屬性信息。數據結構
建立節點 create [-s] [-e] /path data 建立一個名叫 /path 的節點,幷包含數據 data。加上 -s 表示建立的是順序節點,加上 -e 表示建立的是臨時節點,若是都不加則默認爲建立持久節點。併發
刪除節點 delete /path 刪除名爲 /path 的節點運維
設置節點數據 set /path data 設置名爲 /path 的節點的數據爲 data分佈式
返回節點數據 get /path 返回名爲 /path 的節點的數據和屬性信息
強制同步數據 sync /path 將名爲 /path 的節點強制同步爲最新的數據
幫助信息 help 幫助命令,顯示客戶端支持的命令及語法格式
退出 quit 退出當前客戶端,會話結束。
zookeeper 提供了一些四字命令用於獲取 zookeeper 服務端的當前狀態及相關信息,這些命令在系統運維時頗有用。用戶在客戶端能夠經過 telnet 或 nc 向zookeeper 提交相應的命令,好比 nc 方式: echo cmd|nc host port cmd 是具體的命令(由於通常是四個字母因此又叫作四字命令),host 是zookeeper 服務器 IP 地址或域名,port 是 zookeeper 端口號
conf 顯示服務配置的詳細信息,好比數據文件目錄、日誌文件目錄、間隔單位時間、選舉算法、選舉端口等。
cons 列出全部鏈接到服務器的客戶端的徹底的鏈接/會話的詳細信息。包括」接受 / 發送」的包數量、會話 id 、操做延遲、最後的操做執行等。
crst 重置全部鏈接。
dump 列出未經處理的會話和臨時節點。
envi 顯示關於服務器環境的詳細信息,好比 zookeeper 版本、操做系統版本、jdk 地址等。
reqs 列出未經處理的請求。
ruok 測試服務是否處於正確狀態。若是確實如此,那麼服務返回「imok 」,不然不作任何相應。
stat 輸出關於性能和鏈接的客戶端的列表。
wchs 列出服務器 watch 的詳細信息。
wchc 經過 session 列出服務器 watch 的詳細信息,它的輸出是一個與 watch 相關的會話的列表。
wchp 經過路徑列出服務器 watch 的詳細信息,它的輸出是一個與 session 相關的路徑。
上面列出的是一些經常使用的四字命令,更詳細信息能夠參考zookeeper的官方文檔,裏面的【ZooKeeper Commands】一節有具體介紹。
watcher 監聽 客戶端若是對一個節點註冊 watcher 監聽,那麼當該節點的內容或其子節點發生變動時,zookeeper 服務器會向訂閱的客戶端發送變動通知。
臨時節點 對在 zookeeper 上建立的臨時節點,一旦客戶端與服務器之間的會話失效,那麼該臨時節點就被自動清除。
順序節點 客戶端申請建立該節點時 zookeeper 會自動在節點路徑末尾添加遞增序號
數據訂閱發佈 將應用中的配置信息放在 zookeeper 中集中管理。應用在啓動時主動到zk服務端進行一次配置信息的獲取,同時在指定節點註冊一個 watcher 監聽。這樣只要配置信息發生變動,服務端都會實時通知到全部訂閱的客戶端。
域名服務 將域名配置信息放在 zookeeper 上,對外提供一套域名註冊、域名解析、域名可用性檢測的服務。基於此提供一套動態的 DNS 服務。
全局惟一 ID 能夠利用順序節點的特性生成全局惟一的 ID。
分佈式協調通知 利用 watcher 監聽實現系統間的協調和通知,從而實現數據變動的處理。不一樣客戶端都對 zookeeper 上同一個數據節點進行 watcher 註冊,若是數據節點發生變化,那麼全部訂閱的客戶端都能受到通知。
Master 選舉 利用 zookeeper 建立節點時的強一致性,由客戶端集羣定時往 zookeeper 上建立同一個名字的臨時節點。在這個過程當中只有一個客戶端可以建立成功,那麼該客戶端就成了 Master,同時其餘沒有建立成功的客戶端都在該節點註冊一個節點變動的 watcher,用於監控當前 Master 機器是否存活,一旦發現 Master 掛掉其他客戶端從新進行 Master 選舉。
分佈式鎖
排他鎖 利用強一致性,將 zookeeper 上的一個臨時節點表示爲一個排他鎖,全部客戶端同時建立該節點,最終只有一個客戶端能建立成功,那麼就認爲該客戶端得到了鎖,同時註冊該節點的 watcher 監聽。當移除該節點就認爲釋放了鎖。
共享鎖 利用強一致性,將 zookeeper 上的一個臨時順序節點表示爲一個共享鎖,並註冊同級子節點的 watcher 監聽。判斷讀寫順序時根據不一樣需求關注比本身序號小的同級子節點類型。