今天下午闲的蛋疼,又去看了一遍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知道。