zookeeper原理和入門知識

2021-05-2917:31:28zookeeper原理和入門知識已關閉評論

 

什么是 Apache ZooKeeper?

ZooKeeper 是一種分布式協調服務,用于管理大量主機。在分布式環境中協調和管理服務是一個復雜的過程。ZooKeeper通過其簡單的體系結構和API解決了這個問題。ZooKeeper 允許開發人員專注于核心應用程序邏輯,而無需擔心應用程序的分布式特性。

ZooKeeper 框架最初是在“Yahoo!”構建的?以簡單而可靠的方式訪問他們的應用程序。后來,Apache ZooKeeper 成為 Hadoop、HBase 和其他分布式框架使用的有組織的服務的標準。例如,Apache HBase 使用 ZooKeeper 來跟蹤分布式數據的狀態。本教程介紹了 ZooKeeper 的基礎知識,如何在分布式環境中安裝和部署 ZooKeeper 集群,最后以幾個使用 Java 編程的示例和示例應用程序結束。

ZooKeeper 的工作原理

如果您有一個跨越 500 臺或更多商用服務器的 Hadoop 集群,您將需要在名稱、組和同步服務、配置管理等方面對整個集群進行集中管理。其他使用 Hadoop 集群的開源項目需要跨集群服務。嵌入 ZooKeeper 意味著您不必從頭開始構建同步服務。與 ZooKeeper 的交互通過 Java™ 或 C 接口時間發生。

對于應用程序,ZooKeeper 通過在 ZooKeeper 服務器上的內存中維護狀態類型信息來提供跨節點同步的基礎設施。ZooKeeper 服務器保留整個系統狀態的副本,并將此信息保存在本地日志文件中。大型 Hadoop 集群由多個 ZooKeeper 服務器支持,主服務器同步頂級服務器。

在 ZooKeeper 中,應用程序可以創建所謂的 znode,它是一個持久存在于 ZooKeeper 服務器內存中的文件。znode 可以由集群中的任何節點更新,集群中的任何節點都可以注冊以接收該 znode 的更改通知。

簡而言之,應用程序可以通過更新它們在 ZooKeeper znode 中的狀態來跨分布式集群同步它們的任務。然后 znode 將特定節點的狀態更改通知集群的其余部分。這種集群范圍的狀態集中服務對于跨大型分布式服務器集的管理和序列化任務至關重要。

在進一步發展之前,重要的是我們了解分布式應用程序的一兩件事。因此,讓我們從分布式應用程序的快速概覽開始討論。

分布式應用

分布式應用程序可以在給定時間(同時)在網絡中的多個系統上運行,通過相互協調以快速有效的方式完成特定任務。通常,由非分布式應用程序(在單個系統中運行)需要數小時才能完成的復雜且耗時的任務可以通過分布式應用程序利用所有相關系統的計算能力在幾分鐘內完成。

通過將分布式應用程序配置為在更多系統上運行,可以進一步縮短完成任務的時間。運行分布式應用程序的一組系統稱為集群,集群中運行的每臺機器稱為節點。

分布式應用程序有兩部分,服務器和客戶端應用程序。服務器應用程序實際上是分布式的并且有一個通用的接口,這樣客戶端就可以連接到集群中的任何服務器并獲得相同的結果。客戶端應用程序是與分布式應用程序交互的工具。

分布式應用

分布式應用程序的好處

  • 可靠性- 單個或幾個系統的故障不會使整個系統出現故障。
  • 可擴展性- 可以在需要時通過添加更多機器來提高性能,而無需停機即可對應用程序的配置進行微小更改。
  • 透明度- 隱藏系統的復雜性,并將自身顯示為單個實體/應用程序。

分布式應用程序的挑戰

  • 競爭條件- 兩臺或多臺機器嘗試執行特定任務,實際上在任何給定時間只需要一臺機器完成。例如,共享資源在任何給定時間只能由一臺機器修改。
  • 死鎖- 兩個或多個操作無限期地等待對方完成。
  • 不一致- 數據部分失敗。

Apache ZooKeeper 的用途是什么?

Apache ZooKeeper 是集群(節點組)使用的一種服務,用于在它們之間進行協調并通過強大的同步技術維護共享數據。ZooKeeper 本身是一個分布式應用程序,為編寫分布式應用程序提供服務。

ZooKeeper 提供的常用服務如下 -

  • 命名服務- 通過名稱識別集群中的節點。它類似于 DNS,但適用于節點。
  • 配置管理-加入節點的系統的最新和最新配置信息。
  • 集群管理- 實時加入/離開集群中的節點和節點狀態。
  • 領導者選舉- 選舉一個節點作為領導者以進行協調。
  • 鎖定和同步服務- 在修改數據時鎖定數據。此機制可幫助您在連接其他分布式應用程序(如Apache HBase)時進行自動故障恢復。
  • 高度可靠的數據注冊表- 即使一個或幾個節點出現故障,數據的可用性。

分布式應用程序提供了很多好處,但它們也帶來了一些復雜且難以破解的挑戰。ZooKeeper 框架提供了一個完整的機制來克服所有挑戰。使用故障安全同步方法處理競爭條件和死鎖。另一個主要缺點是數據的不一致,ZooKeeper 使用atomicity 來解決。

使用ZooKeeper 的好處

以下是使用 ZooKeeper 的好處 -

  • 簡單的分布式協調流程
  • 同步- 服務器進程之間的相互排斥和合作。此過程有助于在 Apache HBase 中進行配置管理。
  • 有序消息
  • 序列化- 根據特定規則對數據進行編碼。確保您的應用程序始終如一地運行。這種方法可以在 MapReduce 中使用來協調隊列以執行正在運行的線程。
  • 可靠性
  • 原子性- 數據傳輸要么成功要么完全失敗,但沒有事務是部分的。

在深入了解 ZooKeeper 的工作原理之前,讓我們先了解一下 ZooKeeper 的基本概念。我們將在本章中討論以下主題 -

  • 建筑學
  • 分層命名空間
  • 會議
  • 手表

ZooKeeper 的架構

看看下面的圖表。它描述了 ZooKeeper 的“客戶端-服務器架構”。

ZooKeeper 的架構

作為 ZooKeeper 架構一部分的每個組件都已在下表中進行了解釋。

部分描述
客戶客戶端是我們分布式應用集群中的節點之一,從服務器訪問信息。在特定的時間間隔內,每個客戶端都會向服務器發送一條消息,讓服務器知道客戶端還活著。

類似地,服務器在客戶端連接時發送確認。如果連接的服務器沒有響應,客戶端會自動將消息重定向到另一臺服務器。

服務器服務器是 ZooKeeper 集合中的節點之一,為客戶端提供所有服務。向客戶端發出確認以通知服務器處于活動狀態。
合奏ZooKeeper 服務器組。形成集成所需的最小節點數為 3。
領導如果任何連接的節點發生故障,則執行自動恢復的服務器節點。在服務啟動時選出領導者。
追隨者遵循領導者指令的服務器節點。

分層命名空間

下圖描繪了用于內存表示的 ZooKeeper 文件系統的樹結構。ZooKeeper 節點稱為znode。每個 znode 都由一個名稱標識并由一系列路徑 (/) 分隔。

  • 在圖中,首先你有一個用“/”分隔的根znode。在 root 下,您有兩個邏輯命名空間configworkers
  • 配置命名空間用于集中配置管理和工人的命名空間用于命名。
  • config命名空間下,每個 znode 最多可以存儲 1MB 的數據。這類似于 UNIX 文件系統,除了父 znode 也可以存儲數據。這個結構的主要目的是存儲同步數據和描述znode的元數據。這種結構稱為ZooKeeper 數據模型

分層命名空間

ZooKeeper 數據模型中的每個 znode 都維護一個stat結構。stat 只是提供znode的元數據。它由版本號、動作控制列表 (ACL)、時間戳和數據長度組成。

  • 版本號- 每個 znode 都有一個版本號,這意味著每次與 znode 關聯的數據發生變化時,其對應的版本號也會增加。當多個 zookeeper 客戶端嘗試在同一個 znode 上執行操作時,版本號的使用很重要。
  • 動作控制列表 (ACL)?- ACL 基本上是一種用于訪問 znode 的身份驗證機制。它管理所有 znode 讀寫操作。
  • 時間戳- 時間戳表示從 znode 創建和修改經過的時間。它通常以毫秒表示。ZooKeeper通過“交易ID”(zxid)識別對znode的所有更改。Zxid是唯一的,并為每個事務維護時間,因此您可以輕松識別從一個請求到另一個請求所用的時間。
  • 數據長度- 存儲在 znode 中的數據總量是數據長度。您最多可以存儲 1MB 的數據。

Znodes的類型

Znodes 分為持久性、順序性和短暫性。

  • 持久性 znode?- 即使在創建該特定 znode 的客戶端斷開連接后,持久性 znode 仍然存在。默認情況下,除非另有說明,否則所有 znode 都是持久的。
  • 臨時znode-臨時znode處于活動狀態,直到客戶端處于活動狀態。當客戶端與 ZooKeeper 集合斷開連接時,臨時 znode 會自動刪除。出于這個原因,只有臨時 znode 不允許進一步有子節點。如果一個臨時 znode 被刪除,那么下一個合適的節點將填充它的位置。臨時 znode 在 Leader 選舉中扮演著重要的角色。
  • 順序znode-順序znode可以是持久性的,也可以是短暫的。當一個新的 znode 作為順序 znode 創建時,ZooKeeper 通過將 10 位序列號附加到原始名稱來設置 znode 的路徑。例如,如果一個路徑為/myapp的 znode被創建為一個連續的 znode,ZooKeeper 會將路徑更改為/myapp0000000001并將下一個序列號設置為 0000000002。如果兩個連續的 znode 同時創建,那么 ZooKeeper 永遠不會使用相同的編號每個 znode。順序 znode 在鎖定和同步中扮演著重要的角色。

會話

會話對于 ZooKeeper 的運行非常重要。會話中的請求按 FIFO 順序執行。一旦客戶端連接到服務器,會話將被建立并且會話 ID被分配給客戶端。

客戶端以特定時間間隔發送心跳以保持會話有效。如果 ZooKeeper 集成在服務啟動時指定的時間段(會話超時)內未收到來自客戶端的心跳,則它確定客戶端已死亡。

會話超時通常以毫秒表示。當會話由于某種原因而結束時,在該會話期間創建的臨時znode也會被刪除。

Watches

Watches 是客戶端獲取 ZooKeeper 集合變化通知的一種簡單機制。客戶端可以在讀取特定 znode 時設置監視。Watches 會向已注冊的客戶端發送通知,以了解任何 znode(客戶端在其上注冊)的更改。

Znode 更改是對與 znode 關聯的數據的修改或 znode 子節點的更改。手表只會觸發一次。如果客戶端想要再次收到通知,則必須通過另一個讀取操作來完成。當連接會話過期時,客戶端將與服務器斷開連接,并且關聯的監視也將被刪除。