Paxos算法
定義2.1 票:即弱化形式的鎖。它具有下面幾個性質:服務器
從票的性質中咱們能夠得出以下結論:函數
算法2.1 樸素的基於票的協議。性能
階段1spa
1: 客戶端向全部的服務器請求一張票變量
階段2服務器端
2: if 收到過半數服務器的回覆 then請求
3: 客戶端將得到的票和命令一塊兒發送每一個服務器方法
4: 服務器檢查票的狀態,若是票仍然有效,則存儲命令並給客戶端一個正反饋信息數據
5:else
6: 客戶端等待,並從新進入階段1
7: end if
階段3
8: if 客戶端從過半數服務器處獲得了正反饋 then
9: 客戶端告訴全部的服務器執行以前存儲的命令
10: else
11: 客戶端等待,而後從新進入階段1
12: end if
該算法是有問題的:
算法 2.2 Paxos
客戶端(提案者) 服務器(接收者)
初始化………………………………………………………………………………………………………………………………………………………………
c ——等待執行的命令 T(max) = 0 —— 當前已發佈的最大票號
t = 0 —— 當前嘗試的票號 C = NULL —— 當前存儲的命令
T(store) = 0 —— 用來存儲命令C的票
階段1……………………………………………………………………………………………………………………………………………………………………
1:t = t + 1
2: 向全部服務器發消息,請求獲得編號爲t的票
3: if t > T(max) then
4: T(max) = t
5: 回覆ok(T(store),C)
6: endif
階段2………………………………………………………………………………………………………………
7: if 過半服務器回覆ok then
8: 選擇T(store)值最大的(T(store),C)
9: if T(store) > 0 then
10: c = C
11: endif
12: 向這些回覆了 ok的服務器發送消息:propose(t,c)
13: endif
14: if t = T(max). then
15: C = c
16: T(store) = t
17: 回覆:success
18: endif
階段3 ………………………………………………………………………………………………………………
19: if 過半服務器回覆 success then
20: 向每一個服務器發送消息:execute(c)
21: endif