白话分布式一致性协议之Paxos算法

Paxos算法

Paxos 算法是解决分布式系统中数据一致性问题的算法,是分布式系统中非常重要的算法,Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就是Paxos,其它的算法都是残次品。可见该算法的重要性。

Paxos算法将系统中的角色分为3种,分别是提议者(Proposer)决策者(Acceptor)和学习者(Learner)。

  • 提议者(Proposer) :提出 提案(Proposal)。Proposal的内容可以包括一个提案编号(Proposal ID)值(Value
  • 决策者(Acceptor): 对Proposer提出的Proposal进行决策,会自动同意最新的提案。
  • 学习者(Learner):会从Proposer/Acceptors处学习最新的达成一致的提案

Paxos算法通过一个决议分为2个阶段,所以算是一个2PC协议。

第一阶段:
  1. Proposer向Acceptors(这个Acceptor的数量超过了半数)发出一个编号为N的Prepare请求
  2. 如果一个Acceptor收到了这个编号为N的的Prepare请求,且N大于该Acceptor收到过的所有的已经响应的Prepare的编号,那么它就会将已经批准过的最大编号的提案作为响应反馈给Proposer,同时承诺不会再批准编号小于N的提案。
第二阶段:
  1. Proposer收到半数以上的Acceptors的承诺后,就会向Acceptor发送一个提案,内容包括上个阶段的编号N以及提案的值,这个值可以由上个阶段的Acceptors返回,如果为空,可以任意决定本次提案的Value。
  2. Acceptor收到一个编号为N,值为V的提案,只要这个Acceptor目前同意过的编号没有大于N,那么该Acceptor就会同意该提案。

当半数以上的Acceptor通过该提案后,代表的Learner会进行学习,然后由这些Learner在发送到其他Learner节点上进行学习。

至此Paxos算法结束,我用一个简单的例子说明一下。

假如某一个班要去春游,班长向全班征求春游地点的意见。这个时候,班委干部的角色就是决策者,班上的同学是提议者。

同学A提出提案 1-公园,这个时候没有人提出新的提案。那么决策者就会自动同意该提案。

然后同学B提出提案2-动物园,按照Paxos算法,会自动同意最新的,所以该提案也会被同意。

如果后面没有同学提出提案,那么最终就会决定去动物园。然后全班同学得到通知,本次春游的目的地是动物园。

Paxos算法的活锁问题

上面讲述了一个简单的案例。但是这个算法会有一个活锁问题。因为每个Proposer都可以提出提案。所以可能会出现,在提案还没有落地的情况下,一直选举的情况。

用上面的案例来举例就是同学B提出提案2后,同学C又提出提案3-海洋公园,这个方案还没有最终落地的时候,同学A又提出提案4-游乐园。因为Paxos的算法是Acceptor会对Proposer做出承诺,但是这个承诺还没有达到半数的时候,由于又来了新的提案所以之前的提案被迫不能被接受了,这样就会出现一直有人在提出提案而无法进行决策的情况。

解决这种问题有2个方案。第一个方案是为每个Proposer加上一个”冷静“时间,让它们在发出prepare请求前先等待一段时间,可能这段时间,上一个方案已经被半数的决策者通过。

另外一个方案就是,在提议者中选出一个Leader,由该Leader向决策者发出提议,这样就不会出现一直发出提议的情况。

你可能感兴趣的:(分布式服务相关)