在深入了解ZooKeeper的運(yùn)作之前,讓我們來(lái)看看ZooKeeper的基本概念。我們將在本章中討論以下主題:
1、Architecture(架構(gòu))
2、Hierarchical namespace(層次命名空間)
3、Session(會(huì)話)
4、Watches(監(jiān)視)
看看下面的圖表。它描述了ZooKeeper的“客戶端-服務(wù)器架構(gòu)”。
作為ZooKeeper架構(gòu)的一部分的每個(gè)組件在下表中進(jìn)行了說(shuō)明。
部分 | 描述 |
---|---|
Client(客戶端) | 客戶端,我們的分布式應(yīng)用集群中的一個(gè)節(jié)點(diǎn),從服務(wù)器訪問(wèn)信息。對(duì)于特定的時(shí)間間隔,每個(gè)客戶端向服務(wù)器發(fā)送消息以使服務(wù)器知道客戶端是活躍的。 類似地,當(dāng)客戶端連接時(shí),服務(wù)器發(fā)送確認(rèn)碼。如果連接的服務(wù)器沒(méi)有響應(yīng),客戶端會(huì)自動(dòng)將消息重定向到另一個(gè)服務(wù)器。 |
Server(服務(wù)器) | 服務(wù)器,我們的ZooKeeper總體中的一個(gè)節(jié)點(diǎn),為客戶端提供所有的服務(wù)。向客戶端發(fā)送確認(rèn)碼以告知服務(wù)器是活躍的。 |
Ensemble | ZooKeeper服務(wù)器組。形成ensemble所需的最小節(jié)點(diǎn)數(shù)為3。 |
Leader | 服務(wù)器節(jié)點(diǎn),如果任何連接的節(jié)點(diǎn)失敗,則執(zhí)行自動(dòng)恢復(fù)。Leader在服務(wù)啟動(dòng)時(shí)被選舉。 |
Follower | 跟隨leader指令的服務(wù)器節(jié)點(diǎn)。 |
下圖描述了用于內(nèi)存表示的ZooKeeper文件系統(tǒng)的樹(shù)結(jié)構(gòu)。ZooKeeper節(jié)點(diǎn)稱為 znode 。每個(gè)znode由一個(gè)名稱標(biāo)識(shí),并用路徑(/)序列分隔。
在圖中,首先有一個(gè)由“/”分隔的znode。在根目錄下,你有兩個(gè)邏輯命名空間 config 和 workers 。
config 命名空間用于集中式配置管理,workers 命名空間用于命名。
在 config 命名空間下,每個(gè)znode最多可存儲(chǔ)1MB的數(shù)據(jù)。這與UNIX文件系統(tǒng)相類似,除了父znode也可以存儲(chǔ)數(shù)據(jù)。這種結(jié)構(gòu)的主要目的是存儲(chǔ)同步數(shù)據(jù)并描述znode的元數(shù)據(jù)。此結(jié)構(gòu)稱為 ZooKeeper數(shù)據(jù)模型。
Znode兼具文件和目錄兩種特點(diǎn)。既像文件一樣維護(hù)著數(shù)據(jù)長(zhǎng)度、元信息、ACL、時(shí)間戳等數(shù)據(jù)結(jié)構(gòu),又像目錄一樣可以作為路徑標(biāo)識(shí)的一部分。每個(gè)Znode由三個(gè)部分組成:
版本號(hào) - 每個(gè)znode都有版本號(hào),這意味著每當(dāng)與znode相關(guān)聯(lián)的數(shù)據(jù)發(fā)生變化時(shí),其對(duì)應(yīng)的版本號(hào)也會(huì)增加。當(dāng)多個(gè)zookeeper客戶端嘗試在同一znode上執(zhí)行操作時(shí),版本號(hào)的使用就很重要。
操作控制列表(ACL) - ACL基本上是訪問(wèn)znode的認(rèn)證機(jī)制。它管理所有znode讀取和寫入操作。
時(shí)間戳 - 時(shí)間戳表示創(chuàng)建和修改znode所經(jīng)過(guò)的時(shí)間。它通常以毫秒為單位。ZooKeeper從“事務(wù)ID"(zxid)標(biāo)識(shí)znode的每個(gè)更改。Zxid 是唯一的,并且為每個(gè)事務(wù)保留時(shí)間,以便你可以輕松地確定從一個(gè)請(qǐng)求到另一個(gè)請(qǐng)求所經(jīng)過(guò)的時(shí)間。
數(shù)據(jù)長(zhǎng)度 - 存儲(chǔ)在znode中的數(shù)據(jù)總量是數(shù)據(jù)長(zhǎng)度。你最多可以存儲(chǔ)1MB的數(shù)據(jù)。
Znode被分為持久(persistent)節(jié)點(diǎn),順序(sequential)節(jié)點(diǎn)和臨時(shí)(ephemeral)節(jié)點(diǎn)。
持久節(jié)點(diǎn) - 即使在創(chuàng)建該特定znode的客戶端斷開(kāi)連接后,持久節(jié)點(diǎn)仍然存在。默認(rèn)情況下,除非另有說(shuō)明,否則所有znode都是持久的。
臨時(shí)節(jié)點(diǎn) - 客戶端活躍時(shí),臨時(shí)節(jié)點(diǎn)就是有效的。當(dāng)客戶端與ZooKeeper集合斷開(kāi)連接時(shí),臨時(shí)節(jié)點(diǎn)會(huì)自動(dòng)刪除。因此,只有臨時(shí)節(jié)點(diǎn)不允許有子節(jié)點(diǎn)。如果臨時(shí)節(jié)點(diǎn)被刪除,則下一個(gè)合適的節(jié)點(diǎn)將填充其位置。臨時(shí)節(jié)點(diǎn)在leader選舉中起著重要作用。
順序節(jié)點(diǎn) - 順序節(jié)點(diǎn)可以是持久的或臨時(shí)的。當(dāng)一個(gè)新的znode被創(chuàng)建為一個(gè)順序節(jié)點(diǎn)時(shí),ZooKeeper通過(guò)將10位的序列號(hào)附加到原始名稱來(lái)設(shè)置znode的路徑。例如,如果將具有路徑 /myapp 的znode創(chuàng)建為順序節(jié)點(diǎn),則ZooKeeper會(huì)將路徑更改為 /myapp0000000001 ,并將下一個(gè)序列號(hào)設(shè)置為0000000002。如果兩個(gè)順序節(jié)點(diǎn)是同時(shí)創(chuàng)建的,那么ZooKeeper不會(huì)對(duì)每個(gè)znode使用相同的數(shù)字。順序節(jié)點(diǎn)在鎖定和同步中起重要作用。
會(huì)話對(duì)于ZooKeeper的操作非常重要。會(huì)話中的請(qǐng)求按FIFO順序執(zhí)行。一旦客戶端連接到服務(wù)器,將建立會(huì)話并向客戶端分配會(huì)話ID 。
客戶端以特定的時(shí)間間隔發(fā)送心跳以保持會(huì)話有效。如果ZooKeeper集合在超過(guò)服務(wù)器開(kāi)啟時(shí)指定的期間(會(huì)話超時(shí))都沒(méi)有從客戶端接收到心跳,則它會(huì)判定客戶端死機(jī)。
會(huì)話超時(shí)通常以毫秒為單位。當(dāng)會(huì)話由于任何原因結(jié)束時(shí),在該會(huì)話期間創(chuàng)建的臨時(shí)節(jié)點(diǎn)也會(huì)被刪除。
監(jiān)視是一種簡(jiǎn)單的機(jī)制,使客戶端收到關(guān)于ZooKeeper集合中的更改的通知。客戶端可以在讀取特定znode時(shí)設(shè)置Watches。Watches會(huì)向注冊(cè)的客戶端發(fā)送任何znode(客戶端注冊(cè)表)更改的通知。
Znode更改是與znode相關(guān)的數(shù)據(jù)的修改或znode的子項(xiàng)中的更改。只觸發(fā)一次watches。如果客戶端想要再次通知,則必須通過(guò)另一個(gè)讀取操作來(lái)完成。當(dāng)連接會(huì)話過(guò)期時(shí),客戶端將與服務(wù)器斷開(kāi)連接,相關(guān)的watches也將被刪除。
更多建議: