今天下午閒的蛋疼,又去看了一遍raft作者講的Paxos視訊,紀錄一下筆記。(講道理,每年都要學幾遍
Basic Paxos 是最基本的一致性演算法啦,用來在奇數個伺服器中確定唯一的一個值。首先,中文害人,我們還是用論文中的單詞來描述演算法,只要有以下幾個單詞。
-
proposer 角色之一,提議者
-
acceptor 角色之一,協調者
上面二個角色在實現中,server可以同時扮演兩個角色。
-
accepte 接受一個提議
-
choose 選擇一個提議
在paxos演算法中,choose比accept語義要深,accept的不一定會被choose,被choose的一定會被accept。
-
value 提議的值
-
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知道。