什么是 Apache ZooKeeper?
ZooKeeper 是一種分布式協(xié)調服務,用于管理大量主機。在分布式環(huán)境中協(xié)調和管理服務是一個復雜的過程。ZooKeeper通過其簡單的體系結構和API解決了這個問題。ZooKeeper 允許開發(fā)人員專注于核心應用程序邏輯,而無需擔心應用程序的分布式特性。
ZooKeeper 框架最初是在“Yahoo!”構建的?以簡單而可靠的方式訪問他們的應用程序。后來,Apache ZooKeeper 成為 Hadoop、HBase 和其他分布式框架使用的有組織的服務的標準。例如,Apache HBase 使用 ZooKeeper 來跟蹤分布式數據的狀態(tài)。本教程介紹了 ZooKeeper 的基礎知識,如何在分布式環(huán)境中安裝和部署 ZooKeeper 集群,最后以幾個使用 Java 編程的示例和示例應用程序結束。
ZooKeeper 的工作原理
如果您有一個跨越 500 臺或更多商用服務器的 Hadoop 集群,您將需要在名稱、組和同步服務、配置管理等方面對整個集群進行集中管理。其他使用 Hadoop 集群的開源項目需要跨集群服務。嵌入 ZooKeeper 意味著您不必從頭開始構建同步服務。與 ZooKeeper 的交互通過 Java™ 或 C 接口時間發(fā)生。
對于應用程序,ZooKeeper 通過在 ZooKeeper 服務器上的內存中維護狀態(tài)類型信息來提供跨節(jié)點同步的基礎設施。ZooKeeper 服務器保留整個系統(tǒng)狀態(tài)的副本,并將此信息保存在本地日志文件中。大型 Hadoop 集群由多個 ZooKeeper 服務器支持,主服務器同步頂級服務器。
在 ZooKeeper 中,應用程序可以創(chuàng)建所謂的 znode,它是一個持久存在于 ZooKeeper 服務器內存中的文件。znode 可以由集群中的任何節(jié)點更新,集群中的任何節(jié)點都可以注冊以接收該 znode 的更改通知。
簡而言之,應用程序可以通過更新它們在 ZooKeeper znode 中的狀態(tài)來跨分布式集群同步它們的任務。然后 znode 將特定節(jié)點的狀態(tài)更改通知集群的其余部分。這種集群范圍的狀態(tài)集中服務對于跨大型分布式服務器集的管理和序列化任務至關重要。
在進一步發(fā)展之前,重要的是我們了解分布式應用程序的一兩件事。因此,讓我們從分布式應用程序的快速概覽開始討論。
分布式應用
分布式應用程序可以在給定時間(同時)在網絡中的多個系統(tǒng)上運行,通過相互協(xié)調以快速有效的方式完成特定任務。通常,由非分布式應用程序(在單個系統(tǒng)中運行)需要數小時才能完成的復雜且耗時的任務可以通過分布式應用程序利用所有相關系統(tǒng)的計算能力在幾分鐘內完成。
通過將分布式應用程序配置為在更多系統(tǒng)上運行,可以進一步縮短完成任務的時間。運行分布式應用程序的一組系統(tǒng)稱為集群,集群中運行的每臺機器稱為節(jié)點。
分布式應用程序有兩部分,服務器和客戶端應用程序。服務器應用程序實際上是分布式的并且有一個通用的接口,這樣客戶端就可以連接到集群中的任何服務器并獲得相同的結果??蛻舳藨贸绦蚴桥c分布式應用程序交互的工具。
分布式應用程序的好處
- 可靠性- 單個或幾個系統(tǒng)的故障不會使整個系統(tǒng)出現(xiàn)故障。
- 可擴展性- 可以在需要時通過添加更多機器來提高性能,而無需停機即可對應用程序的配置進行微小更改。
- 透明度- 隱藏系統(tǒng)的復雜性,并將自身顯示為單個實體/應用程序。
分布式應用程序的挑戰(zhàn)
- 競爭條件- 兩臺或多臺機器嘗試執(zhí)行特定任務,實際上在任何給定時間只需要一臺機器完成。例如,共享資源在任何給定時間只能由一臺機器修改。
- 死鎖- 兩個或多個操作無限期地等待對方完成。
- 不一致- 數據部分失敗。
Apache ZooKeeper 的用途是什么?
Apache ZooKeeper 是集群(節(jié)點組)使用的一種服務,用于在它們之間進行協(xié)調并通過強大的同步技術維護共享數據。ZooKeeper 本身是一個分布式應用程序,為編寫分布式應用程序提供服務。
ZooKeeper 提供的常用服務如下 -
- 命名服務- 通過名稱識別集群中的節(jié)點。它類似于 DNS,但適用于節(jié)點。
- 配置管理-加入節(jié)點的系統(tǒng)的最新和最新配置信息。
- 集群管理- 實時加入/離開集群中的節(jié)點和節(jié)點狀態(tài)。
- 領導者選舉- 選舉一個節(jié)點作為領導者以進行協(xié)調。
- 鎖定和同步服務- 在修改數據時鎖定數據。此機制可幫助您在連接其他分布式應用程序(如Apache HBase)時進行自動故障恢復。
- 高度可靠的數據注冊表- 即使一個或幾個節(jié)點出現(xiàn)故障,數據的可用性。
分布式應用程序提供了很多好處,但它們也帶來了一些復雜且難以破解的挑戰(zhàn)。ZooKeeper 框架提供了一個完整的機制來克服所有挑戰(zhàn)。使用故障安全同步方法處理競爭條件和死鎖。另一個主要缺點是數據的不一致,ZooKeeper 使用atomicity 來解決。
使用ZooKeeper 的好處
以下是使用 ZooKeeper 的好處 -
- 簡單的分布式協(xié)調流程
- 同步- 服務器進程之間的相互排斥和合作。此過程有助于在 Apache HBase 中進行配置管理。
- 有序消息
- 序列化- 根據特定規(guī)則對數據進行編碼。確保您的應用程序始終如一地運行。這種方法可以在 MapReduce 中使用來協(xié)調隊列以執(zhí)行正在運行的線程。
- 可靠性
- 原子性- 數據傳輸要么成功要么完全失敗,但沒有事務是部分的。
在深入了解 ZooKeeper 的工作原理之前,讓我們先了解一下 ZooKeeper 的基本概念。我們將在本章中討論以下主題 -
- 建筑學
- 分層命名空間
- 會議
- 手表
ZooKeeper 的架構
看看下面的圖表。它描述了 ZooKeeper 的“客戶端-服務器架構”。
作為 ZooKeeper 架構一部分的每個組件都已在下表中進行了解釋。
部分 | 描述 |
---|---|
客戶 | 客戶端是我們分布式應用集群中的節(jié)點之一,從服務器訪問信息。在特定的時間間隔內,每個客戶端都會向服務器發(fā)送一條消息,讓服務器知道客戶端還活著。 類似地,服務器在客戶端連接時發(fā)送確認。如果連接的服務器沒有響應,客戶端會自動將消息重定向到另一臺服務器。 |
服務器 | 服務器是 ZooKeeper 集合中的節(jié)點之一,為客戶端提供所有服務。向客戶端發(fā)出確認以通知服務器處于活動狀態(tài)。 |
合奏 | ZooKeeper 服務器組。形成集成所需的最小節(jié)點數為 3。 |
領導 | 如果任何連接的節(jié)點發(fā)生故障,則執(zhí)行自動恢復的服務器節(jié)點。在服務啟動時選出領導者。 |
追隨者 | 遵循領導者指令的服務器節(jié)點。 |
分層命名空間
下圖描繪了用于內存表示的 ZooKeeper 文件系統(tǒng)的樹結構。ZooKeeper 節(jié)點稱為znode。每個 znode 都由一個名稱標識并由一系列路徑 (/) 分隔。
- 在圖中,首先你有一個用“/”分隔的根znode。在 root 下,您有兩個邏輯命名空間config和workers。
- 該配置命名空間用于集中配置管理和工人的命名空間用于命名。
- 在config命名空間下,每個 znode 最多可以存儲 1MB 的數據。這類似于 UNIX 文件系統(tǒng),除了父 znode 也可以存儲數據。這個結構的主要目的是存儲同步數據和描述znode的元數據。這種結構稱為ZooKeeper 數據模型。
ZooKeeper 數據模型中的每個 znode 都維護一個stat結構。stat 只是提供znode的元數據。它由版本號、動作控制列表 (ACL)、時間戳和數據長度組成。
- 版本號- 每個 znode 都有一個版本號,這意味著每次與 znode 關聯(lián)的數據發(fā)生變化時,其對應的版本號也會增加。當多個 zookeeper 客戶端嘗試在同一個 znode 上執(zhí)行操作時,版本號的使用很重要。
- 動作控制列表 (ACL)?- ACL 基本上是一種用于訪問 znode 的身份驗證機制。它管理所有 znode 讀寫操作。
- 時間戳- 時間戳表示從 znode 創(chuàng)建和修改經過的時間。它通常以毫秒表示。ZooKeeper通過“交易ID”(zxid)識別對znode的所有更改。Zxid是唯一的,并為每個事務維護時間,因此您可以輕松識別從一個請求到另一個請求所用的時間。
- 數據長度- 存儲在 znode 中的數據總量是數據長度。您最多可以存儲 1MB 的數據。
Znodes的類型
Znodes 分為持久性、順序性和短暫性。
- 持久性 znode?- 即使在創(chuàng)建該特定 znode 的客戶端斷開連接后,持久性 znode 仍然存在。默認情況下,除非另有說明,否則所有 znode 都是持久的。
- 臨時znode-臨時znode處于活動狀態(tài),直到客戶端處于活動狀態(tài)。當客戶端與 ZooKeeper 集合斷開連接時,臨時 znode 會自動刪除。出于這個原因,只有臨時 znode 不允許進一步有子節(jié)點。如果一個臨時 znode 被刪除,那么下一個合適的節(jié)點將填充它的位置。臨時 znode 在 Leader 選舉中扮演著重要的角色。
- 順序znode-順序znode可以是持久性的,也可以是短暫的。當一個新的 znode 作為順序 znode 創(chuàng)建時,ZooKeeper 通過將 10 位序列號附加到原始名稱來設置 znode 的路徑。例如,如果一個路徑為/myapp的 znode被創(chuàng)建為一個連續(xù)的 znode,ZooKeeper 會將路徑更改為/myapp0000000001并將下一個序列號設置為 0000000002。如果兩個連續(xù)的 znode 同時創(chuàng)建,那么 ZooKeeper 永遠不會使用相同的編號每個 znode。順序 znode 在鎖定和同步中扮演著重要的角色。
會話
會話對于 ZooKeeper 的運行非常重要。會話中的請求按 FIFO 順序執(zhí)行。一旦客戶端連接到服務器,會話將被建立并且會話 ID被分配給客戶端。
客戶端以特定時間間隔發(fā)送心跳以保持會話有效。如果 ZooKeeper 集成在服務啟動時指定的時間段(會話超時)內未收到來自客戶端的心跳,則它確定客戶端已死亡。
會話超時通常以毫秒表示。當會話由于某種原因而結束時,在該會話期間創(chuàng)建的臨時znode也會被刪除。
Watches
Watches 是客戶端獲取 ZooKeeper 集合變化通知的一種簡單機制??蛻舳丝梢栽谧x取特定 znode 時設置監(jiān)視。Watches 會向已注冊的客戶端發(fā)送通知,以了解任何 znode(客戶端在其上注冊)的更改。
Znode 更改是對與 znode 關聯(lián)的數據的修改或 znode 子節(jié)點的更改。手表只會觸發(fā)一次。如果客戶端想要再次收到通知,則必須通過另一個讀取操作來完成。當連接會話過期時,客戶端將與服務器斷開連接,并且關聯(lián)的監(jiān)視也將被刪除。