深入解析Paxos:分布式一致性算法的基石 – wiki基地


深入解析 Paxos:分布式一致性算法的基石

在分布式计算领域,一个核心的挑战是如何在多个节点之间达成共识(Consensus)。想象一个分布式数据库,多个客户端同时尝试修改同一条数据,系统必须保证所有节点最终对“哪个修改生效”这个问题达成一致,否则就会出现数据错乱。为了解决这个问题, Leslie Lamport 在上世纪 90 年代提出了 Paxos 算法,它为构建高可用的、容错的分布式系统奠定了理论基础。

尽管 Paxos 在工业界和学术界都享有盛誉,但它也因其难以理解而“臭名昭著”。本文旨在拨开 Paxos 的神秘面纱,通过清晰的讲解、形象的比喻和分阶段的剖析,帮助您深入理解这一分布式一致性算法的基石。


1. 什么是一致性问题?

在理解 Paxos 之前,我们首先要明确它要解决的问题。在一个分布式系统中,网络延迟、分区、节点宕机等故障是常态。一致性算法的目标就是在这种不可靠的环境下,确保系统满足以下三个核心属性:

  1. 协议(Agreement):所有存活的、正常的节点最终必须对同一个值达成共识。不能出现节点 A 认为值是 X,而节点 B 认为是 Y 的情况。
  2. 有效性(Validity):最终被确定的值,必须是某个节点曾经提议过(Proposed)的值。系统不能凭空创造一个值。
  3. 终止性(Termination):所有正常的节点最终都能学习到被确定的值,算法必须在有限时间内结束,而不是无限期地协商下去。

Paxos 正是为满足这些属性而设计的。


2. Paxos 的核心思想与角色

Lamport 用一个古希腊城邦 Paxos 的寓言故事来描述这个算法。这个城邦的议会通过一个“兼职”议员的系统来批准法案,议员们通过信使传递消息,但信使可能会丢失信息或重复传递,议员也可能随时离开或重新加入议会。这恰好模拟了分布式系统中的节点通信和故障。

为了简化理解,Paxos 算法将系统中的节点划分为三种逻辑角色,一个物理节点可以同时扮演一个或多个角色:

  • 提议者(Proposer):负责提出一个值(提议),希望获得整个系统的批准。可以有多个 Proposer 同时存在,它们之间相互竞争。
  • 接受者(Acceptor):负责对 Proposer 提出的提议进行投票。只有获得超过半数(Quorum,即多数派)Acceptor 同意的提议才能被最终确定。Acceptor 必须能够持久化存储自己的投票状态,以防宕机后丢失承诺。
  • 学习者(Learner):负责学习(Learn)最终被确定的值。一旦一个值被多数派 Acceptor 接受,Learner 就必须能够发现并接受这个值,从而在系统层面达成共识。

核心思想:关键在于“多数派”。一个提议只要被多数 Acceptor 批准,它就被“选定”。因为任何两个“多数派”集合都至少有一个共同的成员,这就保证了系统不会同时批准两个不同的值。


3. Basic Paxos:单值共识的艺术

Basic Paxos(或称 Classic Paxos)描述了如何对单个值达成共识。这个过程分为两个阶段,这既是 Paxos 的精髓,也是其难以理解的根源。

阶段一:准备阶段(Prepare Phase)

这是 Proposer 获取“领导权”或“提议权”的阶段。

  1. Proposer 的动作

    • 选择一个全局唯一的、单调递增的 提议编号 N。这个编号是 Paxos 的核心,用于区分提议的新旧。
    • 多数派 Acceptor 发送一个 Prepare(N) 请求。
  2. Acceptor 的响应

    • 当一个 Acceptor 收到 Prepare(N) 请求时,它会检查自己已经响应过的 Prepare 请求的最大编号 max_n
    • 如果 N > max_n:这意味着这是一个更新的提议。Acceptor 会:
      • 承诺(Promise)不再接受任何编号小于 N 的提议。
      • 将 N 记录为 max_n
      • 在响应中,附上它 曾经接受过(Accepted) 的编号最大的提议 (accepted_n, accepted_value)。如果它从未接受过任何提议,则返回一个空值。这个步骤至关重要,是保证协议安全性的关键。
    • 如果 N <= max_n:这意味着这是一个过时的提议,Acceptor 将直接忽略它或返回一个拒绝。

阶段二:接受阶段(Accept Phase)

当 Proposer 获得多数派的承诺后,它就进入了第二阶段,真正开始提议一个值。

  1. Proposer 的动作

    • 如果 Proposer 从 多数派 Acceptor 那里收到了对 Prepare(N) 的承诺响应。
    • 决定提议的值 V
      • 规则:检查所有响应。如果响应中包含了 accepted_value,那么 Proposer 必须 选择其中编号最大 accepted_n 对应的 accepted_value 作为本次提议的值 V。
      • 自由:如果所有响应都不包含任何 accepted_value,Proposer 可以自由选择它自己最初想提议的值。
    • 向这些做出承诺的 Acceptor 发送 Accept(N, V) 请求,要求它们接受这个值为 N 的提议。
  2. Acceptor 的响应

    • 当 Acceptor 收到 Accept(N, V) 请求时,它会检查 N 是否大于或等于它所承诺的 max_n
    • 如果 N >= max_n:Acceptor 接受这个提议,即将 (N, V) 持久化,并向 Learner 发送 Accepted(N, V) 消息。
    • 如果 N < max_n:说明在 Proposer 准备和发送接受请求之间,有一个更大编号的提议已经获得了承诺。Acceptor 会拒绝这个 Accept 请求。

共识的达成

当一个值 V 被 多数派 Acceptor 接受后,我们就认为这个值被“选定”(Chosen)了。由于任何两个多数派集合必有交集,这保证了不可能有两个不同的值同时被选定。

Learner 通过接收 Accepted 消息来学习被选定的值。当它发现某个值 V 被多数派 Acceptor 接受时,它就知道共识已经达成。

一个比喻:议会投票

  • 准备阶段:一个议员(Proposer)想提出法案。他先给其他议员(Acceptor)发便签(Prepare),便签上写着提议号“第 N 号”。他请求大家:“请承诺不理会任何比 N 旧的提议,并告诉我你是否已经投票给某个法案了?”
  • 接受阶段:如果他收到足够多的承诺,他会看大家反馈回来的信息。如果有人说“我已经投了第 M 号法案(M < N)”,他必须放弃自己的想法,转而提议这个 M 号法案。如果没人投过票,他就可以提自己的法案。然后他正式发文(Accept):“请大家为第 N 号提议(内容为 V)投票!”
  • 学习:一旦某个法案获得多数票,书记员(Learner)就将其记录在案,成为正式法律。

4. Multi-Paxos:从单值到日志

Basic Paxos 每次只能对一个值达成共识,而且每次都需要完整的两阶段流程,效率很低。在实际应用中,系统需要对一系列操作(如数据库的事务日志)达成共识。这就是 Multi-Paxos 发挥作用的地方。

Multi-Paxos 的核心思想是:选举一个唯一的领导者(Leader),这个领导者同时也是唯一的 Proposer。

  1. 领导者选举:首先,通过一次 Basic Paxos 选出一个 Leader。
  2. 优化流程
    • 一旦 Leader 确定,它就可以连续地提出一系列提议来构建一个操作日志。
    • 对于后续的提议,Leader 可以 跳过准备阶段。因为它就是唯一的 Proposer,它知道没有其他人会和它竞争提议编号。它只需要持续地进行第二阶段(Accept Phase),从而将两阶段流程简化为一阶段,大大提高了效率。
    • 只有当 Leader 宕机,或者网络问题导致其他节点认为 Leader 失效时,系统才会重新触发新一轮的选举(回到 Basic Paxos 流程),选举出新的 Leader。

Multi-Paxos 是 Paxos 在实际系统(如 Google Chubby、Zookeeper 的 ZAB 协议)中应用的基础形式,它将 Paxos 从一个理论模型变成了工程上可行的方案。


5. Paxos 与 Raft

由于 Paxos 的复杂性,后来斯坦福大学的 Diego Ongaro 和 John Ousterhout 设计了 Raft 算法。Raft 在设计上更注重可理解性,它将一致性问题分解为三个相对独立的子问题:领导者选举、日志复制和安全性。

  • 相似之处:Raft 的核心思想与 Multi-Paxos 非常相似,都是先选举出一个强领导者,然后由领导者负责复制日志。
  • 不同之处:Raft 提供了更明确的机制和更少的歧义,例如它对领导者选举、成员变更等流程都做了详细的规定,使得工程师更容易正确地实现它。

可以说,Raft 是 Paxos 思想的一种更具体的、更工程化的实现。


结论

Paxos 是一个优美而强大的算法,它在理论上解决了分布式系统中最棘手的一致性问题,为构建可靠的、容错的系统提供了坚实的基石。尽管它的原始形式难以直接实现,但其核心思想——通过多数派承诺和接受来保证安全,通过提议编号来区分新旧——影响了之后几乎所有的一致性协议。

理解了 Paxos,就等于掌握了打开分布式系统神秘大门的钥匙。无论是研究 ZAB、Raft 还是其他变种,Paxos 的思想都将贯穿其中。希望通过本文的解析,您能对 Paxos 不再畏惧,并能欣赏其设计的精妙之处。

滚动至顶部