Paxos算法是基於消息傳遞且具備高度容錯特性的一致性算法。咱們將從一個簡單的問題開始,逐步的改進咱們的設計方案,最終獲得Paxos,一個能夠在逆境下工做的協議。算法
1、客戶端-服務器模型服務器
咱們從最小的分佈式系統開始,在這個系統中,只有兩個結點,客戶端結點與服務端結點,客戶端結點可以操做(存儲或更新)遠程服務器結點上的數據。分佈式
算法1.1 樸素的客戶端/服務器算法:客戶端每次向服務器發送一條命令。設計
在存在消息丟失的消息傳遞模型中,該算法卻不能很好的工做,客戶端不能確認消息是否正確的被服務器所接受。所以咱們須要對其進行一些小的改進。排序
算法1.2 待確認的客戶端/服務器算法it
1.客戶端向服務端發送一條請求命令消息。class
2.服務端接受請求並回復確認信息。集羣
3.客戶端在必定的時間範圍內,沒有收到服務器端發送的請求確認信息的回覆,則從新發送命令請求信息。服務器端
定理1.1 若是算法在多個客戶端與服務端運行,服務器收到的命令順序多是不一樣的,這會致使不一致的狀態。擴展
假設在以下的場景中,存在客戶端c1,c2 ,服務端 s1,s2. 服務端s1,s2存在相同的值x = 0。 若是此時 c1,向服務器s1,s2 發送 x = x + 1. 在同一時刻 c2 向服務器 s1,s2 發送 x = 2*x. 假設c1 先於 c2 到達 s1 ,則此時s1的狀態值x爲 2, 而 c2 先於 c1 到達 s2 , 則此時 s2 的狀態值x爲 1. 致使集羣的狀態不一致。
定義1.1 (狀態複製)對於一組結點,若是全部結點都以相同的順序執行命令序列 c1,c2,c3,c4……,則這組結點實現了狀態複製
算法1.3 藉助單一的串行化器實現狀態複製
1. 全部的客戶端將請求命令發送到串行化器
2.串行化器逐個處理客戶端請求,並將客戶端請求逐個發送給全部服務器
3.當串行化器接受到全部服務器的確認消息時,它將返回給對應客戶端命令執行成功的消息。
算法 1.4 兩階段鎖
階段 1 :
客戶端向全部服務器請求獲取鎖
階段 2:
if 客戶端得到全部服務器的加鎖請求
客戶端以可靠的方式向全部服務器發送命令請求,釋放鎖
else
客戶端釋放已經獲取的鎖,休眠一段時間,進入階段 1
下一節中咱們將從弱化的鎖機制來引出paxos算法 。