分布式 Paxos算法 總結

前言


?相關系列

  • 《分布式 & 目錄》
  • 《分布式 & Paxos算法 & 總結》
  • 《分布式 & Paxos算法 & 問題》
    ?

?參考文獻

  • 《圖解超難理解的 Paxos 算法(含偽代碼)》
  • 《【超詳細】分布式一致性協議 - Paxos》
    ?
    ?

Basic-Paxos @ 基礎帕克索斯算法


????Paxos算法是目前公認解決分布式一致性問題的最有效算法之一,甚至可以說它是過去幾十年里一切分布式一致性算法的源頭。我們對Paxos算法進行描述時通常都會帶上“容錯&共識”兩個關鍵字,那么它們具體代表的是什么呢?

  • 容錯:是指分布式系統在部分節點宕機的情況下依然能夠對外提供服務,即CAP理論中的分區容錯性;
  • 共識:是指分布式系統的各節點都能就某個操作達成共識,即所有節點都批準執行這個操作。例如在分布式系統中操作A/B都想訪問某服務,那么令集群中的所有(超半數/自定義數量)服務都批準執行操作A/B的的過程就是所謂的達成共識。
    ?

?概念

????在正式對流程進行闡述之前,我們需要先對Paxos算法的各類角色&變量進行講解。Paxos算法具有四類角色…其名稱/作用具體如下:

  • client @ 客戶端:負責向提案者發送操作請求;
  • proposer @ 提案者:提案者負責接收&封裝客戶端的操作請求為proposal @ 提案,并為之生成全局唯一&增長的編號。隨后向各接收者廣播準備/接收請求,并根據其返回的通過/批準情況決定是否繼續發送接收請求/判定其已達成一致;
  • acceptor @ 接收者:接收者負責對準備&接收請求中的提案進行判定,以決定是否通過/批準該提案;
  • learner @ 學習者:學習者負責獲取已達成共識的提案并應用于分布式系統中。

????Paxos算法具有三類“持久化”變量…其名稱/作用具體如下:

  • maxProposal @ 最大提案:接收者在準備請求中通過的最大提案編號;
  • acceptedProposal @ 已批準提案:接收者在接收請求中批準的最大提案編號;
  • acceptedValue @ 已批準值:接收者在接收請求中批準的最大提案值。
    ?

?流程

????Paxos算法的流程分為“批準/獲取”兩個部分,這其中“批準”部分負責提案的實際批準,具體又可分為“準備/接收”兩個階段;而“獲取”部分則負責提案批準后的對外開放。關于提案批準的完整流程具體如下:

  • prepare @ 準備階段:提案者在接收到客戶端的操作請求后,其會將之封裝為提案并為之生成全局唯一&增長的編號,關于全局編號的具體生成方式此處不予討論;
  • 提案者會向各接收者廣播(即全體發送)準備(當前提案編號)請求;
  • 各接收者在收到準備(當前提案編號)請求后會比較“當前提案編號”和“最大提案”的大小,如果“當前提案編號” > “最大提案”則記錄“最大提案”為“當前提案編號”并返回通過回應。而如果該接收者曾chosen @ 選中/批準過某項提案,則“已批準提案/已批準值”會隨通過回應一同返回;否則便會無視請求/返回拒絕回應。而在未能收到超過半數/自定義數量通過回應的情況下,提案者會為提案生成重新新編號并再次開始流程;
  • accept @ 接收階段:提案者在收到超過半數/自定義數量的通過回應后會向接收者廣播接收(當前提案編號&當前提案值)請求。如果在之前的準備請求回應中存在“已批準值”,那么在接收請求中攜帶的“當前提案值”就必須應用該值;否則就由當前提案者負責自定義。通過該規則可以得知:Paxos算法只支持單個值/操作的共識;
  • 各接收者在收到接收(當前提案編號&當前提案值)請求后會再次比較“當前提案編號”與“最大提案”的大小,如果“當前提案編號” >= “最大提案”則記錄“已批準提案&已批準值”為“當前提案編號&當前提案值”,并將“當前提案編號”返回,意味著已批準當前提案;否則便將原本的“最大提案”返回;
  • 提案者在收到超過半數/自定義數量的“當前提案編號”后便會認為各接收者已對當前提案達成共識,至此該提案便可以被學習者所獲取&應用于分布式系統了;否則便意味著當前提案被否決,提案者需要為提案重新生成新編號以再次開始流程。

????當提案達成共識后,如何讓學習者獲取該提案也是值得細究的問題。提案獲取通常有以下幾種方案:

  • 全量發送:接收者一旦批準提案便將該提案廣播給所有學習者。這種做法雖然可以讓學習者盡快的獲得批準提案,但是卻需要每個接收者與所有學習者逐一進行通信,通信次數為二者乘積,所以效率較低;
  • 主從同步:選定主學習者,提案批準后由接收者通知主學習者,并由主學習者負責通知其它的學習者。這個方案雖然多了一個步驟,但是通信次數大大降低,通信次數為學習者的數量。該方案同時引出另一個問題:主學習者隨時可能出現故障。
  • 多主從同步:在主從同步的基礎上,由單個主學習者擴展成一個主學習者集合。集合中學習者數量越高,可靠性也越好。
    ?

?模擬

????為了更好的熟悉Paxos算法,此處我們舉例描述Paxos算法“提案批準”的完整過程,該案例中的Paxos集群共有A/B/C三個節點。注意!這里的任意節點都可同時扮演提案者&接收者。

????提案者A/B分別將X賦值成3/5的操作請求封裝為提案,并為之生成全局唯一&增長的編號1/2,隨后向各接收者廣播。在準備階段它們的交互結果如下:

在這里插入圖片描述

  • 提案者A/B分別進入準備階段,并向各接收者廣播準備(1/2)請求;
  • 接收者A/B在收到提案者A的準備(1)請求后發現自身并沒有通過/批準任何準備/接收請求,因此直接返回空的通過回應;
  • 接收者C由于在收到&通過提案者B的準備(2)請求之后再收到提案者A的準備(1)請求,并且提案者B的提案編號2大于提案者A的提案編號1,因此無視了準備(1)請求/返回了拒絕回應;
  • 接收者A/B在收到提案者B的準備(2)請求后由于其提案編號2 > 已通過的提案編號1,因此兩者都會返回空的通過回應。

????由于提案者A/B的準備請求都收到了超過半數的通過回應,因此提案者A/B都將進入Paxos算法的接收階段。

在這里插入圖片描述

  • 提案者A向各接收者廣播接收(1&3)請求。由于之前的通過回應中沒有攜帶“已批準提案”,因此提案的值可以完全自定義;
  • 接收者A/B/C在收到接收(1&3)請求后,由于其之前已經各自通過了準備(2)請求,因此其都會返回提案編號2來表示未曾批準該請求;
  • 提案者A在收到回應后發現提案編號2比自己的提案編號1大,因此知曉自身提案未曾被批準,因此重新回到準備階段進行協商;
  • 提案者B向各接收者廣播接收(2&5)請求。由于之前的通過回應中沒有攜帶“已批準提案”,因此提案的值可以完全自定義;
  • 接收者A/B/C在收到接收(2&5)請求后,由于其都未通過提案編號更大的準備請求,因此其都會返回提案編號2來表示批準了該請求;
  • 提案者B在收到回應后發現提案編號2與自身提案編號相同且數量超過半數,因此判定接收者對該提案已達成共識,學習者可正式獲取&應用該提案。

????在提案批準的流程中還有一種常見的情況是接收者在已批準某項提案的情況下收到提案編號更大的準備請求,這種情況下其就需要在通過回應中返回已批準提案的編號&值…模擬如下:

在這里插入圖片描述

  • 提案者B向各接收者廣播接收(3&6)請求;
  • 接收者A收到&批準了提案者B的接收(3&6)請求;
  • 提案者A向各接收者廣播準備(4)請求;
  • 接收者B/C收到&通過提案者A的廣播準備(4)請求,并因此未批準提案者B的接收(3&6)請求;
  • 接收者A收到&通過提案者A的準備(4)請求,并在通過回應中攜帶了已批準提案編號&值(3&6);
  • 提案者B判定接收者未能就提案達成共識,重新進入準備階段;
  • 提案者A因為收到超過半數的通過請求而進入接收階段,向各接收者廣播接收(4&6)請求。這其中6是因為在之前接收者A的通過回應中包含有已批準提案值,因此該值便被作為了提案者A的提案值;
  • 接收者A/B/C收到&批準了接收(4&6)請求,提案者A判定各接收者已就該提案達成共識。
    ?
    ?

Multi-Paxos算法 @ 多帕克索斯算法


????原始的Basic-Paxos算法只能達成一個值/操作的共識,而Leslie Lamport則提出可以通過多次執行Basic-Paxos算法來達成一系列值/操作的共識。但由于多次協商會增加通信開銷&影響協商活性(即指協商進入死循環),因此Leslie Lamport則進一步提出了名為Multi-Paxos算法的解決方案。

????Multi-Paxos算法對于Basic-Paxos算法的主要區別在于其引入了領導提案者的概念。在Multi-Paxos算法中,提案(準備&接收)請求的發送是由領導提案者專屬負責的。Multi-Paxos系統會在啟動時先通過Basic-Paxos算法從各提案者中選舉出唯一的領導提案者用于“串行”發送提案請求,這樣就能避免并發提交而解決Basic-Paxos算法的活鎖(接收者不斷通過編號更大的提案而導致無法批準已通過的舊提案,該問題正常情況下可通過隨機延遲的方式進行緩解)問題。此外由于領導提案者會連續發送提案請求,因此除去首個提案請求需要完整執行準備&接收兩個階段(為了應對網絡分區而保留,否則也可以不執行)外,后續提案請求的發送都可以只執行接收階段,從而便能減少RPC來提升共識的達成效率。

????Multi-Paxos算法可以支持多領導提案者并存的場景。在實際的Multi-Paxos系統中,由于網絡分區情況的存在,其可能出現選舉出多個領導提案者的情況。對于這種情況Multi-Paxos算法是提供支持的,因為如此一來其會自動退化成Basic-Paxos算法的多次執行場景。

????領導提案者的宕機會導致Multi-Paxos系統不可用。對于一個功能完善的Multi-Paxos系統,其應該具備對領導提案者的故障監測&轉移功能。理論上,領導提案者需要不斷向系統中的其它節點發送心跳以表示自身存活,而一旦在指定時間內未收到心跳(及一系列綜合性盤點),那么Multi-Paxos系統就會判定領導提案者已經宕機。這種情況下其就會選舉新的領導提案者來代替工作,即使舊領導提案者只是因為網絡分區而無法連接。而在不存在可用提案者的情況下,Multi-Paxos系統將陷入不可用的狀態。

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

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

相關文章

Git-基礎操作命令

目錄 Git基礎操作命令 case *查看提交日志 log 版本回退 get add . Git基礎操作命令 我們創建并且初始化這個倉庫以后,我們就要在里面進行操作。 Git 對于文件的增刪改查存在幾個狀態,這些修改狀態會隨著我們執行Git的命令而發生變化。 untracked、…

Spring Boot 實戰:構建一個社交平臺 API

在這篇博客中,我們將繼續深入 Spring Boot 的開發實踐,通過構建一個簡單的社交平臺 API,幫助大家理解如何使用 Spring Boot 高效地開發一個具有注冊、登錄、個人資料管理、帖子發布與評論、點贊等功能的社交平臺。在開發過程中,我…

配置mysqld(讀取選項內容,基本配置),數據目錄(配置的必要性,目錄下的內容,具體文件介紹,修改配置)

目錄 配置mysqld 讀取選項內容 介紹 啟動腳本 基本配置 內容 端口號 數據目錄的路徑 配置的必要性 配置路徑 mysql數據目錄 具體文件 修改配置時 權限問題 配置mysqld 讀取選項內容 介紹 會從[mysqld] / [server] 節點中讀取選項內容 優先讀取[server] 雖然服務…

智能家居WTR096-16S錄放音芯片方案,實現語音播報提示及錄音留言功能

前言: 在當今社會的高速運轉之下,夜幕低垂之時,許多辛勤工作的父母尚未歸家。對于肩負家庭責任的他們而言,確保孩童按時用餐與居家安全成為心頭大事。此時,家居留言錄音提示功能應運而生,恰似家中的一位無形…

Java 編程基礎:開啟編程世界的大門

一、Java 環境搭建 在開始編寫 Java 代碼之前,我們需要先搭建 Java 開發環境。 1. 安裝 JDK(Java Development Kit) JDK 是 Java 開發的核心工具包,它包含了編譯 Java 源文件所需的編譯器(javac)以及運行…

pytorch bilstm crf的教程,注意 這里不支持批處理,要支持批處理 用torchcrf這個。

### Bi-LSTM Conditional Random Field ### pytorch tutorials https://pytorch.org/tutorials/beginner/nlp/advanced_tutorial.html ### 模型主要結構: ![title](sources/bilstm.png) pytorch bilstm crf的教程,注意 這里不支持批處理 Python version…

【SickOs1.1靶場滲透】

文章目錄 一、基礎信息 二、信息收集 三、反彈shell 四、提權 一、基礎信息 Kali IP:192.168.20.146 靶機IP:192.168.20.150 二、信息收集 端口掃描 nmap -sS -sV -p- -A 192.168.20.150 開放了22、3128端口,8080端口顯示關閉 22端…

【HF設計模式】03-裝飾者模式

聲明:僅為個人學習總結,還請批判性查看,如有不同觀點,歡迎交流。 摘要 《Head First設計模式》第3章筆記:結合示例應用和代碼,介紹裝飾者模式,包括遇到的問題、遵循的 OO 原則、達到的效果。 …

Mysql數據庫中,什么情況下設置了索引但無法使用?

在MySQL數據庫中,即使已經正確設置了索引,但在某些情況下索引可能無法被使用。 以下是一些常見的情況: 1. 數據分布不均勻 當某個列的數據分布非常不均勻時,索引可能無法有效地過濾掉大部分的數據,導致索引失效。 …

秒殺業務中的庫存扣減為什么不加分布式鎖?

前言 說到秒殺業務的庫存扣減,就還是得先確認我們的扣減基本方案。 秒殺場景的庫存扣減方案 一般的做法是,先在Redis中做扣減,然后發送一個MQ消息,消費者在接到消息之后做數據庫中庫存的真正扣減及業務邏輯操作。 如何解決數據…

ChatGPT生成測試用例的最佳實踐(一)

前面介紹的案例主要展示了ChatGPT在功能、安全和性能測試用例生成方面的應用和成果。通過ChatGPT生成測試用例,測試團隊不僅可以提升工作效率,還可以加快測試工作的速度,盡早發現被測系統中的問題。問題及早發現有助于提高軟件的質量和用戶滿…

基于Redis實現令牌桶算法

基于Redis實現令牌桶算法 令牌桶算法算法流程圖優點缺點 實現其它限流算法 令牌桶算法 令牌桶是一種用于分組交換和電信網絡的算法。它可用于檢查數據包形式的數據傳輸是否符合定義的帶寬和突發性限制(流量不均勻或變化的衡量標準)。它還可以用作調度算…

操作系統(8)死鎖

一、概念 死鎖是指在一個進程集合中的每個進程都在等待只能由該集合中的其他進程才能引起的事件,而無限期地僵持下去的局面。在多任務環境中,由于資源分配不當,導致兩個或多個進程在等待對方釋放資源時陷入無限等待的狀態,這就是死…

Micropython 擴展C模塊<HelloWorld>

開發環境 MCU:Pico1(無wifi版)使用固件:自編譯版本開發環境:MacBook Pro Sonoma 14.5開發工具:Thonny 4.1.6開發語言:MicroPython 1.24 執行示例 在github上獲取micropython,我使…

并查集基礎

abstract 并查集(Union-Find Set)是一種數據結構,主要用于處理動態連通性問題(Dynamic Connectivity Problem),例如在圖論中判斷兩點是否屬于同一個連通分量,以及動態地合并集合。 它廣泛應用…

CloudberryDB(一)安裝部署多節點分布式數據庫集群

CloudberryDB: 一個 Greenplum Database 分布式數據庫開源版本的衍生項目, 針對開源 Greenplum Database 優化的地方, CloudberryDB制定了路線圖(https://github.com/orgs/cloudberrydb/discussions/369)并在逐步改…

解決Logitech G hub 無法進入一直轉圈的方案(2024.12)

如果你不是最新版本無法加載嘗試以下方案:刪除AppData 文件夾下的logihub文件夾 具體路徑:用戶名根據實際你的請情況修改 C:\Users\Administrator\AppData\Local 如果你有通過lua編譯腳本,記得備份!! ↓如果你是最新…

數據庫范式與反范式化:如何權衡性能與數據一致性

目錄 1. 什么是數據庫范式(Normalization)?第一范式(1NF)第二范式(2NF)第三范式(3NF) 2. 什么是反范式化(Denormalization)?3. 反范式…

Nmap使用總結

0X00 背景 nmap是測試中常用的網絡探測工具,但是這回簡單的操作,一直了解不深入,現在深入的了解和學習一下。 在文章結構上,我把平時常用的內容提前了,以便再次查閱的時候,比較方便。 0X01 安裝 nmap可…

【記錄49】vue2 vue-office在線預覽 docx、pdf、excel文檔

vue2 在線預覽 docx、pdf、excel文檔 docx npm install vue-office/docx vue-demi0.14.6 指定版本 npm install vue-office/docx vue-demi <template><VueOfficeDocx :src"pdf" style"height: 100vh;" rendere"rendereHandler" error&…