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