信息飛速膨脹,不少應用沒法依賴單個服務器處理龐大的數據量。因爲分佈式系統和應用能夠提供更強的計算能力,還能更好地容災和擴展,因此逐漸受到青睞。node
在開發分佈式應用時,一般須要花費大量時間和精力來處理異構系統中的協做通訊問題。shell
ZooKeeper 專一於任務協做,能爲大型分佈式系統提供可靠的協做處理能力,簡化開發流程,讓開發人員更專一於應用自己的邏輯。數據庫
ZooKeeper 具備 C-S 結構,在使用時,開發的應用能夠看作爲鏈接到 ZooKeeper 服務器的客戶端,經過客戶端 API 進行操做,保障強一致性、有序性和持久性,具備實現同步原語的能力,提供簡單的併發處理機制。常見的用法如:選舉主節點、崩潰檢測、存儲元數據等。apache
注意,ZooKeeper 不適用於海量信息存儲,設計應用時最好將應用數據與協同數據分開,使用數據庫、分佈式文件系統等存儲應用數據。數組
由若干條指令組成,用於完成特定功能的過程稱爲原語。服務器
爲了保證靈活性,ZooKeeper 不直接提供原語,而是暴露出相似文件系統的 API,讓開發人員經過 API 實現本身的原語,一般使用菜譜( recipes )來表示原語的實現。session
ZooKeeper 操做和維護的爲一個個數據節點,稱爲 znode,採用相似文件系統的層級樹狀結構進行管理。若是 znode 節點包含數據則存儲爲字節數組(byte array)。併發
ZooKeeper 暴露以下 API:分佈式
create /path data
建立節點幷包含數據delete /path
刪除節點exists /path
檢查節點是否存在setData /path data
設置節點數據getData /path
獲取節點數據getChildren /path
獲取子節點列表ZooKeeper 不容許局部讀取或寫入數據,讀取時會將節點數據所有讀取,寫入時會整個替換。ui
建立 znode 時須要指定節點類型,節點的類型會影響其行爲方式。
znode 分爲持久節點和臨時節點。持久節點只有經過調用 delete API 才能刪除;臨時節點在客戶端崩潰或關閉與 ZooKeeper 服務器鏈接時就會被刪除,調用 delete API 也能刪除臨時節點。
znode 可設置爲有序節點。有序節點在建立時會分配一個整數序號追加到路徑以後,如建立 /tasks/task- 有序節點,追加整數後節點路徑爲 /tasks/task-1 。
綜上,znode 共有 4 種類型,分別爲:持久(無序)、臨時(無序)、持久有序和臨時有序。
ZooKeeper 一般以遠程服務的方式被訪問,在數據不發生變化時頻繁地訪問代價較大,ZooKeeper 的通知機制能夠代替客戶端的輪訓。
客戶端經過設置監視點(watcher)向 ZooKeeper 註冊須要接收通知的 znode,在 znode 發生變化時 ZooKeeper 向客戶端發送消息。
通知機制是單次觸發的操做,如需不斷監聽 znode 的變化,須要在接收到 znode 變動時設置新的監視點。
監視點有多種類型,如監控 znode 數據變化、監控 znode 子節點變化、監控 znode 建立或刪除。
每一個 znode 都有一個隨數據變化而自增的版本號,多個寫入操做會有條件的執行。寫入操做會將版本號做爲參數,當與服務器上版本號一致時纔會調用成功,這點在多個客戶端對同一個 znode 進行操做時很重要。
只有一臺單獨的 ZooKeeper 服務器時爲獨立模式,狀態沒法複製。具備一組 ZooKeeper 服務器時爲仲裁模式,仲裁模式下各個服務器間進行狀態的複製,同時服務於客戶端的請求。
仲裁模式下,若是讓客戶端等待全部服務器完成數據保存再繼續,延遲問題就會很大,ZooKeeper 經過法定人數肯定工做時必須有效運行的服務器最小數量。若是有 5 臺服務器,任意 3 臺服務器保存了數據,客戶端就能夠繼續工做。其餘 2 臺服務器最終也會捕獲到數據進行保存。
服務器的個數應該爲奇數,若有 5 臺服務器,則最多容許 2 臺崩潰。假如服務器個數爲偶數,容許崩潰的服務器數量不會增長,法定人數卻更大,須要更多的確認操做。
開始使用 ZooKeeper 以前,須要 下載 ZooKeeper 發行包 。解壓 tar 格式的壓縮文件,bin 目錄下有啓動 ZooKeeper 的腳本,conf 目錄下存放着 ZooKeeper 的配置文件,lib 目錄下存放着一些運行所需的第三方文件。
在 ZooKeeper 目錄下執行如下命令啓動 ZooKeeper 服務器。
$ bin/zkServer.sh start
$ bin/zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls / [zookeeper]
[zk: localhost:2181(CONNECTED) 1] create /test "" Created /test [zk: localhost:2181(CONNECTED) 2] ls / [zookeeper, test]
[zk: localhost:2181(CONNECTED) 3] delete /test [zk: localhost:2181(CONNECTED) 4] ls / [zookeeper]
[zk: localhost:2181(CONNECTED) 5] quit Quitting... 2018-05-02 15:58:34,004 [myid:] - INFO [main:ZooKeeper@684] - Session: 0x1630a0cdc400001 closed 2018-05-02 15:58:34,006 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread@519] - EventThread shut down for session: 0x1630a0cdc400001
$ bin/zkServer.sh stop