【分布式面试题】1. 简述paxos算法

1. 简述paxos算法

简述paxos算法

Paxos算法解决的是一个基于消息传递来解决分布式系统如何就某个值(决议)达成一致。一个典型的场景是,在一个分布式数据框系统中,如果各个节点的初始状态一致,每个节点执行相同的操作序列,那么他们最后能够得到一个一致的状态。为了保证每个节点执行相同的操作序列,需要在每一条指令上执行一个“一致性算法”,以保证每个节点看到的指令一致。paxos协议用来解决的问题可以用一句话来简化:将所有节点都写入同一个值,且被写入后不再更改

在Paxos算法中,有三种角色:Proposer(提议者)Acceptor(接受者)Learners(记录者)

  • Proposer:提议者,只要Proposer发起的提案Propose被半数以上的Acceptor接受,Proposer就认为该提案里的value被选定了。
  • Acceptor:接受者,只要Acceptor接受了某个提案,Acceptor就认为该提案里的value被选定了
  • Learner:记录者,Acceptor告诉Learner哪个value被选定。

Paxos算法分为两个阶段,具体如下:
阶段1(prepare)
(1)Proposer收到client请求或者发现本地有未提交的值,选择一个提案编号N,然后向半数以上的Acceptor发送编号为N的Prepare请求
(2)Acceptor收到一个编号为N的Prepare请求,如果该轮paxos:
- 本节点已经有已提交的value记录,对比记录的编号和N,大于N则拒绝回应,否则返回该记录value及编号
- 没有已提交记录,判断本地是否有编号N1,N1>N,则拒绝响应,否则将N1改为N(如果没有N1,则记录N),并响应prepare
阶段2(accept)
(1)如果Proposer收到半数以上Acceptor对其发出的编号为N的Prepare请求的响应,那么它就会发送一个针对[N,V]提案的Accept请求给半数以上的Acceptor。V就是收到的响应中编号最大的value,如果响应中不包含任何value,那么V就由Proposer自己决定。
(2)如果Acceptor收到一个针对编号为N的提案的Accept请求,Acceptor对比本地的记录编号,如果小于等于N,则接受该值,并提交记录value。否则拒绝请求。

Proposer如果收到的大多数Acceptor响应,则选定该value值,并同步给learner,使未响应的Acceptor达成一致。如下图所示:
paxos算法
活锁:当某一proposer提交的proposal被拒绝时,可能是因为acceptor承诺返回了更大编号的proposal,因此proposer提高编号继续提交。 如果2个proposer都发现自己的编号过低转而提出更高编号的proposal,会导致死循环,这种情况也称为活锁。

解决方案:Proposer失败之后给一个随机的等待时间,这样就减少同时请求的可能。或者选取一个主Proposer,只有主Proposer才能提出提案

multi-paxos: 区别于paxos只是确定一个值,multi-paxos可以确定多个值,收到accept请求后,则一定时间内不在accept其他节点的请求,以此保证后续的编号不需要经过prepare确认,直接进入accept操作。此时该节点成为了leader,直到accept被拒绝,重新发起prepare请求竞争leader资格。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

镰刀韭菜

看在我不断努力的份上,支持我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值