paxos是我见过最难理解的算法,我最近一个月都在研究这个东西,写一下我对它的理解
使用了大量的比喻,可能词不达意,见谅
basic paxos
basic paxos只为了解决一个问题:最终唯一确定一个变量的值。这个算法需要多个proposer与多个acceptor的参与。
比喻:拍卖商品时,需要对某个商品竞价。proposer就是竞价者,acceptor就是记录价格的记账员,我们使用basic paxos来限制竞价者与记账员,希望能在有限轮竞价之后,确定某个商品的归属。
basic paxos分为两个阶段:
prepare 阶段:
1a) proposer选择一个提案编号n并将prepare请求发送给acceptors中的一个多数派;
1b) acceptor收到prepare消息后,如果提案的编号大于它已经回复的所有prepare消息,则acceptor将自己上次接受的提案回复给proposer,并承诺不再回复小于n的提案;
accept 阶段:
2a) 当一个proposer收到了多数acceptors对prepare的回复后,就进入批准阶段。它要向回复prepare请求的acceptors发送accept请求,包括编号n和根据P2c决定的value(如果根据P2c没有已经接受的value,那么它可以自由决定value)。
2b) 在不违背自己向其他proposer的承诺的前提下,acceptor收到accept请求后即接受这个请求。
p2c:如果一个编号为n的提案具有value v,那么存在一个多数派,要么他们中所有人都没有接受(accept)编号小于n的任何提案,要么他们已经接受(accept)的所有编号小于n的提案中编号最大的那个提案具有value v。
比喻:
前提:记账员有一张纸,一只铅笔,一只钢笔和一块橡皮。铅笔写下的字迹可以被抹掉,钢笔写下的字迹不能被抹掉。
竞价员可以修改自己的名字。
竞价过程分为两个阶段:
准备阶段:
1a) 竞价者选择报价n,并将报价n和自己的名字发给超过一半的记账员
1b) 记账员收到竞价者的报价n之后
if(发现这个报价大于他之前收到过的所有报价) {
if(记账员已经用钢笔写下其他竞价者的竞价请求) {
记账员将上次确认的竞价者k和他的报价返回
} else {
记账员用橡皮抹去上一次用铅笔写下的记录,然后再用铅笔写下报价n和竞价者的名字
}
} else {
忽略
}
确认阶段:
2a) 竞价者收到了大多数记账员的回复后,竞价者会查看收到的所有回复。如果记账员的回复中带有其他竞价者以及他的报价,那么竞价者会选择其中报价最高的那个回复,然后将自己的名字改成这个回复中带有的名字。
现在竞价者会向这些记账员发起确认请求,确认请求中含有自己的报价n和自己的名字(可能在上一行中被更新)
2b) 记账员收到确认请求之后,如果纸上没有任何用钢笔写下的记录 && 记账员用铅笔写下的报价n与确认请求里的n相同。
确认这个请求,用钢笔将竞价者的名字和报价n写在纸上。
场景分析
前提有p1p2两个竞价者,和a1a2a3三个记账员
场景1:
p1提出竞价请求:(1, p1),
参考资料