分布式協調服務zookeeper知多少
zookeeper簡介
由于之前了解一個分布式框架(dubbo)時,其中涉及到zookeeper,因此今天就先來大概的介紹一下zookeeper。zookeeper是一個用來管理大量的主機的分布式協調服務。
(一) 分布式應用程序
分布式應用程序可以通過在它們之間協調以完成特定的任務,快速且有效的方式在多個系統中的網絡在給定時間(同時)運行
分布式應用程序有兩部分,分別是:服務器和客戶端應用程序。如下圖所示:
(二) 分布式應用程序的優點
可靠性 可擴展性 透明性
(三) zookeeper提供的服務
命名服務 配置管理 集群管理 節點領導者選舉 鎖定和同步服務 數據注冊表
ZooKeeper基礎
(一) ZooKeeper的體系結構
描繪ZooKeeper 的“客戶端 – 服務器架構,如下圖所示
ZooKeeper 架構的一部分組件如下表中所解釋。
1. Client:客戶端,發送消息到服務器。
2. Server:服務器,ZooKeeper集成的一個節點,提供所有的服務給客戶。
3. 合組:ZooKeeper 服務器組。
4. Leader:它執行自動恢復,如果任何連接的節點的故障的服務器節點。
5. Follower:遵循領導指示服務器節點
(二) 分層命名空間
下圖顯示了用于內存中表示 ZooKeeper 文件系統的樹形結構。 ZooKeeper節點被稱為znode。每個znode由一個名稱識別,并通過路徑(/)序列隔開。
zookeeper名字空間由節點znode構成,其組織方式類似文件系統,其中各個節點相當于目錄和文件,通過路徑作為唯一標識。與文件系統不同的是,每個節點具有與之對應的數據內容,同時也可以具有子節點。在 ZooKeeper 數據模型中每個 znode 維護一個 stat 結構。 一個統計(stat )只是提供了一個 znode 元數據。 它由版本號、動作控制列表(ACL)、時間戳、數據長度組成。
ZooKeeper組件
同一個zookeeper服務下的server有兩種,一種是leader server,另一種是follower server。leader特殊之處在于它有決定權。在zookeeper整個服務下的每臺server將復制各個組件。Replicated Database是包含了所有數據的內存數據庫
Zookeeper之leader
讓我們來分析一下一個領導節點在ZooKeeper集合的選舉。考慮集群中有N多的節點。領導人選舉的過程如下
所有節點創建一個順序,znode具有相同路徑,/app/leader/guid_。
ZooKeeper 的集合將追加的10位序列號的路徑。
對于給定的實例,它在znode創建最小數量的節點成為領導者以及所有其他節點的追隨者。
每一個追隨者節點監控下一個最小號的znode。
Zookeeper安裝配置
(一) 安裝Java(略)
(二) ZooKeeper框架的安裝
1. 下載并tar開解壓(略)
2. 創建配置文件
打開 并編輯conf/zoo.cfg 配置文件,并將以下所有參數設置為開始點。
1 2 3 4 5 | tickTime = 2000 dataDir = /path/to/zookeeper/data clientPort = 2181 initLimit = 10 syncLimit = 5 |
3. 啟動ZooKeeper服務器
1 | $ bin/zkServer.sh start |
4. 啟動 CLI
1 | $ bin/zkCli.sh |
5. 停止ZooKeeper服務器
1 | $ bin/zkServer.sh stop |
Zookeeper CLI
ZooKeeper 命令行界面(CLI)是用來與 ZooKeeper 集成作開發進行交互的。這是在調試和使用不同的選項時的工作有用。
為了執行ZooKeeper的CLI操作, ZooKeeper服務器首先要啟動 (“bin/zkServer.sh start”) , 然后使用 ZooKeeper 客戶端 (“bin/zkCli.sh”). 當客戶端啟動后,可以執行以下操作:(1)創建znodes,(2)獲取數據,(3)監視 znode 變化,(4)設置數據,(5)創建 znode 的子 znode,(6)列出一個 znode 的子 znode,(7)檢查狀態,(8)刪除一個 znode
(一) 創建Znodes
1 | create /path /data |
(二) 獲取數據
1 | get /path |
(三) 監視
1 | get /path [watch] 1 |
(四) 設置數據
1 | set /path /data |
(五) 創建子znode
1 | create /parent/path/subnode/path /data |
(六) 列出子znode
1 | ls /path |
(七) 檢查狀態
1 | stat /path |
(八) 刪除Znode
1 | rmr /path |
Zookeeper 常用API
ZooKeeper有一個Java和C綁定的官方API。ZooKeeper社區提供了對于大多數語言(.NET,Python等)的非官方API。使用ZooKeeper的API,應用程序可以連接,互動,操作數據,協調,以及從ZooKeeper集成斷開。
(一) ZooKeeper的API基礎知識
客戶端應遵循下面給出帶 ZooKeeper 集成一個清晰的交互步驟。
連接到ZooKeeper 。ZooKeeper 集成分配客戶端的會話ID。
定期發送心跳到服務器。否則,ZooKeeper 集成過期的會話ID,那么客戶端需要重新連接。
獲得/設置只要znodes會話ID是活動的。
從 ZooKeeper 集成斷開,當所有的任務都完成后。如果客戶端處于非活動狀態較長時間,那么 ZooKeeper 集成會自動斷開客戶機。
(二) Java綁定
讓我們這一章中理解最重要的ZooKeeper API。ZooKeeper API的中心部分是ZooKeeper 類。它提供了一些選項來連接 ZooKeeper 集成在其構造,有以下幾種方法
? connect ? 連接到 ZooKeeper 的集成
? create ? 創建一個 znode
? exists ? 檢查znode是否存在及其信息
? getData ? 從一個特定的znode獲取數據
? setData ? 設置數據在特定znode
? getChildren ? 得到一個特定 znode 的所有可用子節點
? delete ? 得到一個特定的 znode 及其所有子節點
? close ? 關閉連接
(三) 連接到 ZooKeeper 集合
ZooKeeper類通過它的構造函數提供了連接功能。構造函數如下:
1 | ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher) |
(四) 創建一個Znode
ZooKeeper類提供了一個方法來在集合 ZooKeeper 創建一個新的 znode。創建方法如下:
1 | create(String path, byte[] data, List<ACL> acl, CreateMode createMode) |
(五) Exists – 檢查一個Znode的存在
exists 方法來檢查 znode 的存在。如果指定的 znode 存在它返回一個 znode 元數據。exists 方法如下
1 | exists(String path, boolean watcher) |
(六) getData 方法
getData方法來獲取連接在指定 znode 及其狀態的數據。getData方法如下
1 | getData(String path, Watcher watcher, Stat stat) |
(七) setData 方法
SetData方法來修改附著在指定 znode 的數據。SetData方法如下
1 | setData(String path, byte[] data, int version) |
(八) getChildren 方法
getChildren方法來得到一個特定的 znode 所有子節點。getChildren 方法如下
1 | getChildren(String path, Watcher watcher) |
(九) 刪除一個Znode
delete 方法來刪除指定 znode。delete方法如下
1 | delete(String path, int version) |