3 Paxos 存在问题吗

在过去的10多年中,Leslie LamportPaxos 协议 [15] 几乎称为一致性算法的代名词:它是教学中最常用到的算法,同时很多一致性算法实现都基于 Paxos。首先,Paxos 定义了能够在单一决策

上达成一致的协议,比如单个复制日志条目。我们把这个子集称为 Single-decree Paxos。然后合并这个协议的多个实例来实现一系列决策,例如一个日志( 多 Paxos)。Paxos 能够确保安全和活性(Liveness),并支持集群成员变更。它的正确性已被证明,通常情况下也非常有效。

不幸的是,Paxos 存在两个致命的缺陷。第一个是 Paxos 非常难懂,其完整的解释晦涩难懂,很少有人能完全理解,只有少数人以付出巨大努力为代价才算理解了 Paxos。因此,很多人尝试用一些简单的术语来解释 Paxos [16, 20, 21]。这些解释都集中在 Single-decree 子集,但仍是很有挑战的。在 NSDI 2012 会议上的一次非正式调查显示,我们发现很少有人熟悉 Paxos,即使是一些有经验的研究人员也不例外。我们自己也曾受其折磨,直到我们读过几篇简化对 Paxos 理解的文章,并设计了我们自己的算法之后,才算理解了整个 Paxos 协议,然而这个过程花费了我们将近一年的时间。

我们假定 Paxos 的晦涩来源于它以 Single-decree 子集为基础的。Single-decree Paxos 晦涩且微妙:它被分为两个阶段,但没有简单直观的解释,且难以单独去理解。正因为如此,它很难直观地说明为什么 Single-decree 协议是有效的。多 Paxos 的组成规则反倒增加了额外的复杂和微妙。我们认为,在多决策上达成一致的整个问题,是可以采用其它更加直接和明显的方式来进行分解的。

Paxos 的第二个缺陷是,它难以为实际环境中的系统实现提供良好的基础。原因之一是,业界并没有广泛的对 多 Paxos 算法进行商讨。Lamport 的描述大部分都是关于 Single-decree Paxos 的,他只是给出了实现 多 Paxos 的一些可能的方式,缺少很多细节。有许多实现和优化 Paxos 的尝试,比如 [26]、[39] 和 [13],但它们都互不相同,且与 Lamport 给出的说法也不同。像 Chubby 系统已经实现了类似 Paxos 的算法,但是大多数情况下都没有披露更多的细节。

此外,Paxos 的架构并没有对构建实际系统带来优势,这也是 Single-decree 分解带来的另一个后果。例如,独立地挑选出一组日志条目,然后把它们变成一个连续的日志,并没有带来什么好处,反倒增加了复杂性。基于日志来设计系统是更加简单而有效的,新的日志条目只需按照指定的顺序追加到日志中去。另一个问题是,Paxos 使用对等的 peer-to-peer 方式作为其核心(尽管最终提出了一种使用弱 Leader 形式来优化性能的建议)。这种方法只有在做出单个决策的情况下才有意义,但几乎没有实际系统会选择使用这种方式。如果需要做一系列决策,简单高效的做法是:先选出一个 Leader,然后由 Leader 来协调做出决策。

因此,构建实际系统无法从 Paxos 获取更大的益处。每个始于 Paxos 的实现,都会发现很难实现它,然后开发了一个完全不同的架构。这很耗时而且容易出错,并且理解 Paxos 的难度又加剧了这个问题。证明理论的正确性,Paxos 公式可能是一个很好的选择,但是实现上有很大的不同,Paxos 理论证明根本体现不出价值。下面是来自 Chubby 实现的一条有代表性的评论:

Paxos 算法的描述与实际实现之间存在巨大的鸿沟…最终的系统将会基于一个没有被证明的协议而构建起来。

由于这些问题,我们认为 Paxos 没有为系统构建或者教学提供一个良好的基础。鉴于一致性算法对于构建大规模软件系统的重要性,我们决定尝试设计一种比 Paxos 更好的一致性算法,Raft 算法就这样被设计出来。

results matching ""

    No results matching ""