了解 ZooKeeper:關鍵概念和架構

ZooKeeper 是一種分布式協調服務,廣泛用于分布式系統中,用于維護配置信息、命名、同步和組服務。它最初由雅虎開發,現在是一個 Apache 項目,已成為許多大型分布式應用程序不可或缺的一部分。本文深入探討 ZooKeeper 的關鍵概念和架構,全面了解其功能和重要性。

介紹

隨著分布式系統變得越來越復雜,對可靠協調服務的需求也變得至關重要。ZooKeeper 通過為分布式應用程序提供高性能協調服務來滿足這一需求。它有助于管理配置信息、跨分布式節點同步任務以及維護組成員身份,從而確保分布式系統能夠協同運行。

關鍵概念

  1. ZooKeeper 集合: ZooKeeper 中的集合由一組服務器(通常是奇數)組成,它們共同管理分布式協調。集合中的每個服務器都維護相同數據的副本,以確保高可用性和可靠性。在典型設置中,如果大多數服務器正常運行,集合就可以繼續運行。這稱為仲裁。
  2. ZNodes: ZooKeeper 將其數據存儲在類似于文件系統的分層命名空間中。此層次結構中的每個節點稱為 ZNode。ZNode 是 ZooKeeper 中的基本數據單元,可以是持久的,也可以是臨時的。持久 ZNode 會一直存在,直到被明確刪除,而臨時 ZNode 會在創建它們的會話結束時自動刪除。
  3. 會話: 當客戶端連接到 ZooKeeper 集合時,會建立一個會話。會話是客戶端與集合之間的臨時連接,在此期間客戶端可以執行各種操作。如果客戶端在一定超時時間內斷開連接并重新連接,則會重新建立會話。如果客戶端在此期限內無法重新連接,則會話被視為已過期。
  4. 監視: ZooKeeper 允許客戶端在 ZNode 上設置監視。監視是一種讓客戶端接收 ZNode 更改通知的機制。發生更改時(例如,創建、刪除或修改 ZNode),ZooKeeper 會向設置監視的客戶端發送事件通知。此功能對于需要隨時了解分布式環境中的更改的應用程序非常方便。
  5. 原子廣播協議 (Zab): ZooKeeper 原子廣播 (Zab) 協議是 ZooKeeper 可靠性和一致性的核心。Zab 是一種崩潰恢復原子廣播協議,可確保集合中的所有服務器都收到相同的狀態更改序列。它分為兩個階段運行:領導者選舉階段和廣播階段。在領導者選舉期間,一臺服務器被選為領導者,然后向追隨者廣播狀態更改。這可確保所有服務器保持一致的狀態。

ZooKeeper 架構

ZooKeeper 的架構旨在提供高吞吐量、低延遲和高可用性。它由三個主要組件組成:客戶端庫、ZooKeeper 服務器和數據存儲。

  1. 客戶端庫: 客戶端庫是客戶端與 ZooKeeper 集合交互的接口。它提供用于創建、刪除和管理 ZNode、設置監視和處理會話的 API。客戶端庫設計為輕量級且高效,可確保客戶端應用程序的開銷最小。
  2. ZooKeeper 服務器: ZooKeeper 集群由多個服務器(通常為 3、5 或 7 個)組成,它們協同工作以提供可靠的協調服務。這些服務器可分為三種角色:領導者、追隨者和觀察者。
  • Leader: Leader 負責處理來自客戶端的所有寫入請求,并與跟隨者同步狀態更改。它確保狀態更改在整個集合中有序且一致。
  • **追隨者:**追隨者從領導者處接收狀態變化并相應地更新其本地狀態。它們還處理來自客戶端的讀取請求,在整個集合中分配讀取負載。
  • **觀察者:**觀察者與追隨者類似,但不參與仲裁。他們從領導者那里接收狀態變化并更新其本地狀態,但不參與領導者選舉。觀察者可用于在不影響仲裁的情況下擴展讀取吞吐量。
  1. 數據存儲: ZooKeeper 將數據存儲在內存中,并定期將快照存儲到磁盤以進行持久保存。內存存儲提供快速數據訪問,確保讀寫操作的低延遲。快照機制確保在服務器發生故障時可以恢復數據。此外,ZooKeeper 維護事務日志以記錄所有狀態更改,從而提供可靠的恢復機制。

用例:分布式鎖服務

要了解 ZooKeeper 的影響,請考慮分布式鎖服務,這是分布式系統中的常見要求。分布式鎖服務可確保在任何給定時間只有一個進程可以持有鎖,從而防止出現競爭條件并確保數據一致性。

執行

  1. 創建鎖 ZNode: 當客戶端想要獲取鎖時,它會/lock在 ZooKeeper 中創建一個臨時 ZNode(例如)。如果 ZNode 創建成功,則該客戶端持有該鎖。如果 ZNode 已經存在,則意味著另一個客戶端持有該鎖。

  2. 釋放鎖: 當持有鎖的客戶端完成任務時,它會刪除 ZNode /lock,釋放鎖。如果客戶端的會話過期或斷開連接,則會自動刪除臨時 ZNode,確保釋放鎖。

  3. **等待鎖:**如果客戶端嘗試創建/lockZNode 并失敗(因為它已經存在),它會對 ZNode 設置監視。當 ZNode 被刪除(鎖被釋放)時,ZooKeeper 會通知客戶端,然后客戶端會再次嘗試獲取鎖。

示例場景

假設有一個分布式應用程序,其中多個實例需要更新共享資源(例如數據庫)。如果沒有適當的同步,這些實例可能會嘗試同時更新資源,從而導致不一致。通過使用 ZooKeeper 進行分布式鎖定,應用程序可確保每次只有一個實例可以更新資源。

  1. 客戶端A 通過創建 ZNode 嘗試獲取鎖/lock。如果成功,客戶端 A 會更新共享資源,然后刪除 ZNode 并釋放鎖。
  2. 與此同時,客戶端B也嘗試獲取鎖,但發現該/lockZNode已經存在。客戶端B在該ZNode上設置監視并等待。
  3. 當客戶端 A 釋放鎖(刪除 ZNode)時,ZooKeeper 會通知客戶端 B。然后客戶端 B 嘗試創建 ZNode /lock、獲取鎖并更新共享資源。

此示例演示了 ZooKeeper 的協調服務如何確保數據一致性并防止分布式環境中的競爭條件。

使用 ZooKeeper 的好處

ZooKeeper 提供了多種優勢,使其成為分布式協調的首選:

  1. 高可用性: ZooKeeper 采用基于仲裁的方法,確保只要大多數服務器正常運行,服務就可用。這使其對服務器故障具有很強的彈性。

  2. 一致性: ZooKeeper 保證強一致性,確保所有客戶端都看到相同的數據視圖。這對于維護分布式系統的完整性至關重要。

  3. **可擴展性:**通過在集合中分發讀取請求并使用觀察者,ZooKeeper 可以處理大量讀取操作,使其適用于大規模應用程序。

  4. 簡單性: ZooKeeper 簡單的 API 和分層命名空間使其易于使用并集成到現有應用程序中。開發人員可以快速實現協調任務,而無需處理分布式系統的復雜性。

挑戰與限制

盡管 ZooKeeper 具有諸多優勢,但它也存在一些挑戰和局限性:

  1. **寫入可擴展性:**由于所有寫入請求都通過領導者,因此領導者的容量限制了寫入吞吐量。在寫入密集型應用程序中,這可能會成為瓶頸。

  2. **延遲:**雖然 ZooKeeper 提供低延遲數據訪問,但客戶端和集合之間的網絡延遲可能會影響性能,尤其是在地理分布式部署中。

  3. **配置的復雜性:**正確配置和管理 ZooKeeper 集合需要深入了解其內部結構。配置錯誤可能會導致性能問題甚至數據丟失。

  4. 單點故障(領導者): ZooKeeper 集合中的領導者是寫入操作的單點故障。雖然集合可以在當前領導者發生故障時選出新的領導者,但有一段短暫的時間無法處理寫入操作。

結論

ZooKeeper 是一款強大的分布式協調工具,具有高可用性、強一致性和可擴展性。其簡單的 API 和強大的架構使其適用于從配置管理到分布式鎖定等各種分布式應用程序。通過了解 ZooKeeper 的關鍵概念和架構,開發人員可以利用其功能構建可靠、高效的分布式系統。

隨著分布式系統的發展,對 ZooKeeper 等可靠協調服務的需求只會增長。通過應對挑戰和限制并不斷改進其架構,ZooKeeper 將在未來幾年繼續成為分布式系統的基石。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37409.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37409.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37409.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Android】Activity子類之間的區別

從底層往頂層的繼承順序依次是: Activity,最原始的Activity androidx.core.app.ComponentActivity,僅僅優化了一個關于KeyEvent的攔截問題,一般不繼承這個類 androidx.activity.ComponentActivity,支持和Android Arc…

Spark Join優化案例:Join Key 遠大于 Payload

在一個案例中,大表 100GB、小表 10GB,它們全都遠超廣播變量閾值(默認 10MB)。因為小表的尺寸已經超過 8GB,在大于 8GB 的數據集上創建廣播變量,Spark 會直接拋出異常,中斷任務執行,所…

C語言 求 n 個數的階乘之和

求n個數的階乘之和&#xff08;即求1&#xff01;2&#xff01;3&#xff01;…n!&#xff09; 這個程序讀取用戶輸入的正整數 n&#xff0c;計算并輸出 1! 2! 3! ... n! 的值。 #include <stdio.h>// 計算階乘的函數 long factorial(int num) {long result 1;for…

恢復 IntelliJ IDEA 中消失的菜單欄

要恢復 IntelliJ IDEA 中消失的菜單欄&#xff0c;可以按照以下簡單步驟操作&#xff1a; 使用快捷鍵打開搜索&#xff1a;首先&#xff0c;雙擊 Shift 鍵打開全局搜索對話框。 搜索“Menu”&#xff1a;在搜索框中輸入 menu&#xff0c;然后從搜索結果中選擇與“Main Menu”相…

python-基礎篇-選擇-是什么

文章目錄 定義一&#xff1a;Python 條件語句跟其他語言基本一致的&#xff0c;都是通過一條或多條語句的執行結果&#xff08; True 或者 False &#xff09;來決定執行的代碼塊。1、什么是條件語句2、if 語句的基本形式3、if 語句多個判斷條件的形式4、if 語句多個條件同時判…

次序統計量

內容來源 概率論與數理統計教程&#xff08;第三版&#xff09; 茆詩松 高等教育出版社 數理統計學導論&#xff08;原書第7版&#xff09; 機械工業出版社 定義 設 X 1 , X 2 , ? , X n X_1,X_2,\cdots,X_n X1?,X2?,?,Xn? 是來自連續分布的隨機樣本 此分布具有 p d f…

【機器學習】Python reversed 函數

目錄&#xff1a; reversed()函數初探應用于列表和元組實戰演練&#xff1a;山海經故事文本處理 Python中的內置函數——reversed()。 這個函數能夠幫助你高效地處理序列類型數據&#xff0c;比如列表、元組、字符串等&#xff0c;通過它你可以輕松地反轉這些序列中的元素順…

JSON 簡述與應用

1. JSON 簡述 JSON&#xff08;JavaScript Object Notation&#xff09;是一種輕量級的數據交換格式&#xff0c;常用于客戶端與服務器之間的數據傳遞。它基于JavaScript對象表示法&#xff0c;但獨立于語言&#xff0c;可以被多種編程語言解析和生成。 1.1 特點 輕量級&#…

JS對數據類型的檢測方式

1. typeof()對于基本數據類型沒問題&#xff0c;遇到引用數據類型就不管用 console.log( typeof 666 ); // number console.log( typeof [1,2,3] ); // object 2. instanceof()只能判斷引用數據類型&#xff0c;不能判斷基本數據類型 console.log( [] instanceof Array ) // tr…

Unity--協程--Coroutine

Unity–協程–Coroutine 1. 協程的基本概念 基本概念:不是線程,將代碼按照劃分的時間來執行,這個時間可以是具體的多少秒,也可以是物理幀的時間,也可以是一幀的繪制結束的時間。 協程的寫法&#xff1a;通過返回IEnumerator的函數實現&#xff0c;使用yield return語句暫停執…

Golang | Leetcode Golang題解之第205題同構字符串

題目&#xff1a; 題解&#xff1a; func isIsomorphic(s, t string) bool {s2t : map[byte]byte{}t2s : map[byte]byte{}for i : range s {x, y : s[i], t[i]if s2t[x] > 0 && s2t[x] ! y || t2s[y] > 0 && t2s[y] ! x {return false}s2t[x] yt2s[y] …

python 查找輪廓

在Python中&#xff0c;查找圖像的輪廓通常使用OpenCV庫。以下是一個簡單的示例代碼&#xff0c;展示了如何使用OpenCV來查找并繪制圖像的輪廓&#xff1a; pythonimport cv2 import numpy as np# 讀取圖像 image cv2.imread(your_image.jpg, 0) # 請將your_image.jpg替換為您…

設備樹下的 platform 驅動編寫

設備樹下的 platform 驅動編寫 設備樹下的 platform 驅動簡介 platform 驅動框架分為總線、設備和驅動&#xff0c;其中總線不需要我們這些驅動程序員去管理&#xff0c;這個是 Linux 內核提供的&#xff0c;我們在編寫驅動的時候只要關注于設備和驅動的具體實現即可。在沒有…

《昇思25天學習打卡營第6天 | 函數式自動微分》

《昇思25天學習打卡營第6天 | 函數式自動微分》 目錄 《昇思25天學習打卡營第6天 | 函數式自動微分》函數式自動微分簡單的單層線性變換模型函數與計算圖微分函數與梯度計算Stop Gradient 函數式自動微分 神經網絡的訓練主要使用反向傳播算法&#xff0c;模型預測值&#xff0…

建站小記:遷移域名DNS到CloudFlare

CloudFlare一直有賽博菩薩之稱&#xff0c;據說用它做DNS解析服務又快又好又免費&#xff0c;還能防DDOS攻擊&#xff0c;并且可以提供頁面訪問統計功能。 正好我博客網頁打開略卡頓&#xff0c;所以決定將自己的DNS解析遷移到CloudFlare。 1.登錄CF控制臺&#xff0c;添加自己…

LeetCode-刷題記錄-二分法合集(本篇blog會持續更新哦~)

一、二分查找概述 二分查找&#xff08;Binary Search&#xff09;是一種高效的查找算法&#xff0c;適用于有序數組或列表。&#xff08;但其實只要滿足二段性&#xff0c;就可以使用二分法&#xff0c;本篇博客后面博主會持續更新一些題&#xff0c;來破除一下人們對“只有有…

(已解決)Adobe Flash Player已不再受支持

文章目錄 前言解決方案 前言 一般來說&#xff0c;很少遇到官方網站使用Adobe Flash Player來進行錄用名單公示了。但是&#xff0c;今天就偏偏遇到一次&#xff0c; 用谷歌瀏覽器打不開&#xff0c; 點了沒有反應&#xff0c;用其他的瀏覽器&#xff0c;例如windows自帶的那…

Golang | Leetcode Golang題解之第207題課程表

題目&#xff1a; 題解&#xff1a; func canFinish(numCourses int, prerequisites [][]int) bool {var (edges make([][]int, numCourses)indeg make([]int, numCourses)result []int)for _, info : range prerequisites {edges[info[1]] append(edges[info[1]], info[0]…

數據結構:期末考 第六次測試(總復習)

一、 單選題 &#xff08;共50題&#xff0c;100分&#xff09; 1、表長為n的順序存儲的線性表&#xff0c;當在任何位置上插入或刪除一個元素的概率相等時&#xff0c;插入一個元素所需移動元素的平均個數為&#xff08; D &#xff09;.&#xff08;2.0&#xff09; A、 &am…

在node環境使用MySQL

什么是Sequelize? Sequelize是一個基于Promise的NodeJS ORM模塊 什么是ORM? ORM(Object-Relational-Mapping)是對象關系映射 對象關系映射可以把JS中的類和對象&#xff0c;和數據庫中的表和數據進行關系映射。映射之后我們就可以直接通過類和對象來操作數據表和數據了, 就…