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