Muti-Paxos 与 Fast-Paxos

目录

这是 Paxos 两部曲中的第二篇,附上两部曲连接

导言

之前介绍的 Paxos 算法用于在一个集群中就一个不可变变量的取值达成共识。但在工程中,直接适用 Basic-Paxos 场景较少,同时其工程实现难度也较大,因此出现了两种 Paxos 的变种 Multi-Paxos 与 Fast-Paxos 。

资料:

Paxos算法 - 维基百科,自由的百科全书 (wikipedia.org)

《Paxos Made Simple》翻译 - 姚灯灯! - 博客园 (cnblogs.com)

Multi-Paxos

Paxos 的典型使用中,需要在集群中确定一组命令序列。如果每个命令都通过一个 Basic Paxos 算法实例来达到一致,则会产生大量开销,最终效率会变得十分低下。

Multi-Paxos 的核心在于,如果 Proposer 是相对稳定不变的,则在提案提出的两个阶段中,第一个阶段就变得不必要。系统可以在接下来的 Paxos 算法实例中,跳过第一个阶段 。

为了实现这一目的,在同一个 Leader 执行每轮 Paxos 算法时,提案编号 I 每次递增一个值,并与每个值一起发送。Multi-Paxos 在没有故障发生时,将消息延迟(从 propose 阶段到 learn 阶段)从4次延迟降低为2次延迟。

Multi-Paxos中消息流的图形表示

Multi-Paxos 没有失败的情况

Client   Proposer      Acceptor     Learner
   |         |          |  |  |       |  | --- First Request ---
   X-------->|          |  |  |       |  |  Request
   |         X--------->|->|->|       |  |  Prepare(N)
   |         |<---------X--X--X       |  |  Promise(N,I,{Va,Vb,Vc})
   |         X--------->|->|->|       |  |  Accept!(N,I,V)
   |         |<---------X--X--X------>|->|  Accepted(N,I,V)
   |<---------------------------------X--X  Response
   |         |          |  |  |       |  |

跳过阶段1时的Multi-Paxos

在这种情况下,Basic Paxos 的后续实例 (由 I+1 表示) 使用相同的 Leader,因此,包含在 Prepare 和 Promise 的阶段1 (Basic Paxos 协议的这些后续实例) 将被跳过。注意,这里要求 Leader 应该是稳定的,即它不应该崩溃或改变。

Client   Proposer       Acceptor     Learner
   |         |          |  |  |       |  |  --- Following Requests ---
   X-------->|          |  |  |       |  |  Request
   |         X--------->|->|->|       |  |  Accept!(N,I+1,W)
   |         |<---------X--X--X------>|->|  Accepted(N,I+1,W)
   |<---------------------------------X--X  Response
   |         |          |  |  |       |  |

Fast-Paxos

Fast-Paxos 将 Basic-Paxos 进行了推广,以减少端到端消息延迟。在 Basic-Paxos 中,从客户端发起请求开始,到 Learn 阶段结束的消息延迟是 3 个消息延迟。而 Fast-Paxos 允许 2 个消息延迟,但要求:

  1. 系统由 3f+ 1 个 Acceptor 组成,以容忍最多 f 个错误 ( 而不是 Basic-Paxos 的 2f+1) ;

  2. 客户端需要直接将请求发送到多个目标。

直观上,如果Leader没有提议任何value,那么客户端可以直接发送 Accept 消息到 Acceptor 。Acceptor 会像 Basic-Paxos 一样运行,向Leader 和每个 Learner 发送 Accepted 的消息,从而实现从客户端到 Learner 的两消息延迟。

如果 Leader 检测到冲突,它通过发起新一轮投票,并发送 Accept 消息来解决冲突,通常是一个 Accepted 消息。这种有协调者参与的冲突恢复机制需要 4 个从客户端到 Learner 的消息延迟。

如果 Leader 提前指定了一种冲突恢复机制,就可以实现另一种优化,它允许 Acceptors 自己执行冲突恢复。因此,无协调的冲突恢复可能实现三个消息延迟 ( 如果所有的 Learner 都是 Acceptor,那么只有两个消息延迟)。

消息流: Fast-Paxos ,无冲突

Client    Leader         Acceptor      Learner
   |         |          |  |  |  |       |  |
   |         X--------->|->|->|->|       |  |  Any(N,I,Recovery)
   |         |          |  |  |  |       |  |
   X------------------->|->|->|->|       |  |  Accept!(N,I,W)
   |         |<---------X--X--X--X------>|->|  Accepted(N,I,W)
   |<------------------------------------X--X  Response(W)
   |         |          |  |  |  |       |  |

消息流: Fast-Paxos ,冲突的建议

有协调这参与的冲突恢复。注意:协议没有指定如何处理被丢弃的客户端请求。

Client   Leader      Acceptor     Learner
 |  |      |        |  |  |  |      |  |
 |  |      |        |  |  |  |      |  |
 |  |      |        |  |  |  |      |  |  !! Concurrent conflicting proposals
 |  |      |        |  |  |  |      |  |  !!   received in different order
 |  |      |        |  |  |  |      |  |  !!   by the Acceptors
 |  X--------------?|-?|-?|-?|      |  |  Accept!(N,I,V)
 X-----------------?|-?|-?|-?|      |  |  Accept!(N,I,W)
 |  |      |        |  |  |  |      |  |
 |  |      |        |  |  |  |      |  |  !! Acceptors disagree on value
 |  |      |<-------X--X->|->|----->|->|  Accepted(N,I,V)
 |  |      |<-------|<-|<-X--X----->|->|  Accepted(N,I,W)
 |  |      |        |  |  |  |      |  |
 |  |      |        |  |  |  |      |  |  !! Detect collision & recover
 |  |      X------->|->|->|->|      |  |  Accept!(N+1,I,W)
 |  |      |<-------X--X--X--X----->|->|  Accepted(N+1,I,W)
 |<---------------------------------X--X  Response(W)
 |  |      |        |  |  |  |      |  |

无协调者参与的相冲突恢复:

Client   Leader      Acceptor     Learner
 |  |      |        |  |  |  |      |  |
 |  |      X------->|->|->|->|      |  |  Any(N,I,Recovery)
 |  |      |        |  |  |  |      |  |
 |  |      |        |  |  |  |      |  |  !! Concurrent conflicting proposals
 |  |      |        |  |  |  |      |  |  !!   received in different order
 |  |      |        |  |  |  |      |  |  !!   by the Acceptors
 |  X--------------?|-?|-?|-?|      |  |  Accept!(N,I,V)
 X-----------------?|-?|-?|-?|      |  |  Accept!(N,I,W)
 |  |      |        |  |  |  |      |  |
 |  |      |        |  |  |  |      |  |  !! Acceptors disagree on value
 |  |      |<-------X--X->|->|----->|->|  Accepted(N,I,V)
 |  |      |<-------|<-|<-X--X----->|->|  Accepted(N,I,W)
 |  |      |        |  |  |  |      |  |
 |  |      |        |  |  |  |      |  |  !! Detect collision & recover
 |  |      |<-------X--X--X--X----->|->|  Accepted(N+1,I,W)
 |<---------------------------------X--X  Response(W)
 |  |      |        |  |  |  |      |  |

消息流:无协调者的冲突恢复、角色崩溃的 Fast-Paxos

(合并的Acceptor/Learner)

Client         Servers
 |  |         |  |  |  |
 |  |         X->|->|->|  Any(N,I,Recovery)
 |  |         |  |  |  |
 |  |         |  |  |  |  !! Concurrent conflicting proposals
 |  |         |  |  |  |  !!   received in different order
 |  |         |  |  |  |  !!   by the Servers
 |  X--------?|-?|-?|-?|  Accept!(N,I,V)
 X-----------?|-?|-?|-?|  Accept!(N,I,W)
 |  |         |  |  |  |
 |  |         |  |  |  |  !! Servers disagree on value
 |  |         X<>X->|->|  Accepted(N,I,V)
 |  |         |<-|<-X<>X  Accepted(N,I,W)
 |  |         |  |  |  |
 |  |         |  |  |  |  !! Detect collision & recover
 |  |         X<>X<>X<>X  Accepted(N+1,I,W)
 |<-----------X--X--X--X  Response(W)
 |  |         |  |  |  |