【分布式理論12】事務協調者高可用:分布式選舉算法

文章目錄

    • 一、分布式系統中事務協調的問題
    • 二、分布式選舉算法
      • 1. Bully算法
      • 2. Raft算法
      • 3. ZAB算法
    • 三、小結與比較

一、分布式系統中事務協調的問題

在分布式系統中,常常有多個節點(應用)共同處理不同的事務和資源。前文

【分布式理論9】分布式協同:分布式系統進程互斥與互斥算法
【分布式理論10】分布式協同:分布式互斥算法最佳實現:分布式鎖的原理與實現
【分布式理論11】分布式協同之分布式事務

中介紹了分布式互斥與分布式事務兩類常見問題。分布式互斥問題解決了多個應用訪問同一資源的問題,而分布式事務問題則解決了多個應用訪問不同資源時的一致性問題。解決這些問題的過程中,事務協調者的角色非常重要。事務協調者作為資源訪問的中介,能協調不同節點之間的操作。然而,事務協調者本身的可用性成為了一個不可忽視的問題。

為了增強事務協調者的可用性,通常會使用集群模式,通過主從互備機制來保障事務協調者的持續在線。主節點負責信息的更新,所有從節點負責信息的讀取。若主節點出現故障,系統會通過選舉機制從從節點中選舉出新的主節點,保證系統的正常運行。

?

二、分布式選舉算法

分布式選舉問題的核心在于從一組節點中選舉出一個領導者節點(主節點)。這個過程通常稱為“領導者選舉”。在分布式系統中,確保系統中只有一個領導者是至關重要的,因為只有領導者能夠進行協調和決策。下面將介紹幾種常見的分布式選舉算法。

1. Bully算法

Bully算法的核心思想是從存活的節點中選舉出ID最大(或最小)的節點作為主節點。Bully算法適用于含主從節點的分布式系統,主要通過三種消息類型進行節點間的通信:

  • Election消息:發起選舉請求。
  • Alive消息:對Election消息的響應。
  • Victory消息:競選成功的主節點發送給其他節點,聲明自己為主節點。

在Bully算法中,選舉過程分為以下幾個步驟:
5. 每個節點檢查自己的ID是否為存活節點中最大的,如果是,發送Victory消息宣布自己為主節點。
6. 否則,向比自己ID大的節點發送Election消息,并等待響應。
7. 如果在超時內沒有收到Alive消息,節點認為自己是主節點(會導致腦裂???),發送Victory消息。
8. 如果收到比自己ID大的節點的Alive消息,則放棄競選,等待Victory消息。

這個算法之所以叫"Bully"(欺負人),是因為ID最大的節點通過“欺負”其他節點、強行讓其接受自己為主節點,最終贏得選舉。

舉個例子:假設有4個節點,ID分別為1、2、3、4。如果節點4突然掉線,節點1發現自己沒有收到其他節點的心跳包,就會發起選舉。節點2和節點3的ID都比節點1大,所以節點1會向它們發送選舉消息。節點2和節點3會發出“活躍消息”,讓節點1知道它們不可能成為主節點。最終,節點3會成為新的主節點。

?

2. Raft算法

Raft算法是一種投票選舉算法,遵循“少數服從多數”的原則,規定在一個選舉周期內獲得票數最多的節點為主節點。Raft算法將節點分為三種角色:

  • Leader:領導者節點,負責管理和協調其他節點。
  • Candidate:候選者節點,具有被選舉為領導者的資格。
  • Follower:跟隨者節點,接受領導者的指令,不發起選舉。

Raft算法的選舉過程包括以下步驟:

  1. 節點角色轉換:在Raft中,所有節點在沒有領導者的情況下,都會是“跟隨者”(Follower)。如果在一定時間內(超時)沒有收到領導者的心跳包,跟隨者會自愿變為“候選者”(Candidate),開始發起選舉。
  2. 選舉過程:當一個節點變為候選者時,它會向其他所有節點發起選舉請求。如果一個節點的選舉請求得到了大多數節點的投票支持,它就會成為領導者(Leader)。此時,其他節點會變回“跟隨者”角色,開始接受領導者的指揮。
  3. 選舉的勝者:如果有多個候選者同時發起選舉,系統會出現“選舉超時”,導致選舉周期重復進行,直到某一個候選者最終獲得超過半數節點的投票支持,成為領導者。
  4. 選舉超時與心跳機制:選舉是基于超時控制的。在Raft中,選舉超時是隨機的,防止多個節點同時發起選舉。選舉超時到達后,節點會開始投票,直到某個候選者得到過半數支持。
  5. 領導者的責任:當一個節點成為領導者時,它需要定期向所有跟隨者發送“心跳包”(Heartbeat)。如果在選舉超時內,跟隨者沒有收到領導者的心跳包,它們會再次發起選舉。這是為了確保領導者一直在系統中活動,保證整個系統的穩定性。
  6. 領導者失敗后的恢復:如果領導者失敗,系統會重新啟動選舉過程,選舉新的領導者,確保系統始終能繼續工作。

如果領導者發生故障,或者網絡出現分區,選舉過程會重新啟動,確保集群內總是有一個領導者。Raft算法中的“日志復制”機制可以保證數據的一致性,通過將客戶端的操作記錄到日志中,領導者向跟隨者同步日志,并等待確認,直到達到多數節點的確認,領導者才會提交該操作。

在這里插入圖片描述

?

舉個例子:假設有5個節點(ID分別為A、B、C、D、E),初始時A是領導者。如果A節點由于故障未能發送心跳包,B、C、D、E會感知到沒有收到心跳包,開始選舉過程。B、C和D可能會同時成為候選者,最終一個候選者(比如B)會獲得超過半數的選票,成為新的領導者。

?

3. ZAB算法

ZAB(ZooKeeper Atomic Broadcast)算法是專為ZooKeeper設計的一種協議,目的是保證集群中數據的一致性。ZAB算法通過將集群中的事務請求轉化為提議,并通過廣播方式同步到集群中的所有節點,來保證數據一致性。ZAB算法的選舉過程類似于Raft算法,但有其獨特的實現方式。ZAB算法的選舉過程包括四種狀態:

原理:

  1. 角色劃分:ZAB將節點分為四種角色:
    • 領導者(Leader):負責處理所有客戶端請求并將請求轉換成提議(Proposal),然后廣播給集群中的所有跟隨者。
    • 跟隨者(Follower):接受領導者的提議,進行確認,并按照領導者的日志進行操作。
    • 觀察者(Observer):類似于跟隨者,但不參與選舉和日志同步,它只是觀測集群的狀態。
    • Looking狀態:當集群中沒有領導者時,所有節點都進入該狀態,開始選舉新領導者。
  2. 選舉過程:ZAB的選舉是通過一個三元組(ServerID, ZXID, epoch)來確定領導者。每個節點都維護自己的事務ID(ZXID)和選舉輪次(epoch)。ZAB算法的選舉規則是:節點通過比較ZXID來決定誰是領導者。如果ZXID相同,則比較節點的ServerID,選擇ID最大的節點作為領導者。
  3. 數據一致性:ZAB通過廣播機制來確保數據的一致性。每個事務請求被轉化為提議,并由領導者廣播給所有跟隨者。只有當超過半數的跟隨者確認提議時,領導者才會提交提議,確保所有節點的數據一致。

在選舉過程中,ZAB算法使用三元組信息(ServerID, ZXID, epoch)來確定領導者。選舉規則是:首先比較ZXID,選擇ZXID最大的節點作為領導者;如果ZXID相同,則選擇ServerID較大的節點。

?

三、小結與比較

Bully、Raft與ZAB算法各自具有不同的特點和適用場景:

  • Bully算法:通過簡單的ID比較選舉出主節點,最大ID的節點最終成為主節點。適用于節點間連接良好的場景,但可能在節點數量多時效率較低。
  • Raft算法:通過投票選舉方式確保選舉的公平性,候選者必須獲得超過半數節點的支持才能成為領導者,適合高可用性和一致性要求高的系統。
  • ZAB算法:針對ZooKeeper等高可用分布式系統設計,通過廣播機制和事務提議確保數據一致性,適用于需要強一致性保證的系統。

這三種算法在解決分布式系統中選舉問題的同時,也對提高系統的可用性與一致性起到了關鍵作用。通過選舉機制,能夠確保在事務協調者不可用時,系統能夠迅速選舉出新的協調者,保證系統的持續運行。

?

參考:《分布式架構原理與實踐-崔皓》

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

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

相關文章

免費deepseek的API獲取教程及將API接入word或WPS中

免費deepseek的API獲取教程: 1 https://cloud.siliconflow.cn/中注冊時填寫邀請碼:GAejkK6X即可獲取2000 萬 Tokens; 2 按照圖中步驟進行操作 將API接入word或WPS中 1 打開一個word,文件-選項-自定義功能區-勾選開發工具-左側的信任中心-信任中心設置…

【SFRA】筆記

GK_SFRA_INJECT(x) SFRA小信號注入函數,向控制環路注入一個小信號。如下圖所示,當前程序,小信號注入是在固定占空比的基礎疊加小信號,得到新的占空比,使用該占空比控制環路。 1.2 GK_SFRA_COLLECT(x, y) SFRA數據收集函數,將小信號注入環路后,該函數收集環路的數據,以…

論文筆記-WSDM2024-LLMRec

論文筆記-WSDM2024-LLMRec: Large Language Models with Graph Augmentation for Recommendation LLMRec: 基于圖增強的大模型推薦摘要1.引言2.前言2.1使用圖嵌入推薦2.2使用輔助信息推薦2.3使用數據增強推薦 3.方法3.1LLM作為隱式反饋增強器3.2基于LLM的輔助信息增強3.2.1用戶…

Ubuntu 系統 cuda12.2 安裝 MMDetection3D

DataBall 助力快速掌握數據集的信息和使用方式,會員享有 百種數據集,持續增加中。 需要更多數據資源和技術解決方案,知識星球: “DataBall - X 數據球(free)” 貴在堅持! ---------------------------------------…

Tomcat的升級

Tomcat 是一個開源的 Java Servlet 容器,用于部署 Java Servlet 和 JavaServer Pages(JSP)。隨著新版本的發布,Tomcat 通常會帶來性能改進、安全增強、新特性和對最新 Java 版本的更好支持。升級 Tomcat 服務器通常涉及到以下幾個…

Python常見面試題的詳解10

1. 哪些操作會導致 Python 內存溢出,怎么處理? 要點 1. 創建超大列表或字典:當我們一次性創建規模極為龐大的列表或字典時,會瞬間占用大量的內存資源。例如,以下代碼試圖創建一個包含 10 億個元素的列表,在…

多個用戶如何共用一根網線傳輸數據

前置知識 一、電信號 網線(如以太網線)中傳輸的信號主要是 電信號,它攜帶著數字信息。這些信號用于在計算機和其他網絡設備之間傳輸數據。下面是一些關于網線傳輸信號的詳細信息: 1. 電信號傳輸 在以太網中,數據是…

華為昇騰 910B 部署 DeepSeek-R1 蒸餾系列模型詳細指南

本文記錄 在 華為昇騰 910B(65GB) * 8 上 部署 DeepSeekR1 蒸餾系列模型(14B、32B)全過程與測試結果。 NPU:910B3 (65GB) * 8 (910B 有三個版本 910B1、2、3) 模型:DeepSeek-R1-Distill-Qwen-14B、DeepSeek…

【前端】Vue組件庫之Element: 一個現代化的 UI 組件庫

文章目錄 前言一、官網1、官網主頁2、設計原則3、導航4、組件 二、核心功能:開箱即用的組件生態1、豐富的組件體系2、特色功能亮點 三、快速上手:三步開啟組件化開發1、安裝(使用Vue 3)2、全局引入3、按需導入(推薦&am…

關于uniApp的面試題及其答案解析

我的血液里流淌著戰意!力量與智慧指引著我! 文章目錄 1. 什么是uniApp?2. uniApp與原生小程序開發有什么區別?3. 如何使用uniApp實現條件編譯?4. uniApp支持哪些平臺,各有什么特點?5. 在uniApp中…

Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_pool_t 類型

ngx_pool_t 定義在 src/core/ngx_core.h typedef struct ngx_pool_s ngx_pool_t; ngx_pool_s 定義在 src/core/ngx_palloc.h struct ngx_pool_s {ngx_pool_data_t d;size_t max;ngx_pool_t *current;ngx_chain_t *chain;ng…

力扣 最長遞增子序列

動態規劃,二分查找。 題目 由題,從數組中找一個最長子序列,不難想到,當這個子序列遞增子序列的數越接近時是越容易拉長的。從dp上看,當遍歷到這個數,會從前面的dp選一個最大的數加上當前數,注意…

Linux | 進程控制(進程終止與進程等待)

文章目錄 Linux | 進程控制 — 進程終止 & 進程等待1、進程終止進程常見退出方法1.1退出碼基本概念獲取退出碼的方式常見退出碼約定使用場景 1.2 strerror函數 & errno宏1.3 _exit函數1.4_exit和exit的區別1.4.1 所屬頭文件與函數原型1.4.2 執行過程差異**結合現象分析…

Android - Handler使用post之后,Runnable沒有執行

問題:子線程創建的Handler。如果 post 之后,在Handler.removeCallbacks(run)移除了,下次再使用Handler.postDelayed(Runnable)接口或者使用post時,Runnable是沒有執行。導致沒有收到消息。 解決辦法:只有主線程創建的…

魚皮面試鴨30天后端面試營

day1 1. MySQL的索引類型有哪些? MySQL里的索引就像是書的目錄,能幫數據庫快速找到你要的數據。以下是各種索引類型的通俗解釋: 按數據結構分 B樹索引:最常用的一種,數據像在一棵樹上分層存放,能快速定位范圍數據…

【核心算法篇十二】《深入解剖DeepSeek多任務學習:共享表示層的24個設計細節與實戰密碼 》

引言:為什么你的模型總在"精神分裂"? 想象你訓練了一個AI實習生: 早上做文本分類時準確率90%下午做實體識別卻把"蘋果"都識別成水果公司晚上做情感分析突然開始輸出亂碼這就是典型的任務沖突災難——模型像被不同任務"五馬分尸"。DeepSeek通…

DeepSeek應用——與PyCharm的配套使用

目錄 一、配置方法 二、使用方法 三、注意事項 1、插件市場無continue插件 2、無結果返回,且在本地模型報錯 記錄自己學習應用DeepSeek的過程,使用的是自己電腦本地部署的私有化蒸餾模型...... (舉一反三,這個不單單是可以用…

2025最新智能優化算法:改進型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23個經典函數測試集,MATLAB

一、改進型雪雁算法 雪雁算法(Snow Geese Algorithm,SGA)是2024年提出的一種新型元啟發式算法,其靈感來源于雪雁的遷徙行為,特別是它們在遷徙過程中形成的獨特“人字形”和“直線”飛行模式。該算法通過模擬雪雁的飛行…

vscode通過ssh連接服務器實現免密登錄+刪除

文章目錄 參考: 1、 vscode通過ssh連接服務器實現免密登錄刪除(吐血總結)

MySQL 主從復制原理及其工作過程

一、MySQL主從復制原理 MySQL 主從復制是一種將數據從一個 MySQL 數據庫服務器(主服務器,Master)復制到一個或多個 MySQL 數據庫服務器(從服務器,Slave)的技術。以下簡述其原理,主要包含三個核…