分布式協(xié)調(diào)服務(wù)zookeeper知多少

zookeeper簡(jiǎn)介

由于之前了解一個(gè)分布式框架(dubbo)時(shí),其中涉及到zookeeper,因此今天就先來(lái)大概的介紹一下zookeeper。zookeeper是一個(gè)用來(lái)管理大量的主機(jī)的分布式協(xié)調(diào)服務(wù)。

(一) 分布式應(yīng)用程序

分布式應(yīng)用程序可以通過(guò)在它們之間協(xié)調(diào)以完成特定的任務(wù),快速且有效的方式在多個(gè)系統(tǒng)中的網(wǎng)絡(luò)在給定時(shí)間(同時(shí))運(yùn)行

分布式應(yīng)用程序有兩部分,分別是:服務(wù)器和客戶端應(yīng)用程序。如下圖所示:

(二) 分布式應(yīng)用程序的優(yōu)點(diǎn)

可靠性 可擴(kuò)展性 透明性

(三) zookeeper提供的服務(wù)

命名服務(wù) 配置管理 集群管理 節(jié)點(diǎn)領(lǐng)導(dǎo)者選舉 鎖定和同步服務(wù) 數(shù)據(jù)注冊(cè)表

ZooKeeper基礎(chǔ)

(一) ZooKeeper的體系結(jié)構(gòu)

描繪ZooKeeper 的“客戶端 – 服務(wù)器架構(gòu),如下圖所示

ZooKeeper 架構(gòu)的一部分組件如下表中所解釋。

1. Client:客戶端,發(fā)送消息到服務(wù)器。

2. Server:服務(wù)器,ZooKeeper集成的一個(gè)節(jié)點(diǎn),提供所有的服務(wù)給客戶。

3. 合組:ZooKeeper 服務(wù)器組。

4. Leader:它執(zhí)行自動(dòng)恢復(fù),如果任何連接的節(jié)點(diǎn)的故障的服務(wù)器節(jié)點(diǎn)。

5. Follower:遵循領(lǐng)導(dǎo)指示服務(wù)器節(jié)點(diǎn)

(二) 分層命名空間

下圖顯示了用于內(nèi)存中表示 ZooKeeper 文件系統(tǒng)的樹(shù)形結(jié)構(gòu)。 ZooKeeper節(jié)點(diǎn)被稱為znode。每個(gè)znode由一個(gè)名稱識(shí)別,并通過(guò)路徑(/)序列隔開(kāi)。

zookeeper名字空間由節(jié)點(diǎn)znode構(gòu)成,其組織方式類似文件系統(tǒng),其中各個(gè)節(jié)點(diǎn)相當(dāng)于目錄和文件,通過(guò)路徑作為唯一標(biāo)識(shí)。與文件系統(tǒng)不同的是,每個(gè)節(jié)點(diǎn)具有與之對(duì)應(yīng)的數(shù)據(jù)內(nèi)容,同時(shí)也可以具有子節(jié)點(diǎn)。在 ZooKeeper 數(shù)據(jù)模型中每個(gè) znode 維護(hù)一個(gè) stat 結(jié)構(gòu)。 一個(gè)統(tǒng)計(jì)(stat )只是提供了一個(gè) znode 元數(shù)據(jù)。 它由版本號(hào)、動(dòng)作控制列表(ACL)、時(shí)間戳、數(shù)據(jù)長(zhǎng)度組成。

ZooKeeper組件

同一個(gè)zookeeper服務(wù)下的server有兩種,一種是leader server,另一種是follower server。leader特殊之處在于它有決定權(quán)。在zookeeper整個(gè)服務(wù)下的每臺(tái)server將復(fù)制各個(gè)組件。Replicated Database是包含了所有數(shù)據(jù)的內(nèi)存數(shù)據(jù)庫(kù)

Zookeeper之leader

讓我們來(lái)分析一下一個(gè)領(lǐng)導(dǎo)節(jié)點(diǎn)在ZooKeeper集合的選舉??紤]集群中有N多的節(jié)點(diǎn)。領(lǐng)導(dǎo)人選舉的過(guò)程如下

所有節(jié)點(diǎn)創(chuàng)建一個(gè)順序,znode具有相同路徑,/app/leader/guid_。

ZooKeeper 的集合將追加的10位序列號(hào)的路徑。

對(duì)于給定的實(shí)例,它在znode創(chuàng)建最小數(shù)量的節(jié)點(diǎn)成為領(lǐng)導(dǎo)者以及所有其他節(jié)點(diǎn)的追隨者。

每一個(gè)追隨者節(jié)點(diǎn)監(jiān)控下一個(gè)最小號(hào)的znode。

Zookeeper安裝配置

(一) 安裝Java(略)

(二) ZooKeeper框架的安裝

1.下載并tar開(kāi)解壓(略)

2.創(chuàng)建配置文件

打開(kāi) 并編輯conf/zoo.cfg 配置文件,并將以下所有參數(shù)設(shè)置為開(kāi)始點(diǎn)。

tickTime = 2000

dataDir = /path/to/zookeeper/data

clientPort = 2181

initLimit = 10

syncLimit = 5

3. 啟動(dòng)ZooKeeper服務(wù)器

$ bin/zkServer.sh start

4. 啟動(dòng) CLI

$ bin/zkCli.sh

5. 停止ZooKeeper服務(wù)器

$ bin/zkServer.sh stop

Zookeeper CLI

ZooKeeper 命令行界面(CLI)是用來(lái)與 ZooKeeper 集成作開(kāi)發(fā)進(jìn)行交互的。這是在調(diào)試和使用不同的選項(xiàng)時(shí)的工作有用。

為了執(zhí)行ZooKeeper的CLI操作, ZooKeeper服務(wù)器首先要啟動(dòng) (“bin/zkServer.sh start”) , 然后使用 ZooKeeper 客戶端 (“bin/zkCli.sh”). 當(dāng)客戶端啟動(dòng)后,可以執(zhí)行以下操作:(1)創(chuàng)建znodes,(2)獲取數(shù)據(jù),(3)監(jiān)視 znode 變化,(4)設(shè)置數(shù)據(jù),(5)創(chuàng)建 znode 的子 znode,(6)列出一個(gè) znode 的子 znode,(7)檢查狀態(tài),(8)刪除一個(gè) znode

(一) 創(chuàng)建Znodes

create? /path /data

(二) 獲取數(shù)據(jù)

get? /path

(三) 監(jiān)視

get? /path [watch] 1

(四) 設(shè)置數(shù)據(jù)

set? /path /data

(五) 創(chuàng)建子znode

create? /parent/path/subnode/path /data

(六) 列出子znode

ls? /path

(七) 檢查狀態(tài)

stat? /path

(八) 刪除Znode

rmr? /path

Zookeeper 常用API

ZooKeeper有一個(gè)Java和C綁定的官方API。ZooKeeper社區(qū)提供了對(duì)于大多數(shù)語(yǔ)言(.NET,Python等)的非官方API。使用ZooKeeper的API,應(yīng)用程序可以連接,互動(dòng),操作數(shù)據(jù),協(xié)調(diào),以及從ZooKeeper集成斷開(kāi)。

(一) ZooKeeper的API基礎(chǔ)知識(shí)

客戶端應(yīng)遵循下面給出帶 ZooKeeper 集成一個(gè)清晰的交互步驟。

連接到ZooKeeper 。ZooKeeper 集成分配客戶端的會(huì)話ID。

定期發(fā)送心跳到服務(wù)器。否則,ZooKeeper 集成過(guò)期的會(huì)話ID,那么客戶端需要重新連接。

獲得/設(shè)置只要znodes會(huì)話ID是活動(dòng)的。

從 ZooKeeper 集成斷開(kāi),當(dāng)所有的任務(wù)都完成后。如果客戶端處于非活動(dòng)狀態(tài)較長(zhǎng)時(shí)間,那么 ZooKeeper 集成會(huì)自動(dòng)斷開(kāi)客戶機(jī)。

(二) Java綁定

讓我們這一章中理解最重要的ZooKeeper API。ZooKeeper API的中心部分是ZooKeeper 類。它提供了一些選項(xiàng)來(lái)連接 ZooKeeper 集成在其構(gòu)造,有以下幾種方法

?connect ? 連接到 ZooKeeper 的集成

?create ? 創(chuàng)建一個(gè) znode

?exists ? 檢查znode是否存在及其信息

?getData ? 從一個(gè)特定的znode獲取數(shù)據(jù)

?setData ? 設(shè)置數(shù)據(jù)在特定znode

?getChildren ? 得到一個(gè)特定 znode 的所有可用子節(jié)點(diǎn)

?delete ? 得到一個(gè)特定的 znode 及其所有子節(jié)點(diǎn)

?close ? 關(guān)閉連接

(三) 連接到 ZooKeeper 集合

ZooKeeper類通過(guò)它的構(gòu)造函數(shù)提供了連接功能。構(gòu)造函數(shù)如下:

ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher)

(四) 創(chuàng)建一個(gè)Znode

ZooKeeper類提供了一個(gè)方法來(lái)在集合 ZooKeeper 創(chuàng)建一個(gè)新的 znode。創(chuàng)建方法如下:

create(String path, byte[] data, List acl, CreateMode createMode)

(五) Exists – 檢查一個(gè)Znode的存在

exists 方法來(lái)檢查 znode 的存在。如果指定的 znode 存在它返回一個(gè) znode 元數(shù)據(jù)。exists 方法如下

exists(String path, boolean watcher)

(六) getData 方法

getData方法來(lái)獲取連接在指定 znode 及其狀態(tài)的數(shù)據(jù)。getData方法如下

getData(String path, Watcher watcher, Stat stat)

(七) setData 方法

SetData方法來(lái)修改附著在指定 znode 的數(shù)據(jù)。SetData方法如下

setData(String path, byte[] data, int version)

(八) getChildren 方法

getChildren方法來(lái)得到一個(gè)特定的 znode 所有子節(jié)點(diǎn)。getChildren 方法如下

getChildren(String path, Watcher watcher)

(九) 刪除一個(gè)Znode

delete 方法來(lái)刪除指定 znode。delete方法如下

delete(String path, int version)


本文原創(chuàng)首發(fā)于Cobub官網(wǎng)博客,作者:何才

如有轉(zhuǎn)載請(qǐng)注明作者和出處!

推薦一款開(kāi)源私有化部署的移動(dòng)應(yīng)用數(shù)據(jù)統(tǒng)計(jì)分析 系統(tǒng)Cobub Razor

項(xiàng)目地址:https://github.com/cobub/razor

開(kāi)源社區(qū)技術(shù)交流QQ群:194022996

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容