paxos

Posted stevenczp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了paxos相关的知识,希望对你有一定的参考价值。

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的主要内容,如果未能解决你的问题,请参考以下文章

分布式共识算法——Paxos算法(图解)

分布式共识算法——Paxos算法(图解)

聊聊分布式一致性算法协议 Paxos

Paxos的通俗理解及其在数据库高可用上的使用

阿里大神带你领略Java一致性算法的风骚!(PaxosZabRaft选举NWRHashGossip)

大白话理解“最晦涩”的Paxos算法及在数据库高可用上的使用