Paxos

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013201439/article/details/81285271

简述

Paxos算法是Leslie Lamport于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法,是分布式一致性中的经典算法。Google在其分布式锁服务(Chubby lock)中应用了Paxos算法,Zookeeper的ZAB协议(ZooKeeper Atomic Broadcast protocol)也是参考Paxos来实现的。

历史

拜占庭将军问题(Byzantine Generals Problem

1982年,Leslie Lamport发表了名为《The Byzantine Generals Problem》 的论文,描述了拜占庭将军投票问题,借以映射分布式系统中计算机通信容错问题。

一组拜占庭将军分别各率领一支军队共同围困一座城市。为了简化问题,将各支军队的行动策略限定为进攻或撤离两种。因为部分军队进攻部分军队撤离可能会造成灾难性后果,因此各位将军必须通过投票来达成一致策略,即所有军队一起进攻或所有军队一起撤离。因为各位将军分处城市不同方向,他们只能通过信使互相联系。在投票过程中每位将军都将自己投票给进攻还是撤退的信息通过信使分别通知其他所有将军,这样一来每位将军根据自己的投票和其他所有将军送来的信息就可以知道共同的投票结果而决定行动策略。

投票系统的问题在于,军队中可能存在叛徒和敌军的间谍,左右将军们的决定又扰乱整体军队的秩序。这时候在已知有成员可能不可靠的情况下,其他忠诚的将军如何在不受叛徒和间谍影响的情况下意见达成一致,这就是拜占庭将军问题。

拜占庭将军问题是对分布式系统的模型化,将军是计算机,信使则是通信系统,由于硬件错误或者恶意攻击等,计算机和网络可能会出现拜占庭将军问题。

Paxos算法

1998年,Leslie Lamport发表了名为《The Part-Time Parliament》 的论文, 这是Paxos算法第一次公开发发布,为网络异常情况下分布式系统如何保证数据一致性提供了一个解决思路。注意Paxos算法是有特定前提的,即先不考虑拜占庭将军问题(消息篡改)的情况。

The Part-Time Parliament》中使用了大量的数学证明,考虑到大多数人理解起来比较困难,Leslie Lamport 于2001年发表了另一篇论文《Paxos Made Simple》,使用了逻辑推导来论述Paxos算法。

内容

角色

在Paxos算法中,节点可以分为:Proposer(提议者)、Acceptor(接受者)、Learner(学习者)三种角色,可以同时扮演多种角色。

  • Proposer:负责提议,提出想要达成一致的value;
  • Acceptor:对提议投票,决定是否接受此value;
  • Learner:不参与投票,只接收投票结果。


image.png | center | 410x257

约束

  • 最终只有一个提议值会被选择,只有被选择的提议值才会被Learner节点学习。
  • 最终总会有一个提议生效,Paxos 协议能够让 Proposer 发送的提议朝着能被大多数 Acceptor 接受的那个提议靠拢,因此能够保证可终止性。

流程

Proposer会发送两种类型的消息给Acceptors:prepare(准备)和accept(接收)请求。
Proposer发送的提议请求由两部分组成,[n,v],n为序号(不可重复,具有唯一性),v为提议值。

[n=2,v=8]

如下图所示,Proposer A、B都可以发送prepare提议请求,Acceptor X、Y先接收到Proposer A的请求,Acceptor Z先接收到Proposer B的请求。


image.png | center | 359x275

如果Acceptor接收到一个prepare提议请求[n1,v1],并且之前还未接收过任何提议请求,会发送一个提议请求的响应,设置当前收到的提议为[n1,v1],保证不再接收序号小于n1的提议请求。


image.png | center | 528x301

随后,Acceptor X、Y会收到Proposer B的提议请求[n=4,v=5],先前的提议请求[n=2,v=8],由于4>2,因此发送[n=2,v=8]的提议响应,设置当前接收到的提议为[n=4,v=5],并且保证不再接收序号小于4的提议请求;Acceptor Z先收到Proposer B的提议请求[n=4,v=5],后收到Proposer A的提议请求[n=2,v=8],由于2<4,因此抛弃该提议请求。


image.png | center | 510x259

一旦Proposer收到超过半数Acceptor所发的prepare提议响应,便会向所有Acceptor发送一个accept提议请求。
Proposer A收到两个提议响应[no previous]后,发送accept提议请求[n=2,v=8],会被所有Acceptor丢弃;Proposer B收到两个提议响应[n=2,v=8]后,发送accept提议请求[n=4,v=8],需要注意:n=4是最初Proposer B使用的序号,v=8不是初始值,而是提议响应中更高的v值。


image.png | center | 328x269

Acceptor X、Y、Z收到accept提议请求后,会通知所有Learner。


image.png | center | 454x268

参考资料

  1. The Byzantine Generals Problem
  2. The Part-Time Parliament
  3. Paxos Made Simple
  4. Paxos By Example
  5. 拜占庭将军问题 Wiki
  6. Paxos算法 Wiki
展开阅读全文

没有更多推荐了,返回首页