今天下午閒的蛋疼,又去看了一遍raft做者講的Paxos視頻,紀錄一下筆記。(講道理,每一年都要學幾遍算法
Basic Paxos 是最基本的一致性算法啦,用來在奇數個服務器中肯定惟一的一個值。首先,中文害人,咱們仍是用論文中的單詞來描述算法,只要有如下幾個單詞。安全
proposer 角色之一,提議者服務器
acceptor 角色之一,協調者學習
上面二個角色在實現中,server能夠同時扮演兩個角色。code
accepte 接受一個提議視頻
choose 選擇一個提議server
在paxos算法中,choose比accept語義要深,accept的不必定會被choose,被choose的必定會被accept。string
value 提議的值class
proposal 提議請求
safety : 一致性算法的安全性,只會choose一個value,server不會學習到不一樣的值
liveness : 最終能夠choose一個value
proposal 要保證全局惟一且有序,能夠使用以下的方式生成 proposal number: <round id>.<server id>。
typedef struct ProposalNumber { int mRoundId; int mServerId; bool operator<(const ProposalNumber& oth) { return mRoundId < oth.mRoundId || (mRoundId == oth.mRoundId && mServerId < oth.mServerId); } };
acceptor 要處理兩個請求:prepare 和 accept,要維護 minProposal, acceptedProposal, acceptValue。使用僞代碼描述就以下:
class Acceptor: public Role { public: pair<accProposal, accValue> handlePrepare(const ProposalNumber& n) { minProposal = max(n, minProposal); return <accProposal, accValue>; } proposalNumber handleAccept(const ProposalNumber& n, string v) { if (n >= minProposal) { minProposal = accProposal = n; accValue = v; } return minProposal; } private: ProposalNumber minProposal, accProposal; string accValue; };
講道理,acceptor就是這麼簡單。複雜的是proposer,本質上就是由於只有server是完成不了一致性算法的,全部須要proposer的幫助,並且acceptor也不知道哪一個值被choose了,只有proposer知道。