zookeeper原理和入門知識

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

 

什么是 Apache ZooKeeper?

ZooKeeper 是一種分布式協(xié)調(diào)服務(wù),用于管理大量主機(jī)。在分布式環(huán)境中協(xié)調(diào)和管理服務(wù)是一個復(fù)雜的過程。ZooKeeper通過其簡單的體系結(jié)構(gòu)和API解決了這個問題。ZooKeeper 允許開發(fā)人員專注于核心應(yīng)用程序邏輯,而無需擔(dān)心應(yīng)用程序的分布式特性。

ZooKeeper 框架最初是在“Yahoo!”構(gòu)建的?以簡單而可靠的方式訪問他們的應(yīng)用程序。后來,Apache ZooKeeper 成為 Hadoop、HBase 和其他分布式框架使用的有組織的服務(wù)的標(biāo)準(zhǔn)。例如,Apache HBase 使用 ZooKeeper 來跟蹤分布式數(shù)據(jù)的狀態(tài)。本教程介紹了 ZooKeeper 的基礎(chǔ)知識,如何在分布式環(huán)境中安裝和部署 ZooKeeper 集群,最后以幾個使用 Java 編程的示例和示例應(yīng)用程序結(jié)束。

ZooKeeper 的工作原理

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

對于應(yīng)用程序,ZooKeeper 通過在 ZooKeeper 服務(wù)器上的內(nèi)存中維護(hù)狀態(tài)類型信息來提供跨節(jié)點(diǎn)同步的基礎(chǔ)設(shè)施。ZooKeeper 服務(wù)器保留整個系統(tǒng)狀態(tài)的副本,并將此信息保存在本地日志文件中。大型 Hadoop 集群由多個 ZooKeeper 服務(wù)器支持,主服務(wù)器同步頂級服務(wù)器。

在 ZooKeeper 中,應(yīng)用程序可以創(chuàng)建所謂的 znode,它是一個持久存在于 ZooKeeper 服務(wù)器內(nèi)存中的文件。znode 可以由集群中的任何節(jié)點(diǎn)更新,集群中的任何節(jié)點(diǎn)都可以注冊以接收該 znode 的更改通知。

簡而言之,應(yīng)用程序可以通過更新它們在 ZooKeeper znode 中的狀態(tài)來跨分布式集群同步它們的任務(wù)。然后 znode 將特定節(jié)點(diǎn)的狀態(tài)更改通知集群的其余部分。這種集群范圍的狀態(tài)集中服務(wù)對于跨大型分布式服務(wù)器集的管理和序列化任務(wù)至關(guān)重要。

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

分布式應(yīng)用

分布式應(yīng)用程序可以在給定時間(同時)在網(wǎng)絡(luò)中的多個系統(tǒng)上運(yùn)行,通過相互協(xié)調(diào)以快速有效的方式完成特定任務(wù)。通常,由非分布式應(yīng)用程序(在單個系統(tǒng)中運(yùn)行)需要數(shù)小時才能完成的復(fù)雜且耗時的任務(wù)可以通過分布式應(yīng)用程序利用所有相關(guān)系統(tǒng)的計算能力在幾分鐘內(nèi)完成。

通過將分布式應(yīng)用程序配置為在更多系統(tǒng)上運(yùn)行,可以進(jìn)一步縮短完成任務(wù)的時間。運(yùn)行分布式應(yīng)用程序的一組系統(tǒng)稱為集群,集群中運(yùn)行的每臺機(jī)器稱為節(jié)點(diǎn)。

分布式應(yīng)用程序有兩部分,服務(wù)器和客戶端應(yīng)用程序。服務(wù)器應(yīng)用程序?qū)嶋H上是分布式的并且有一個通用的接口,這樣客戶端就可以連接到集群中的任何服務(wù)器并獲得相同的結(jié)果。客戶端應(yīng)用程序是與分布式應(yīng)用程序交互的工具。

分布式應(yīng)用

分布式應(yīng)用程序的好處

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

分布式應(yīng)用程序的挑戰(zhàn)

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

Apache ZooKeeper 的用途是什么?

Apache ZooKeeper 是集群(節(jié)點(diǎn)組)使用的一種服務(wù),用于在它們之間進(jìn)行協(xié)調(diào)并通過強(qiáng)大的同步技術(shù)維護(hù)共享數(shù)據(jù)。ZooKeeper 本身是一個分布式應(yīng)用程序,為編寫分布式應(yīng)用程序提供服務(wù)。

ZooKeeper 提供的常用服務(wù)如下 -

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

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

使用ZooKeeper 的好處

以下是使用 ZooKeeper 的好處 -

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

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

  • 建筑學(xué)
  • 分層命名空間
  • 會議
  • 手表

ZooKeeper 的架構(gòu)

看看下面的圖表。它描述了 ZooKeeper 的“客戶端-服務(wù)器架構(gòu)”。

ZooKeeper 的架構(gòu)

作為 ZooKeeper 架構(gòu)一部分的每個組件都已在下表中進(jìn)行了解釋。

部分描述
客戶客戶端是我們分布式應(yīng)用集群中的節(jié)點(diǎn)之一,從服務(wù)器訪問信息。在特定的時間間隔內(nèi),每個客戶端都會向服務(wù)器發(fā)送一條消息,讓服務(wù)器知道客戶端還活著。

類似地,服務(wù)器在客戶端連接時發(fā)送確認(rèn)。如果連接的服務(wù)器沒有響應(yīng),客戶端會自動將消息重定向到另一臺服務(wù)器。

服務(wù)器服務(wù)器是 ZooKeeper 集合中的節(jié)點(diǎn)之一,為客戶端提供所有服務(wù)。向客戶端發(fā)出確認(rèn)以通知服務(wù)器處于活動狀態(tài)。
合奏ZooKeeper 服務(wù)器組。形成集成所需的最小節(jié)點(diǎn)數(shù)為 3。
領(lǐng)導(dǎo)如果任何連接的節(jié)點(diǎn)發(fā)生故障,則執(zhí)行自動恢復(fù)的服務(wù)器節(jié)點(diǎn)。在服務(wù)啟動時選出領(lǐng)導(dǎo)者。
追隨者遵循領(lǐng)導(dǎo)者指令的服務(wù)器節(jié)點(diǎn)。

分層命名空間

下圖描繪了用于內(nèi)存表示的 ZooKeeper 文件系統(tǒng)的樹結(jié)構(gòu)。ZooKeeper 節(jié)點(diǎn)稱為znode。每個 znode 都由一個名稱標(biāo)識并由一系列路徑 (/) 分隔。

  • 在圖中,首先你有一個用“/”分隔的根znode。在 root 下,您有兩個邏輯命名空間configworkers
  • 配置命名空間用于集中配置管理和工人的命名空間用于命名。
  • 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ù)模型

分層命名空間

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

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

Znodes的類型

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

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

會話

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

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

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

Watches

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

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