paxos算法如何保证acceptor挂掉一半以下也能正常决议?

最近在学习paxos算法,看到paxos的整个过程中acceptor之间并没有做一致性的处理,各acceptor存储的数据可能是不同的,完全靠少数服从多数来产生决议。

比如有一个键值存储系统,使用paxos做一致性,现在有五台acceptor,其中三台储存的是1,一台储存2,一台储存3,然后挂掉了两台储存1的acceptor,现在1、2、3均不能获得多数,那么在learner进行get操作时如何产生结果?

阅读 3.4k
2 个回答

我刚学习ceph中的paxos,虽然可能有点不一样,但是尝试解释一下。

不是你认为的这种“少数服从多数”。

在有leader的情况下,值由leader决定。

你说的情况应该是5台acceptor同时承担proposer的角色,leader宕掉了,那么产生一个确定值(例如leader)的过程应该是这样的。5个proposer发起投票信息送向其他acceptor,其他的acceptor根据受到的投票的编号的值来判断是否“答应”。这里一个acceptor可能会先后收到多个proposer的投票信息,acceptor在该阶段会判断收到的编号与自己已经“答应”的编号比大小,若更大则“答应”更新的,否则无视掉。然后被答应的proposer会判断答应自己的acceptor有多少,如果超过一半则认为第一轮号召成功,就向答应的acceptor发送“协议”来“签订”。acceptor收到协议后判断附带的投票编号与自己保存的是否一致,是则返回“签订”信息。当proposer统计到签订自己协议的人够一半以上,则宣布自己是leader,将与自己签订的拉入quorum(这个才是少数服从多数的那个“多数”),于是该轮选举完毕。

实际上由于各种原因每个proposer送达信息的速度各不相同(如宕机),所以会出现更多的情况,如proposer向某个已经“答应”自己的acceptor请求“签订”时,acceptor已经完成了和某更大编号的“答应”与“签订”过程;或更大的来之前,acceptor与较小的签订好了,则后来的proposer只能将自己建议的值改为已经签订好的中编号最大的那个确定的值,保持一致性。等等。

建议再好好看看原文,虽然我也是一知半解。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进