Paxos算法的自我理解(《从Paxos到zookeeper》第二章)

昨天看了《从Paxos到zookeeper分布式一致性原理与实践》的第二章,其中2PC和3PC比较好理解,但是Paxos一堆概念理解不了
今天又看了些相关信息,我这里进行自己的理解总结:

目的:
1、Paxos的最终目的是达到最终一致性,选用多数派意见
2、一旦做出最后的决议,就会被确定,不可能出现第二个不同决议

参与者:
Proposer:提议者
Acceptor:批准者,数量为奇数,方便选出多数派
请求先到Proposer,再通过Proposer到Acceptor

二阶段提交:
决议先prepare,再accept

信息包描述:
[K,V],V为值,K为提议编号
Acceptor原则:
1、收到prepare[K,V]请求时:
1)如果未接受任何prepare或accept,返回[null,null];
2)如果接受过accept[K1,V1] (最近一次),如果K<K1,不返回或者返回err,如果K>K1,返回[K1,V1];
3)如果接受过prepare[K1,V1] (最近一次),如果K<K1,不返回或者返回err,如果K>K1,返回[null,null]或[K1,V1] (我也不知道是哪个,如果返回[null,null]不会影响最终决议,如果返回的是[K1,V1],1:[K1,V1]为首请求,2:V1=首请求的V值,3:V1=最近一次accept的V值);
2、接受accept[K,V]请求时:
1)如果未接受大于K的prepare或accept,返回成功,且之后不再回复编号小于K的[k,v];否则不返回或者返回err
Proposer原则:
1、先发送prepare[K,V]请求;如果多数有返回,按[K,V1]执行accept(V1由prepare返回的对象中的最大K决定,如果没有返回,由Proposer决定);
2、发送accept[K,V],如果多数返回成功,则认为是accept成功,如果未达多数,再重新进行prepare操作

通过以上操作,可以达到以下结果:
1、如果一个决议[K,V]被通过,之后通过的决议[K2,V2] (K2>K1),V2必然==V

简述:
使用多数派方式,只要多数达成一致就行,这样可以保证在部分节点断开依然可以运行
acceptor通过不接受旧编号的方式,来确保每次通过prepare的都是最新编号数据
proposer通过prepare获取最新的v,来保证不会将已有决议推翻

论证:
反证法:
假设存在:决议[K,V]被通过后,有新的决议[K1,V1] (K1!=K,V1!=V)被通过
1、K1<K时,根据Proposer原则1可知,K1<K时,决议不会被通过,所以不存在
2、K1>K时,必然会有prepare[K1,V1] (K1>K,V1!=V)通过,根据Proposer原则1,根据Acceptor原则1.2,必然会收到[K,V]返回,根据Proposer原则1,说明存在[K2,V1] (K2>K,V1!=V)返回
prepare存在非[null,null]返回的,只有Acceptor原则1.2、1.3可知,有两种情况
1)Acceptor原则1.2,存在新的决议[K2,V1] (K2>K,V1!=V)被通过,且K2<K1;
使用归纳论证,存在K<Kn<Kn-1<…<K2<K1,K与K1差值有限,而n可无限,所以假设不成立
所以如果一个决议[K,V]被通过,之后通过的决议[K2,V2] (K2>K1),V2必然==V
2)Acceptor原则1.3,还没想好,要么引用回

现在我们知道Acceptor原则和Proposer原则,再回过头文中的几个需求(其实是现有需求,后推导出原则,但是需求太难理解了):
P1:一个Acceptor必须批准它收到的第一个提案
理解:根据Acceptor原则1.1可知,这是可以达到的

P2:如果编号为M0、Value值为V0的提案(即[M0、V0])被选定了,则所有比编号M0更高的,且被选定的提案,其Value值也必须是V0
P2a:如果编号为M0、Value值为V0的提案(即[M0、V0])被选定了,则所有比编号M0更高的,且被Acceptor批准的提案,其Value值也必须是V0
P2b:如果一个提案[M0,V0]被选定后,那么之后任何Proposer产生的编号比M0更高的提案,其Value值都为V0
P2c. 对于任意的Mn和Vn,如果提案[Mn、Vn]被提出,那么存在一个由Acceptor的多数派组成的集合S,这个S满足以下两个条件之一
S中没有Acceptor批准过编号小于Mn的提案
在S的任何Acceptor批准的所有提案中,编号最大提案的决议为Vn

困惑:
批准提案到底是accept操作,还是prepare操作
如果是accept操作,那“一个Acceptor必须批准它收到的第一个提案”困惑就在于
如果第一个提案编号小于当前的已经通过的最大prepare编号,是不允许批准的
如果指代prepare操作,那P2c里的批准,感觉不能按照此理解,更像是accept操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值