简述Paxos算法

paxos算法是一种基于消息传递且具有高度容错性的一致性算法,解决的问题是一个分布式系统如何就某个值或者某个协议达成一致,Paxos算法的目标就是要保证最终有一个提案会被选定,当提案被选定后,进程最终也能获取到被选定的提案,该算法的前提是假设不存在拜占庭将军问题。

在该算法中一共有三种角色:proposer、acceptor和learner。proposer负责提出提案,acceptor负责对该提案做出裁决,learner负责学习得到的提案。为了避免单点故障,会有一个acceptor集合,proposer向该集合发送提案,acceptor集合中的每一个成员都有可能同意该提案并且每个acceptor只能批准一个提案,当有一半以上的成员同意后,则同意该提案。

它主要分为两个阶段:分别是prepare阶段和accept阶段。

首先是prepare阶段,先由proposer提出编号为Mn的提案,向acceptor集合发送prepare请求。Acceptor作出反馈:保证不会再接受编号比Mn小的提案,如果acceptor已经批准过某个提案,会向proposer返回已经批准的编号最大的提案的value值。

如果acceptor收到一个编号为Mn的请求且编号大于acceptor已经响应的所有prepare请求的编号,那么它会将自己已经批准过的编号最大的提案值反馈给proposer,同时acceptor承诺不会再接受编号比Mn小的提案。(这里有个优化,就是acceptor会忽略编号小于已批准的提案的请求。)

如果proposer收到了集合超过一半的响应,就会向acceptor发送一个针对Mn Vn的accept请求。Vn为收到的所有响应中编号最大的提案的值。如果响应不包括值(即第一次发送编号Mn),则可以由proposer选择任意值。

然后就是accept阶段,accept阶段是接受提案的要求。当acceptor收到accept请求后,只要未收到任何编号大于Mn的prepare请求,则通过该提案。

为什么要设置成过半提交?比如一个acceptor集合有两个子集合,每个子集合元素都超过acceptor集合的一半元素,那么两个子集合的交集必然存在公共成员。然后acceptor最多只能批准一个提案,那么就能保证只有一个提案被选定了。这种方式是最终一致性。

优化:为了避免死循环,比如两个proposer一次提出一系列编号递增的提案,这时可以产生一个主proposer,提案只能由主proposer负责提出。

Paxos算法引入了“过半”的理念,通俗地讲就是少数服从多数的原则。同时,Paxos算法支持分布式节点角色之间的轮换,这极大地避免了分布式单点的出现,因此Paxos算法既能解决无限期等待问题,也解决了“脑裂”问题,是目前来说最优秀的分布式一致性协议之一。

paxos算法的应用:chubby(分布式锁服务、GFS中master的选举)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值