Paxos算法简介

前言
 

Paxos 算法是一种基于消息传递具有高度容错特性一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一。

在常见的分布式系统中,总会发生诸如机器宕机或者是网络异常等情况。

Paxos 算法需要解决的问题就是如何在一个可能发生上述异常的分布式系统中,快速且正确地在集群内部对某个数据的值达成一致,并且保证不论发生以上任何异常,都不会破坏整个系统的一致性。
 
Paxos 算法介绍
 
节点类型

  • 提议者(Proposer):提议一个值
  • 接受者(Acceptor):对每个提议进行投票
  • 告知者(Learner):聆听投票结果,但并不参与投票
    在这里插入图片描述

上图是 Paxos 算法的基本结构,许多提议者(Proposer)向接受者(Acceptor)递交提议,当一个接受者(Acceptor)接受了某个值之后,将结果告知 Learner.

 
执行过程
 

规定一个提议包含两个字段:[n, v],其中 n 为序号(具有唯一性),v 为提议值。

阶段一:Prepare 阶段

每个 Proposer 都会向所有 Acceptor 发送 Prepare 请求。

在这里插入图片描述

当 Acceptor 接收到一个 Prepare 请求,包含的提议为 [n1, v1],并且之前还未接收过 Prepare 请求,那么发送一个 Prepare 响应,设置当前接收到的提议为 [n1, v1],并且保证以后不会再接受序号小于 n1 的提议。

举个例子,看下面这张图,Acceptor Y 在收到 [n=2, v=8] 的 Prepare 请求时,由于之前没有接收过提议,因此就发送一个 [no previous] 的 Prepare 响应,设置当前接收到的提议为 [n=2, v=8],并且保证以后不会再接受序号小于 2 的提议。其它的 Acceptor 类似。

在这里插入图片描述

如果 Acceptor 接收到一个 Prepare 请求,包含的提议为 [n2, v2],并且之前已经接收过提议 [n1, v1]。

那么有两种情况

  • 如果 n1 > n2,那么就丢弃该提议请求
  • 否则,发送 Prepare 响应,该 Prepare 响应包含之前已经接收过的提议 [n1, v1],设置当前接收到的提议为 [n2, v2],并且保证以后不会再接受序号小于 n2 的提议。

如下图所示

Acceptor Z 收到 Proposer A 发来的 [n=2, v=8] 的 Prepare 请求,由于之前已经接收过 [n=4, v=5] 的提议,并且 n > 2,因此就抛弃该提议请求

Acceptor X 收到 Proposer B 发来的 [n=4, v=5] 的 Prepare 请求,因为之前接收到的提议为 [n=2, v=8],并且 2 <= 4,因此就发送 [n=2, v=8] 的 Prepare 响应(之前接受的提议),设置当前接收到的提议为 [n=4, v=5],并且保证以后不会再接受序号小于 4 的提议。

在这里插入图片描述

阶段二:Accept 阶段

当一个 Proposer 接收到超过一半 Acceptor 的 Prepare 响应时,就可以发送 Accept 请求。

也是两种情况:

  • Proposer A 接收到两个 Prepare 响应之后,就发送 [n=2, v=8] Accept 请求。该 Accept 请求会被所有 Acceptor 丢弃,因为此时所有 Acceptor 都保证不接受序号小于 4 的提议。
  • Proposer B 过后也收到了两个 Prepare 响应,因此也开始发送 Accept 请求。需要注意的是,Accept 请求的 v 需要取它收到的最大提议编号(这里指的是 Proposer B 收到的响应里最大 v 值)对应的 v 值,也就是 8。因此它发送 [n=4, v=8] 的 Accept 请求。

在这里插入图片描述

阶段三:Learn 阶段

Acceptor 接收到 Accept 请求时,如果序号大于等于该 Acceptor 承诺的最小序号,那么就发送 Learn 提议给所有的 Learner。当 Learner 发现有大多数的 Acceptor 接收了某个提议,那么该提议的提议值就被 Paxos 选择出来。

在这里插入图片描述

 
2PC/3PC/Paxos 对比
 

  • 二阶段提交协议(2PC)解决了分布式事务的原子性问题,保证了分布式事务的多个参与者要么都执行成功,要么都执行失败。但是,存在诸如同步阻塞、无限期等待、网络分区等问题。
  • 三阶段提交协议(3PC)在 2PC 基础上,添加了 preCommit 过程,从而避免了 2PC 的无限期等待问题。
  • 而 Paxos 算法引入了“过半”的理念,通俗地将就是少数服从多数。同时 Paxos 算法支持分布式节点角色之间的轮换,这极大地避免了分布式单点的出现,因此 Paxos 算法既解决了无限期等待的问题,也解决了网络分区问题,是目前来说最优秀的分布式一致性协议之一。

 
参考内容
 
《从 Paxos 到 ZooKeeper : 分布式一致性原理与实践》 - 倪超

Paxos By Example

猜你喜欢

转载自blog.csdn.net/u013568373/article/details/91491284
今日推荐