Paxos算法(Basic Paxos 與 Multi-Paxos思想)

目錄

  • Basic Paxos
    • 三個角色
    • 達成共識的方法
    • 對于Basic Paxos的總結
  • Multi-Paxos
    • 領導者
    • 優化 Basic Paxos 執行
  • reference

Paxos 算法包含 2 個部分:
1、Basic Paxos : 描述多節點之間如何就某個值達成共識
2、Multi-Paxos : 描述執行多個Basic Paxos實例,對一系列值達成共識

Basic Paxos

三個角色

該算法中存在三個角色:提議者接受者學習者,關系如下:
在這里插入圖片描述
提議者:提議一個值,用于投票表決。在大多數場景中,往往是集群中收到客戶端請求的節點時提議者。這樣對于業務代碼就沒有侵入性,不需要再業務代碼中實現算法邏輯。
接受者:對每個提議的值進行投票,并存儲接受的值。一般來說,集群中的所有節點都是接受者,參與共識協商,并接受和存儲數據
注意:一個節點可以擔任多個角色,如下:
在這里插入圖片描述

學習者:被告知投票的結果,接受達成共識的值,存儲保存,不參與投票的過程。一般來說,學習者是數據備份節點,比如“Master - Slave”模型中的Slave,被動接受數據,容災備份。
三個角色代表三種功能:

  • 1、提議者代表接入和協調功能,收到客戶端請求后,發起二階段提交,進行共識協商
  • 2、接受者代表協商和存儲數據,對提議的值進行投票,并接受達成共識的值,存儲保存
  • 3、學習者代表存儲數據,不參與共識協商,只接受達成共識的值,存儲保存

達成共識的方法

分為準備階段和接受階段。
這里假設兩個客戶端作為提議者和3個節點作為接受者,
客戶端1的想要對節點中的Key為X的數據將Value設置為3,客戶端2的想要對節點中的Key為X的數據將Value設置為5。
提議者發送給接受者的信息我們稱為提案,結構為[n,v],n為提案編號(相當于事務ID,后發起的提案編號越大),v為提議值(寫入db的值)
準備階段
在準備階段,兩個提議者分別向所三個接受者發送包含提案編號的準備請求,準備請求中只包含提案編號。并假設接受者節點收到準備請求的時序圖如下:
在這里插入圖片描述
接下來是各個接受者節點對于先收到的準備請求的響應。由于之前沒有通過任何提案,A,B,C都會返回“尚無提案”的響應。
但是有所不同的是,A,B會告訴提議者,不再響應提案編號 <= 1的準備請求,C會告訴提議者,不再響應提案編號 <= 5的準備請求.
也就是說每個節點之后接受比當前提案編號大的請求。
在這里插入圖片描述
接下來是各個接受者第二次收到準備請求的響應。
A,B收到的請求,編號為5 >= 1 ,并且此時兩個節點沒有通過任何提案,所以返回“尚無提案”響應,并不再響應提案編號 <= 5的準備請求.
C收到的請求,編號為1 < 5 ,所以丟棄該準備請求,不做響應。
在這里插入圖片描述
接受階段
兩個提議者節點在收到大多數節點的準備響應之后,會分別發送接受請求
對于客戶端1來說,根據響應中提案編號最大的提案的值,設置接受請求中的值。(客戶端1只有來自A,B的準備響應),因為響應均為”尚無提案“,所以客戶端1會將自己的提議值:3,作為提案值,然后發送接受請求[n, v] : [1,3];
對于客戶端2來說,根據響應中提案編號最大的提案的值,設置接受請求中的值。(客戶端2來自A,B,C的準備響應),因為響應均為”尚無提案“,所以客戶端1會將自己的提議值:7,作為提案值,然后發送接受請求[n, v] : [5,7];
在這里插入圖片描述
三個接受者節點收到兩個提議者的接受請求,會進行處理:
對于A,B,C節點來說,它們對于請求[1,3],都不會接受,因為提案編號 < 5(最小提案編號)。
它們對于請求[5,7]都會接受,因為提案編號 >= 5,通過提案之后,將提案值:7作為X的Value。
在這里插入圖片描述

對于Basic Paxos的總結

根據提案編號的大小,接受者保證三個承諾,具體來說:

  1. 如果準備請求的提案編號,小于等于接受者已經響應的準備請求的提案編號,那么接受者將承諾不響應這個準備請求;
  2. 如果接受請求的提案編號,小于接受者已經響應的準備請求的提案編號,那么接受者將承諾不通過這個提案;
  3. 如果接受者之前有通過提案,那么接受者將承諾,會在準備請求的響應中,包含已經通過的最大編號的提案信息。

Multi-Paxos

Basic Paxos 只能就單個值(Value)達成共識,一旦遇到為一系列的值實現共識的時候,它就不管用了。
它具有兩個缺點:
1、如果多個提議者同時提交提案,可能出現因為提案編號沖突,在準備階段沒有提議者接收到大多數準備響應,協商失敗,需要重新協商
2、2 輪 RPC 通訊(準備階段和接受階段)往返消息多、耗性能、延遲大。

可以通過通過引入領導者優化 Basic Paxos 執行來解決這兩個問題。

領導者

領導者節點作為唯一提議者,就不會存在多個提議者同時提交提案的情況,也就不存在提案沖突了。
模型結構如下:
在這里插入圖片描述
如何選舉領導者需要我們在Multi-Paxos自己實現。
Chubby中,主節點是通過執行 Basic Paxos 算法,進行投票選舉產生的,并且在運行過程中,主節點會通過不斷續租的方式來延長租期(Lease)。比如在實際場景中,幾天內都是同一個節點作為主節點。如果主節點故障了,那么其他的節點又會投票選舉出新的主節點,也就是說主節點是一直存在的,而且是唯一的。
所有的讀請求和寫請求都由主節點來處理。當主節點從客戶端接收到寫請求后,作為提議者,執行 Basic Paxos 實例,將數據發送給所有的節點,并且在大多數的服務器接受了這個寫請求之后,再響應給客戶端成功:
在這里插入圖片描述
當主節點接收到讀請求后,處理就比較簡單了,主節點只需要查詢本地數據,然后返回給客戶端就可以了:
在這里插入圖片描述
缺點就是所有寫請求都在主節點處理,限制了集群處理寫請求的并發能力,約等于單機。

優化 Basic Paxos 執行

下面兩個圖是 Basic Paxos 以及有領導者的優化執行。

圖1 Basic Paxos
圖2 優化之后
可以看到,當領導者處于穩定狀態時,省掉準備階段,直接進入接受階段。這是因為領導者節點上的命令時最新的,不需要通過準備請求來發現之前被大多數節點通過的提案,領導者可以獨立指定提案中的值。 如何理解領導者處于穩定狀態?領導者節點上,序列中的命令是最新的,不再需要通過準備請求來發現之前被大多數節點通過的提案,領導者可以獨立指定提案中的值。準備階段的意義,是發現接受者節點上,已經通過的提案的值。如果在所有接受者節點上,都沒有已經通過的提案了,這時,領導者就可以自己指定提案的值了,那么,準備階段就沒有意義了,也就是可以省掉了。

本質上而言,“當領導者處于穩定狀態時,省掉準備階段,直接進入接受階段”這個優化機制,是通過減少非必須的協商步驟來提升性能的。這種方法非常常用,也很有效。比如,Google 設計的 QUIC 協議,是通過減少 TCP、TLS 的協商步驟,優化 HTTPS 性能。

reference

《分布式協議與算法實戰.韓健》

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

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

相關文章

vs2012下調試mvc4源代碼

當前流行的應該是mvc3才對。然后在研究mvc3的源代碼時候&#xff0c;Html這個屬性下的擴展方法Partial()都沒有。IntelliSense不會提示該方法&#xff0c;找了半天的資料也問了一些博友&#xff0c;沒看到好的解決棒法。最后沒轍另辟蹊蹺&#xff0c;就開始著手研究mvc4的源代碼…

JAVA UDP網絡編程學習筆記

一、UDP網絡編程概述 采用TCP協議通信時&#xff0c;客戶端的Socket必須先與服務器建立連接&#xff0c;連接建立成功后&#xff0c;服務器端也會持有客戶端連接的Socket&#xff0c;客戶端的Socket與服務器端的Socket是對應的&#xff0c;它們構成了兩個端點之間的虛擬通信鏈路…

firefox 插件開發

IDE&#xff0c;你可以嘗試下NetBeans foxbeans這個插件。轉載于:https://www.cnblogs.com/sode/archive/2013/01/25/2876562.html

13種負載均衡算法

目錄前言&#xff08;1&#xff09;輪轉調度&#xff08;Round-Robin Scheduling&#xff09;算法&#xff08;2&#xff09;加權輪轉調度&#xff08;Weighted Round-Robin Scheduling&#xff09;算法&#xff08;3&#xff09;隨機均衡調度&#xff08;Random Scheduling&am…

對于shell腳本參數獲取時的一點小技巧

問題如下&#xff1a; 根據腳本參數的個數$#進行一個循環&#xff0c;在依次輸出每個參數$1 $2 $3...... 我有一個循環變量i $i 取到這時的i為1&#xff0c;我想使用這個1再去調用$1,也是就是打印出第一個參數 就是$($i)的意思來取到第幾個參數&#xff0c;當然$($i)是不好用的…

(轉)頁游安全攻與防,SWF加密和隱藏密匙

原文鏈接&#xff1a;http://netsecurity.51cto.com/art/201211/364775.htm 頁游&#xff0c;最最核心的就是客戶端&#xff08;swf&#xff09;與服務端的游戲通信了。游戲通信產生的封包&#xff0c;內容是否可識別&#xff0c;可篡改&#xff0c;可重放&#xff0c;處理邏輯…

C++自動類型推導 : auto 與 decltype 用法

基本用法與區別 auto 總是推導出“值類型”&#xff0c;絕不會是“引用”,如果有引用&#xff0c;auto會把引用去掉&#xff0c;推導出值類型&#xff1b; auto 可以附加上 const、volatile、*、& 這樣的類型修飾符&#xff0c;得到新的類型。 auto x 10L; // auto推導為…

C++智能指針使用指南 part1:基本使用

加粗樣式>TOC 智能指針是代理模式的具體應用&#xff0c;它使用 RAII 技術代理了裸指針&#xff0c;能夠自動釋放內存&#xff0c; 無需程序員干預&#xff0c;所以被稱為“智能指針”。 智能指針不是指針&#xff0c;而是一個對象&#xff0c;所以不要對其調用delete&…

AS3.0 BitmapData類介紹

注&#xff1a;文中的Bitmapdata和BMD均為同一意思BitmapData,BMD為其縮寫一&#xff0c;概括&#xff1a; Bitmapdata繼承Object對象&#xff0c;實現IBitmapDrawable接口&#xff0c;這個接口有什么用&#xff0c;你可以理解為Drawable,能被畫。官方介紹是&#xff1a;IBitma…

C++使用JSON的序列化與反序列化

這里使用的json解析工具為JSON for Modern C,使用的話僅需要包含頭文件。 獲取方式&#xff1a;wget https://github.com/nlohmann/json/releases/download/v3.7.3/json.hpp JSON json的序列化功能和map一樣&#xff0c;用關聯數組的"[]"來任意添加數據&#xff0c…

iOS判斷為空或者只為空格

本文轉載至 &#xff1a;http://www.cnblogs.com/superhappy/archive/2012/11/08/2761403.html 經常有需求 要判斷不能為空&#xff0c;后臺老是鄙視不做非空判斷的前端 &#xff0c;木辦法 只能寫一個。 第一種想法&#xff1a;我不就是判斷 是不是nil就可以了么。結果發現太天…

Hyper-V

Hyper-V&#xff1a;也就是虛擬化技術&#xff0c;允許終端用戶在同一臺機器上運行多個操作系統&#xff0c;支持32位和64位系統&#xff0c;可以直接在Windows 8上創建自己的虛擬機。開啟Hyper-V虛擬機需要更多的內存&#xff0c;正常運行需要至少4GB以上內存&#xff0c;所以…

sdut 1451 括號東東 DP

http://acm.sdut.edu.cn/sdutoj/problem.php?actionshowproblem&problemid1451 題意&#xff1a;中文..... 思路&#xff1a; pku有一道題&#xff0c;經典的括號匹配&#xff08;區間DP&#xff09;題目&#xff0c;那道題目是求的最長滿足條件的子串的長度&#xff0c;那…

CDN緩存替代算法

CDN緩存工作過程如下&#xff1a;用戶發出一個請求&#xff0c;如果請求被命中&#xff0c;緩存將對用戶的請求進行響應&#xff0c;返回其請求的數據&#xff1b;如果未被命中&#xff0c;緩存向上拉取用戶需要的數據&#xff0c;并對其存儲的數據進行替換。 緩存算法的意義在…

前端開發常用正則表達式

1、電話 var phone /(^[^1][0-9\-]{6,20}$)|(^(134|135|136|137|138|139|150|151|152|157|158|159|182|183|187|188|147|130|131|132|155|156|185|186|145|133|153|180|189|181|184)\d{8}$)/ 2、郵箱 var email /^([a-zA-Z0-9_.-])([a-zA-Z0-9_-])((\.[a-zA-Z0-9_-]{2,3}){1,…

android 中調用接口發送短信

轉載&#xff1a;http://ziyu-1.iteye.com/blog/1013932 android中可以通過兩種方式發送短信 第一&#xff1a;調用系統短信接口直接發送短信&#xff1b;主要代碼如下&#xff1a; Java代碼//直接調用短信接口發短信 SmsManager smsManager SmsManager.getDefault(); List…

linux 命令案例學習——文件搜索

兩個搜索文件的工具 locate ——僅僅通過文件名查找文件find ——依據文件的各種屬性在既定目錄&#xff08;包括子目錄&#xff09;里查找一個通常與文件搜索命令一起使用、處理搜索結果文件列表的命令 xargs1 locate 1.1 查找文件名中含有zip的文件名 locate zip 看下結…

Redis 緩存擊穿、緩存穿透、緩存雪崩的處理方法

常用的分布式緩存Redis單機并發量能達到萬級&#xff0c;常用的關系型數據庫MySQL一般并發量是千級&#xff0c;他們支持的并發量可能差十倍&#xff0c;所以要盡可能把流量攔截在緩存層。 緩存擊穿 一個并發訪問量比較大的key在某個時間過期&#xff0c;導致所有的請求直接打…

Java-- 異常與記錄日志

可以使用java.util.logging工具將輸出記錄在日志中。記錄日志的的功能還是很簡單的&#xff0c;下面直接鋪出代碼&#xff1a; 1 package com.exceptions;2 3 import java.io.*;4 import java.util.logging.Logger;5 6 class LoggingException extends Exception{7 private…

圖像處理基礎

圖像處理基礎 在計算機中&#xff0c;按照顏色和灰度的多少可以將圖像分為二值圖像、灰度圖像、索引圖像和真彩色RGB圖像四種基本類型。目前&#xff0c;大多數圖像處理軟件都支持這四種類型的圖像。 (1) 二值圖像&#xff1a;一幅二值圖像的二維矩陣僅由0、1兩個值構成&#x…