【原汁原味】ZooKeeper 概覽(一)

內(nèi)容翻譯自官方文檔

Because Coordinating Distributed Systems is a Zoo

概覽

ZooKeeper 是一種分布式、開源的協(xié)同服務(wù)。它暴露了一組簡單的原語,分布式應(yīng)用程序可以基于該原語組,實(shí)現(xiàn)更高級的服務(wù),如同步、配置維護(hù)、組別和命名。它是一種編程友好型的設(shè)計(jì),并采用大家熟悉的文件系統(tǒng)的目錄樹結(jié)構(gòu)作為數(shù)據(jù)模型,可以用 Java 運(yùn)行,也可以和 C 綁定。

協(xié)同服務(wù)很難正確運(yùn)行,經(jīng)常出現(xiàn)競爭危害和死鎖。ZooKeeper 的目的就是降低協(xié)同服務(wù)實(shí)現(xiàn)與維護(hù)的成本。

設(shè)計(jì)目標(biāo)

易用性,ZooKeeper 允許分布式進(jìn)程通過與標(biāo)準(zhǔn)文件系統(tǒng)類似的共享層次命名空間互相協(xié)同。命名空間由數(shù)據(jù)節(jié)點(diǎn)(znodes)組成,類似于文件與目錄。與專為存儲設(shè)計(jì)的典型文件系統(tǒng)不同,ZooKeeper的數(shù)據(jù)都保存在內(nèi)存中,以獲得高吞吐和低時延的特性。

ZooKeeper實(shí)現(xiàn)了高性能、高可用和嚴(yán)格有序。高性能意味著可以被應(yīng)用在大型分布式系統(tǒng),高可用則避免了單點(diǎn)故障的風(fēng)險,嚴(yán)格有序保證了復(fù)雜的同步原語可以在客戶端實(shí)現(xiàn)。

可復(fù)制,就像它所協(xié)同的分布式進(jìn)程一樣,ZooKeeper 的組件也是可復(fù)制的。

ZooKeeper 服務(wù)

構(gòu)成 ZooKeeper 服務(wù)的服務(wù)器必須互相感知,它們各自維護(hù)了一張相同的內(nèi)存狀態(tài)鏡像,以及持久存儲的事務(wù)日志與快照,只要大部分的服務(wù)器可用,ZooKeeper 的服務(wù)就可以正常運(yùn)行。

客戶端會維護(hù)與某一臺 ZooKeeper 服務(wù)器的 TCP 長連接,并通過該連接進(jìn)行請求發(fā)送,響應(yīng)接收,監(jiān)聽事件獲取與心跳檢測。如果當(dāng)前 TCP 長連接斷開,客戶端會向另一臺服務(wù)器發(fā)起連接請求。

有序性,ZooKeeper 為每一次更新標(biāo)記了一個序號,以反映所有事務(wù)的順序。后續(xù)操作可以使用該序號實(shí)現(xiàn)更高級的抽象,例如同步原語。

速度快,ZooKeeper 在“讀頻繁”工作流中表現(xiàn)非常快,在數(shù)千臺集群中運(yùn)行,讀寫比為 10:1 時,性能最好。

數(shù)據(jù)模型與層次命名空間

ZooKeeper 提供的命名空間類似于標(biāo)準(zhǔn)文件系統(tǒng),名稱是以斜杠(/)分隔的路徑元素序列。ZooKeeper 命名空間中的每個節(jié)點(diǎn)都有唯一的路徑標(biāo)識。


ZooKeeper 層次命名空間

不同于標(biāo)準(zhǔn)文件系統(tǒng),ZooKeeper 命名空間中的每個節(jié)點(diǎn)都可以持有數(shù)據(jù)與子節(jié)點(diǎn)(文件亦是目錄)。ZooKeeper 被設(shè)計(jì)用于存儲協(xié)同數(shù)據(jù),如狀態(tài)信息,配置,位置信息等,因此存儲在每個節(jié)點(diǎn)上的數(shù)據(jù)量都比較小,一般不到1KB。接下來,我們采用術(shù)語 znode 表明我們正在談?wù)?ZooKeeper 中的數(shù)據(jù)節(jié)點(diǎn)。

znode 維護(hù)一了個統(tǒng)計(jì)結(jié)構(gòu),其中包含數(shù)據(jù)變更,ACL變更與時間戳的版本號,以允許緩存驗(yàn)證和協(xié)調(diào)更新。每次 znode 的數(shù)據(jù)發(fā)生變化時,它的版本號都會增加。例如,每當(dāng)客戶端檢索數(shù)據(jù)時,它也會收到該數(shù)據(jù)的版本信息。

命名空間中每個 znode 存儲的數(shù)據(jù),都以原子方式進(jìn)行讀取與寫入。讀取將獲得該 znode 關(guān)聯(lián)的所有數(shù)據(jù)字節(jié),寫入則替換所有數(shù)據(jù)。每個節(jié)點(diǎn)都有一個訪問控制列表(ACL),它限制誰可以做什么。

ZooKeeper 還提供了一種臨時節(jié)點(diǎn),它們的生命周期取決于創(chuàng)建它們的會話(session),當(dāng)會話結(jié)束時,臨時節(jié)點(diǎn)將會被刪除。

條件更新與監(jiān)聽

ZooKeeper 支持監(jiān)聽功能??蛻舳丝梢栽?znode 上設(shè)置一個監(jiān)聽器,當(dāng) znode 發(fā)生變更時,監(jiān)聽器將被觸發(fā)并移除,與此同時,客戶端將收到一個表示 znode 變更的數(shù)據(jù)包。此外,如果客戶端與 ZooKeeper 服務(wù)器的 TCP 連接斷開時,客戶端將收到一個本地通知。

保證

ZooKeeper 既簡單又快速,由于其目標(biāo)是提供基礎(chǔ)原語,以構(gòu)建更為復(fù)雜的服務(wù),因此,它提供了一系列的保證。

順序一致性,客戶端的更新將按照他們發(fā)送的順序執(zhí)行;

原子性,更新成功或失敗,沒有中間狀態(tài);

單一系統(tǒng)映像,無論客戶端連接的是哪一臺服務(wù)器,它們看到的服務(wù)視圖都是相同的;

可靠性,一旦更新成功,它將一直持續(xù)到被下一個客戶端更新覆蓋;

及時性,客戶端看到的系統(tǒng)視圖,在一定時間范圍內(nèi)保證是最新的。

簡單 API

ZooKeeper 的設(shè)計(jì)目標(biāo)之一是提供非常簡單的可編程接口,因此,它只提供如下操作:

創(chuàng)建(creat),在目錄樹中某個位置創(chuàng)建一個節(jié)點(diǎn);

刪除(delete),刪除一個節(jié)點(diǎn);

存在性檢查(exists),測試節(jié)點(diǎn)是否存在于某個位置;

獲取數(shù)據(jù)(get data),從節(jié)點(diǎn)中讀取數(shù)據(jù);

設(shè)置數(shù)據(jù)(set data),向節(jié)點(diǎn)中寫入數(shù)據(jù);

獲取子節(jié)點(diǎn)(get children),檢索節(jié)點(diǎn)的子節(jié)點(diǎn)列表;

同步(sync),等待數(shù)據(jù)傳播。

實(shí)現(xiàn)

下圖展示了 ZooKeeper 服務(wù)的高級組件。除了請求處理器之外,組成 ZooKeeper 服務(wù)的每個服務(wù)器都會對自身的組件進(jìn)行復(fù)制備份。


ZooKeeper 組件

復(fù)制數(shù)據(jù)庫是包含完整數(shù)據(jù)樹的內(nèi)存數(shù)據(jù)庫,它將更新記錄到磁盤以獲取可恢復(fù)性,并將寫入數(shù)據(jù)也序列化到磁盤上,然后再更新內(nèi)存數(shù)據(jù)庫。

每個 ZooKeeper 服務(wù)器都為客戶端提供服務(wù)。客戶端需要連接到一個服務(wù)器上,才能提交請求??蛻舳说淖x請求,實(shí)際上是請求存儲在本地的服務(wù)端數(shù)據(jù)庫的備份。服務(wù)狀態(tài)更改請求與寫入請求則是通過一種[一致性協(xié)議]()處理。

一致性協(xié)議規(guī)定了所有客戶端寫請求都將被轉(zhuǎn)發(fā)至單個服務(wù)器,即領(lǐng)導(dǎo)節(jié)點(diǎn)(Leader)。其他的 ZooKeeper 服務(wù)器被稱為 追隨者(Followers),它們接收來自 Leader 的消息提議,然后對消息的傳遞進(jìn)行表決。消息傳遞層負(fù)責(zé)將 Followers 同步給 Leader,并在 Leader 發(fā)生故障時暫代履責(zé)。

ZooKeeper 使用自定義的原子消息協(xié)議,由于消息層是原子的,因此可以保證 ZooKeeper 的本地副本不會發(fā)散(保持統(tǒng)一),當(dāng) Leader 收到寫請求時,它會計(jì)算寫請求執(zhí)行時的系統(tǒng)狀態(tài)是什么,并將其轉(zhuǎn)換成捕獲該新狀態(tài)的事務(wù)操作。

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

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

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