码迷,mamicode.com
首页 > 其他好文 > 详细

paxos

时间:2018-03-21 19:55:38      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:store   微信   其他   超过一半   消息   准备   else   div   参考   

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),

 

 

 

 

 

参考资料

微信自研生产级paxos类库PhxPaxos实现原理介绍

微信PaxosStore:深入浅出Paxos算法协议

 

paxos

标签:store   微信   其他   超过一半   消息   准备   else   div   参考   

原文地址:https://www.cnblogs.com/stevenczp/p/8618158.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!