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达成一致。如下图所示:
活锁
:当某一proposer提交的proposal被拒绝时,可能是因为acceptor承诺返回了更大编号的proposal,因此proposer提高编号继续提交。 如果2个proposer都发现自己的编号过低转而提出更高编号的proposal,会导致死循环,这种情况也称为活锁。
解决方案
:Proposer失败之后给一个随机的等待时间,这样就减少同时请求的可能。或者选取一个主Proposer,只有主Proposer才能提出提案
multi-paxos
: 区别于paxos只是确定一个值,multi-paxos可以确定多个值,收到accept请求后,则一定时间内不在accept其他节点的请求,以此保证后续的编号不需要经过prepare确认,直接进入accept操作。此时该节点成为了leader,直到accept被拒绝,重新发起prepare请求竞争leader资格。