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