深入理解 ZAB:ZooKeeper 原子廣播協議的工作原理

在這里插入圖片描述

目錄

      • ZAB 協議:ZooKeeper 如何做到高可用和強一致?🔒
      • ZAB 協議的核心目標 🎯
      • ZAB 協議的關鍵概念 💡
      • ZAB 協議的運行階段 🎬
        • 階段一:Leader 選舉 (Leader Election) 🗳?
        • 階段二:發現與同步 (Discovery and Synchronization) 📡🤝
        • 階段三:廣播 (Broadcast) 📢?
      • ZAB 協議如何保證一致性?🔒
      • 總結:可靠的分布式協調基石 💎

🌟我的其他文章也講解的比較有趣😁,如果喜歡博主的講解方式,可以多多支持一下,感謝🤗!

其他優質專欄: 【🎇SpringBoot】【🎉多線程】【🎨Redis】【?設計模式專欄(已完結)】…等

如果喜歡作者的講解方式,可以點贊收藏加關注,你的支持就是我的動力
?更多文章請看個人主頁: 碼熔burning

ZAB 協議:ZooKeeper 如何做到高可用和強一致?🔒

在使用 Apache ZooKeeper 時,我們知道它是一個分布式協調服務,常用于配置管理、命名服務、分布式同步(如分布式鎖)、組服務等。ZooKeeper 能夠提供高可用和一致性的服務,其核心秘訣就在于它內部實現的ZAB (ZooKeeper Atomic Broadcast) 協議。

ZAB 協議是專為 ZooKeeper 設計的一種崩潰可恢復的原子廣播協議。它的主要目標是確保 ZooKeeper 服務的所有副本(稱為 Peer,包括 Leader 和 Follower)之間保持狀態的一致性,并且所有對狀態的更新(事務)都能夠按照全局唯一的順序被處理。

簡單來說,ZAB 協議就是要解決如何在分布式環境中,讓大家(ZooKeeper 的各個節點)對同一個事情(數據更新)達成一致意見,并且這個過程是可靠的,即使有節點崩潰了也能恢復。🤝

ZAB 協議的核心目標 🎯

ZAB 協議主要確保以下兩點:

  1. 一致性 (Consistency): 保證所有正確的 ZooKeeper 節點都具有相同的系統狀態副本。無論客戶端連接到哪個節點,都能看到相同的數據。
  2. 全局有序性 (Global Ordering): 所有修改 ZooKeeper 狀態的事務都會被賦予一個全局唯一的序列號,并且所有節點都會按照這個序列號的順序來處理這些事務。

ZAB 協議的關鍵概念 💡

理解 ZAB 協議,需要先掌握幾個核心概念:

  • 原子廣播 (Atomic Broadcast): ZAB 協議的核心思想。它保證了任何一個事務(對 ZooKeeper 狀態的修改操作)要么被 ZooKeeper 集群中的所有節點都接受并處理,要么一個節點都不處理。并且,所有節點處理這些事務的順序是完全一致的。想象一下電視直播,所有觀眾看到的畫面內容和順序都是一樣的。📺
  • 角色 (Roles): 在 ZooKeeper 集群中,節點主要有三種角色:
    • Leader (領導者): 集群中只有一個 Leader,負責處理所有的寫請求(狀態修改)。它接收客戶端的寫請求,生成新的事務,并將事務廣播給 Follower。📢
    • Follower (跟隨者): 負責同步 Leader 發來的事務,并將事務應用到自己的狀態上。它處理客戶端的讀請求。👥
    • Observer (觀察者): 與 Follower 類似,也同步 Leader 發來的事務并應用到自己的狀態上。但它不參與 Leader 選舉和寫請求的投票過程。主要用于擴展讀性能。👀
  • 事務 (Transaction): 對 ZooKeeper 狀態的每一次修改操作都抽象為一個事務。例如,創建節點、刪除節點、設置節點數據等都是事務。📝
  • Zookeeper 事務 ID (ZXID): 每個事務都有一個唯一的 64 位數字標識,稱為 ZXID。ZXID 是單調遞增的,它保證了事務的全局順序性。ZXID 的高 32 位通常代表 Leader 的周期(Epoch),低 32 位代表該 Epoch 內的事務序列號。🔢
  • 周期 (Epoch): Leader 選舉成功后,新的 Leader 會創建一個新的 Epoch。Epoch 是一個單調遞增的數字,用來標識 Leader 的一個任期。每次發生 Leader 切換,Epoch 都會增加。Epoch 的作用是為了區分不同 Leader 任期內產生的事務。🗓?
  • 過半機制 (Quorum): ZAB 協議基于過半機制來實現一致性和可靠性。任何一個寫事務,都需要集群中半數以上的節點(包括 Leader 自己)成功接收并確認,Leader 才會提交這個事務。同樣,Leader 的選舉也需要獲得過半節點的投票。🗳?

ZAB 協議的運行階段 🎬

ZAB 協議的運行主要分為三個階段:

階段一:Leader 選舉 (Leader Election) 🗳?

當 ZooKeeper 集群啟動時,或者當前的 Leader 發生故障、網絡中斷時,集群會進入 Leader 選舉階段。

這個階段的目標是從所有正常運行的節點中選舉出一個新的 Leader。選舉過程可能會比較復雜,但核心是基于某種規則(比如每個節點都會給自己投票,并向其他節點發送自己的投票信息,包括自己認為的 Leader 及其最新的事務 ID ZXID)進行協商,最終得票過半的節點成為新的 Leader。

新的 Leader 誕生后,會生成一個新的 Epoch,這個 Epoch 將作為后續事務 ZXID 的高 32 位。

階段二:發現與同步 (Discovery and Synchronization) 📡🤝

新的 Leader 選舉出來后,它并不知道其他 Follower 節點當前的狀態是什么樣的。有些 Follower 可能丟失了一些最新的事務,有些可能還停留在舊的 Leader 周期。

這個階段的目標是讓新的 Leader 和所有 Follower 達到一致的狀態,特別是保證所有 Follower 都擁有 Leader 提議過的所有事務。

具體過程大致是:

  1. 新的 Leader 會與所有 Follower 建立連接。

  2. Follower 會向 Leader 報告自己當前接收到的最新事務的 ZXID

  3. Leader 會根據 Follower 報告的 ZXID,找出 Follower 缺失的事務。

    • 如果 Follower 的 ZXID 落后于 Leader,Leader 會將 Follower 缺失的事務發送給它進行同步。
    • 如果 Follower 的 ZXID 甚至超前于 Leader (這在理論上不應該發生,但在某些極端情況下可能存在臟數據),Leader 會要求 Follower 回滾到 Leader 的最新狀態。
  4. Leader 需要等待過半的 Follower 完成同步,確保大多數節點的狀態與 Leader 一致。

這個階段非常重要,它保證了在開始處理新的寫請求之前,集群中的大多數節點已經處于一個一致的、最新的狀態。

階段三:廣播 (Broadcast) 📢?

一旦過半的 Follower 與 Leader 完成同步,集群就進入了正常運行的廣播階段。

在這個階段,Leader 開始接收客戶端的寫請求。對于每一個寫請求,Leader 會執行以下操作:

  1. 生成新的事務: 將客戶端的寫請求轉換為一個內部的事務對象,并分配一個新的、單調遞增的 ZXID(新的 Epoch + 當前 Epoch 內的計數器)。
  2. 提議 (Propose): Leader 將這個新的事務提議給所有的 Follower。
  3. 廣播 (Broadcast): Leader 將事務發送給所有連接的 Follower。
  4. 確認 (Acknowledge): Follower 收到事務提議后,會將其寫入自己的事務日志,并向 Leader 發送一個確認 (ACK)。📝??👍
  5. 提交 (Commit): Leader 收到過半的 Follower 的確認后,認為這個事務已經被大多數節點接受, Leader 就會向所有 Follower 發送一個 Commit 命令。收到 Commit 命令的 Follower 會將事務應用到自己的內存狀態中。Leader 自己也會將事務應用到自己的狀態中。?

整個廣播過程是原子性的: 事務要么在所有節點上都提交,要么都不提交。并且,由于 ZXID 的全局有序性,所有節點都會按照 ZXID 的順序來處理和應用事務,保證了狀態的一致。

ZAB 協議如何保證一致性?🔒

ZAB 協議通過結合上述概念和階段,保證了分布式環境下的數據一致性:

  • Leader 選舉和 Epoch: 每次 Leader 切換都引入新的 Epoch,保證了不同 Leader 周期產生的事務不會混淆。新的 Leader 會基于大多數節點的狀態來確定從哪里開始新的 Epoch 和 ZXID,避免了腦裂問題導致的不同 Leader 提交沖突的事務。
  • ZXID 的單調遞增: 為每個事務提供了唯一的全局順序標識,所有節點按序處理,保證了事務應用的順序一致。
  • 過半機制: 任何寫操作的提交都依賴于過半節點的確認。這意味著如果一個事務被提交了,它就肯定存在于集群中至少過半的節點上。當發生故障需要選舉新的 Leader 時,新的 Leader 一定是從擁有最新已提交事務(最高 ZXID)的節點中選出的,從而保證了新的 Leader 的狀態包含了所有已提交的事務。即使舊的 Leader 提議了某個事務但未獲得過半確認就崩潰了,新的 Leader 也不會提交那個未完成的事務。半數以下的節點崩潰不會影響服務的可用性。💪

總結:可靠的分布式協調基石 💎

ZAB 協議是 ZooKeeper 能夠提供可靠的分布式協調服務的基石。它通過 Leader 選舉、基于 Epoch 和 ZXID 的事務排序、以及原子廣播和過半機制,巧妙地解決了分布式環境下的數據一致性和可靠性問題。

理解 ZAB 協議對于深入學習 ZooKeeper、設計和實現高可用的分布式系統都非常有幫助!雖然它的細節實現比較復雜,但掌握其核心思想和工作流程,能讓你更好地理解 ZooKeeper 的行為和性能。😊

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

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

相關文章

OpenHarmony外設驅動使用 (五),Fingerprint_auth

OpenHarmony外設驅動使用 (五) Fingerprint_auth 概述 功能簡介 指紋認證是端側設備不可或缺的功能,為設備提供用戶認證能力,可應用于設備解鎖、支付、應用登錄等身份認證場景。用戶注冊指紋后,指紋認證模塊就可為設…

前端(vue)學習筆記(CLASS 6):路由進階

1、路由的封裝抽離 將之前寫在main.js文件中的路由配置與規則抽離出來,放置在router/index.js文件中,再將其導入回main.js文件中,即可實現路由的封裝抽離 例如 //index.js import { createMemoryHistory, createRouter } from vue-routerim…

前后端交互中的絕對路徑和相對路徑

前端 <form action"hello" method"post"> 1. 不加斜杠 &#xff08;相對路徑&#xff0c;如 action"hello"&#xff09; 解析規則&#xff1a;基于當前頁面的 URL 路徑部分 進行拼接。 假設當前頁面 URL 是 http://域名:端口/應用上下文…

在Odoo 18中創建進度條指南

在Odoo 18中創建進度條指南 一、創建進度條模板 首先在名為 progress_bar_widget.xml 的文件中定義一個名為 ProgressBarWidget 的新模板。該模板使用兩個CSS類&#xff1a;progress-bar-inner 用于樣式化進度條&#xff0c;progress_number 用于顯示進度百分比。您可以根據需…

Linux grep 命令詳解:常用選項、參數及實戰場景

一、grep 命令簡介 grep&#xff08;Global Regular Expression Print&#xff09;是 Linux 中用于文本搜索的核心工具&#xff0c;支持正則表達式&#xff0c;能快速定位文件中的目標內容。 二、常用選項&#xff08;Options&#xff09;及英文對照 | 選項 | 英文全稱 | 作用 …

【Java-EE進階】SpringBoot針對某個IP限流問題

目錄 簡介 1. 使用Guava的RateLimiter實現限流 添加Guava依賴 實現RateLimiter限流邏輯 限流管理類 控制器中應用限流邏輯 2. 使用計數器實現限流 限流管理類 控制器中應用限流邏輯 簡介 針對某個IP進行限流以防止惡意點擊是一種常見的反爬蟲和防止DoS的措施。限流策…

Linux問題排查-找到偷偷寫文件的進程

在 Linux 系統中&#xff0c;若要通過已修改的文件找到修改該文件的進程 PID&#xff0c;可以結合以下方法分析&#xff0c;具體取決于文件是否仍被進程打開或已被刪除但句柄仍存在&#xff1a; 一、文件仍被進程打開&#xff08;未刪除&#xff09; 如果文件當前正在被某個進…

More Effective C++:改善編程與設計(下)

目錄 條款19:了解臨時對象的來源 條款20:協助完成“返回值優化” 條款21:利用重載技術避免隱式類型轉換 條款22:考慮以操作符復合形式&#xff08;op&#xff09;取代其獨身形式&#xff08;op&#xff09; 條款23:考慮使用其他程序庫 條款24:了解virtual functions、mul…

VTK|類似CloudCompare的比例尺實現2-vtk實現

文章目錄 實現類頭文件實現類源文件調用邏輯關鍵問題縮放限制問題投影模式項目git鏈接實現類頭文件 以下是對你提供的 ScaleBarController.h 頭文件添加詳細注釋后的版本,幫助你更清晰地理解每個成員和方法的用途,尤其是在 VTK 中的作用: #ifndef SCALEBARCONTROLLER_H #de…

PostgreSQL 聯合索引生效條件

最近面試的時候&#xff0c;總會遇到一個問題 在 PostgreSQL 中&#xff0c;聯合索引在什么條件下會生效&#xff1f; 特此記錄~ 前置信息 數據庫版本 PostgreSQL 14.13, compiled by Visual C build 1941, 64-bit 建表語句 CREATE TABLE people (id SERIAL PRIMARY KEY,c…

SpringBoot項目里面發起http請求的幾種方法

在Spring Boot項目中發起HTTP請求的方法 在Spring Boot項目中&#xff0c;有幾種常用的方式可以發起HTTP請求&#xff0c;以下是主要的幾種方法&#xff1a; 1. 使用RestTemplate (Spring 5之前的主流方式) // 需要先注入RestTemplate Autowired private RestTemplate restT…

《Python星球日記》 第90天:微調的概念以及如何微調大模型?

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 目錄 一、微調原理1. 什么是大模型微調?2. 為什么需要微調?3. 微調的基本流程4. 微調策略分類二、LoRA(Low-Rank Adaptation)技術詳解1. LoRA的核…

機器學習-人與機器生數據的區分模型測試 - 模型融合與檢驗

模型融合 # 先用普通Pipeline訓練 from sklearn.pipeline import Pipeline#from sklearn2pmml.pipeline import PMMLPipeline train_pipe Pipeline([(scaler, StandardScaler()),(ensemble, VotingClassifier(estimators[(rf, RandomForestClassifier(n_estimators200, max_de…

怎樣免費開發部署自己的網站?

要免費開發自己的網站&#xff0c;您可以根據自己的技術水平和需求選擇以下兩種主要方式&#xff1a; 零基礎用戶&#xff1a;建議使用如WordPress.com、Weebly、Strikingly等平臺&#xff0c;快速搭建網站。 有一定技術基礎的用戶&#xff1a;可選擇自行開發網站&#xff0c;…

調用百度云API機器翻譯

新建Python文件&#xff0c;叫 text_translator.py 輸入 import requests import jsonAPI_KEY "glYiYVF2dSc7EQ8n78VDRCpa" # 替換為自己的API Key SECRET_KEY "kUlhze8OQZ7xbVRp" # 替換為自己的Secret Keydef main():# 選擇翻譯方向while True:di…

OpenAI與微軟洽談新融資及IPO,Instagram因TikTok流失四成用戶

OpenAI與微軟洽談新融資及IPO 據悉&#xff0c;OpenAI 正與微軟洽談新融資及籌備 IPO&#xff0c;關鍵問題是微軟在 OpenAI 重組后的股權比例。微軟已投資超 130 億美元&#xff0c;雙方修訂 2019 年合同&#xff0c;微軟擬棄部分股權換新技術訪問權。OpenAI 上周放棄了有爭議轉…

git工具使用詳細教程-------命令行和TortoiseGit圖形化

下載 git下載地址&#xff1a;https://git-scm.com/downloads TortoiseGit&#xff08;圖形化工具&#xff09;下載地址&#xff1a;https://tortoisegit.org/download/ 認識git結構 工作區&#xff1a;存放代碼的地方 暫存區&#xff1a;臨時存儲&#xff0c;將工作區的代碼…

構建RAG混合開發---PythonAI+JavaEE+Vue.js前端的實踐

7GB顯存如何部署bf16精度的DeepSeek-R1 70B大模型&#xff1f;-CSDN博客 服務容錯治理框架resilience4j&sentinel基礎應用---微服務的限流/熔斷/降級解決方案-CSDN博客 conda管理python環境-CSDN博客 快速搭建對象存儲服務 - Minio&#xff0c;并解決臨時地址暴露ip、短…

【Java ee初階】jvm(3)

一、雙親委派機制&#xff08;類加載機制中&#xff0c;最經常考到的問題&#xff09; 類加載的第一個環節中&#xff0c;根據類的全限定類名&#xff08;包名類名&#xff09;找到對應的.class文件的過程。 JVM中進行類加載的操作&#xff0c;需要以來內部的模塊“類加載器”…

wps excel將表格輸出pdf時所有列在一張紙上

記錄&#xff1a;wps excel將表格輸出pdf時所有列在一張紙上 1&#xff0c;調整縮放比例&#xff0c;或選擇將所有列打印在一頁 2&#xff0c;將表格的所有鋪滿到這套虛線