try ai
科普
编辑
分享
反馈
  • 分布式共识

分布式共识

SciencePedia玻尔百科
核心要点
  • 分布式共识是多个独立计算机在通信不可靠和可能出现故障的情况下,就单一值达成一致的过程。
  • FLP 不可能定理证明,在异步网络中,没有任何确定性共识算法能够同时保证安全性(正确性)和活性(终止性)。
  • 像状态机复制(SMR)这样的技术利用共识来创建容错系统,其行为如同单台高可靠性的计算机。
  • 共识的原理超越了计算领域,为机器人学中的协调、经济学中的大规模优化乃至人类谈判提供了模型。

引言

在我们这个高度互联的世界里,从云服务到全球金融,系统不再是单体实体,而是协同工作的庞大独立计算机集群。这种分布式结构带来了巨大的能力和弹性,但同时也引入了一个根本性的挑战:这些独立的部件,通过不可靠的网络进行通信,且可能发生各自的故障,它们如何能就一个单一、一致的真相达成共识?没有一个共享的“白板”或中央权威,实现可靠的协调就成了一个深刻的难题,而其解决方案正支撑着我们数字基础设施的根本稳定性。本文将直面这一挑战。首先,在“原理与机制”部分,我们将探讨一致性的理论极限,如“两将军问题”和“FLP 不可能定理”,并检视那些使我们能够构建安全且最终具有活性的系统的核心策略——从容错到数学平均。随后,“应用与跨学科联系”部分将揭示这些基础概念如何被应用于构建从坚不可摧的数据库和可扩展的区块链,到协作的机器人集群和经济谈判模型等各种系统。让我们开始这场旅程,深入问题的核心,去理解在这个混乱世界中铸就一致的艺术与科学。

原理与机制

一致的艺术:从一个房间到多个世界

想象一下,你和一群朋友正试图决定要看哪部电影。如果你们都在同一个房间里,这个过程相对简单。你们可以用一块白板列出选项,举手投票,并立即看到结果。即使大家同时说话,你们也可以建立一个简单的规则,比如用一根“发言棍”,来确保一次只有一个人可以修改列表。在计算机世界里,这就像一个多核处理器。不同的核心(你的朋友们)都看着同一个共享内存(白板)。一个简单而极速的机制,称为​​自旋锁​​,建立在硬件执行原子性“测试并设置”(test-and-set)操作的能力之上,可以充当“发言棍”的角色,确保​​互斥​​——即没有两个核心会在完全相同的瞬间尝试写入同一内存位置。这种设置保证了​​安全性​​:共享数据永远不会被破坏。至于过程是否公平,每个人是否都有机会发言(一种称为​​活性​​的属性),则可能取决于其他因素,但过程的完整性得到了保证。

现在,想象一个更难的问题。你和你的朋友们身处不同的城市,通过短信交流。没有共享的白板。消息可能会丢失、乱序到达,或者需要几分钟才能送达。你们如何就一部电影达成一致?你甚至如何知道每个人都已经看到了最新的投票结果?

这就是​​分布式共识​​的挑战。我们不再处于一个房间,而是身处多个独立的世界,仅通过不可靠的信使连接。核心任务是设计一个协议,一套规则,让一组独立的计算机进程能够在现实世界的混乱中,就一个单一的值——一个决策、一个交易顺序、一个领导者——达成一致。这个问题是现代计算的基石,从云基础设施和数据库到加密货币和机器人集群,无不如此。

不可靠的信使与两将军问题

在我们构建解决方案之前,我们必须认识到这个问题的深度。计算机领域有一个经典故事,它直击了问题的核心:​​两将军问题​​。

想象两支盟军,由两位将军分别指挥,各自驻扎在俯瞰山谷中敌人的独立山头上。他们只有在同一时间发起攻击才能获胜。他们唯一的通信方式是派遣信使,而信使必须穿过敌军控制的山谷,并有可能被俘。

第一位将军决定:“黎明时分进攻”,并派出一位信使。信使成功抵达。现在第二位将军知道了计划。但她会进攻吗?她知道,第一位将军只有在确信她已收到消息的情况下才会进攻。于是,她派回一位信使进行确认:“我已收到计划,并将在黎明时分进攻。”

但如果那位信使被俘了呢?第二位将军深知这一风险,不敢贸然进攻,因为第一位将军可能没有收到她的确认,从而会按兵不动。第一位将军,即使收到了确认,也面临同样的困境。他知道第二位将军需要确认他收到了她的确认。所以他必须再派另一位信使回去,如此往复。

无论他们发送多少条消息,他们永远无法达成​​公共知识​​。没有一位将军能百分之百地确定另一方已承诺发起攻击。这不仅仅是一个有趣的悖论;它是具有不可靠通信的系统的根本局限。它证明了任何需要两方之间完美、有保证的协调的行动都是不可能的。这带来了深远的影响,例如,在设计从死锁中恢复的系统时。任何要求两个死锁进程首先就恢复行动达成一致的恢复计划都注定会失败。我们必须找到一种更聪明的方法。

伟大的权衡:安全性与活性

如果有保证的一致性是不可能的,那么分布式世界中的一切是如何运作的呢?答案在于我们如何定义“正确性”这一概念上的一次优美而深刻的转变。对于单台计算机上的简单算法,正确性是直截了当的:它必须产生正确的答案(​​部分正确性​​),并且必须保证能够结束(​​终止性​​)。两者的结合被称为​​完全正确性​​。

在分布式世界里,我们无法两者兼得。Fischer、Lynch 和 Paterson 在一项里程碑式的研究成果中证明了这一点,该成果被称为 ​​FLP 不可能定理​​。它指出,在一个消息延迟没有上限(异步)且哪怕只有一个进程可能因崩溃而失败的网络中,不存在任何能够解决共识问题并同时保证终止性的确定性算法。核心问题在于,你无法区分一个进程是已经崩溃了,还是只是响应得极其缓慢。

因此,计算机科学家们做出了一个绝妙的权衡。他们将正确性分为两个部分:

  1. ​​安全性(“坏事永不发生”)​​:这个属性必须始终保持,无论发生什么。对于共识而言,最重要的安全性属性是​​一致性​​:任意两个健康的进程永远不会决定不同的值。一个可能对两件不同的事情达成一致的系统比无用更糟;它是危险的。安全性是不可协商的。

  2. ​​活性(“好事终将发生”)​​:这个属性指出,所有健康的进程最终都会决定一个值。这是我们在权衡中被迫放宽的部分。我们无法在完全异步的系统中保证活性。然而,我们可以构建在更有利、更实际的假设下具有活性的算法——例如,网络虽然偶尔混乱,但不会永远混乱下去,消息最终会送达。

这种安全性-活性分解是容错系统的哲学基础。我们构建的系统始终是安全的,并且我们将其设计为在大多数现实世界场景中最终具有活性 [@problem_id:3226881, @problem_id:3627675]。

驯服混乱:故障、法定人数与数字指纹

要构建一个安全的系统,我们必须首先了解我们的敌人。我们将面临什么样的故障?它们通常分为两类:

  • ​​崩溃故障​​:一个进程或服务器直接停止工作。它变得沉默。这就像你群聊中的一个朋友睡着了——他们不再参与,但也不会主动试图破坏事情。

  • ​​拜占庭故障​​:这是一种更为险恶的故障,得名于拜占庭将军问题(两将军故事的多军队版本)。一个拜占庭进程是恶意的。它可以撒谎,向不同的对等节点发送不同的消息,并主动阻挠一致的达成。这好比你群聊中的一个叛徒,向不同的人悄悄传递不同的计划。

防御这两种故障的方法是​​复制​​和​​投票​​。为了容忍多达 fff 个崩溃故障并且仍然能够读取数据,你至少需要 n=f+1n = f+1n=f+1 个副本。在最坏的情况下,fff 个副本崩溃,但你仍有一个副本来响应请求。

对于拜占庭故障,要求要严格得多。为了容忍 fff 个可能主动撒谎并试图颠覆过程的叛徒,系统需要显著更多的冗余。已有证明表明,典型的异步协议要达成共识,总共至少需要 n=3f+1n = 3f+1n=3f+1 个副本。这个界限确保了即使面对来自故障节点的协同欺骗,也总有足够多的诚实节点来达成明确的一致。做出决策所需的一组节点被称为​​法定人数 (quorum)​​。

但你如何判断一条消息是否包含谎言?一个拜占庭服务器可能会返回一个格式完美但数据被巧妙篡改的片段。在这里,我们从密码学中借用了一个神奇的工具:​​默克尔树 (Merkle tree)​​。想象磁盘上的所有数据块都是一棵树的叶子节点。我们对每个数据块进行哈希计算。然后,我们将这些哈希值两两配对并对它们一起进行哈希,如此层层向上,直到得到一个单一的“根哈希”。这个根哈希充当了整个磁盘内容的数字指纹。我们将这个微小的根哈希存储在一个安全、可信的地方。

现在,当一个服务器向我们发送一个数据块时,它还会发送“认证路径”——重新计算根哈希所需的少量兄弟哈希值。我们可以执行几次快速的哈希运算(与块的数量 BBB 的对数 log⁡B\log BlogB 成正比,而不是 BBB 本身!),然后看看我们计算出的根哈希是否与可信的那个相匹配。如果一个恶意服务器哪怕只更改了数据块中的一个比特,最终的哈希值也会以极高的概率变得完全不同(对于一个 kkk 位的哈希,意外碰撞的几率大约是 2k2^k2k 分之一)。这项优美的技术使我们能够高效地拒绝谎言,只需信任一小片数据。

共识之舞

那么,一群机器实际上是如何收敛到一个值的呢?其中一个最优雅和直观的机制是一种迭代平均的形式,我们可以将其想象成一种数学之舞。

想象网络中的每台机器,或称“代理”,都从一个标量值——它的初始意见——开始。在离散的时间步长中,每个代理与其在网络中的直接邻居进行通信。然后,它将自己的值更新为其先前值和其邻居值的加权平均值。这个简单的局部规则,在整个网络中应用时,会产生一个显著的全局效应。

在数学上,这个过程可以用一个简单的线性方程来描述:

xk+1=Wxkx^{k+1} = W x^{k}xk+1=Wxk

这里,xkx^kxk 是一个向量,包含了所有代理在步骤 kkk 的值。其中的奥秘在于​​迭代矩阵​​ WWW。这个矩阵不是任意的;它是根据网络本身的结构构建的,特别是来自图论中一个著名的对象——​​图拉普拉斯矩阵​​ (graph Laplacian),LLL。矩阵 WWW 的形式通常是 W=I−αLW = I - \alpha LW=I−αL,其中 α\alphaα 是一个控制收敛速度的步长。

这个迭代过程做了什么?它将系统的状态分成两部分。一部分是所有代理值的平均值。这部分是一个​​守恒量​​——网络中值的总和保持不变,所以平均值永远不会改变。另一部分是​​分歧​​,即与平均值的差异向量。乘以 WWW 的“舞蹈”在每一步都有系统地缩小这个分歧向量,直到它完全消失。最终,所有代理都收敛到它们从一开始就可以达成一致的那个值:它们初始状态的平均值。

这场舞蹈的速度——即达成共识的速度——由网络的拓扑结构决定。一个连接良好的图允许信息快速混合,从而导致快速收敛。这个属性由拉普拉斯矩阵的特征值所捕获。收敛速率由最大非零特征值与最小非零特征值之比决定,这个量被称为​​条件数​​ κ(L)\kappa(L)κ(L)。较小的条件数意味着更快的共识。在一个理论与实践完美结合的例子中,我们常常可以“设计”网络,调整通信链路上的权重,以最小化这个条件数,从而为给定的拓扑创建最快的共识算法。

这种线性共识不仅仅是一个理论上的好奇之物;它是构建复杂分布式算法的强大基石,例如在需要代理计算全局平均值以指导其局部决策的大规模优化问题中。

如果系统不是完美的呢?如果一个代理的传感器有故障,向网络中引入了一个恒定的偏差呢?这场舞蹈就会被打乱,代理们会稳定在一个存在持续分歧的状态。但即便如此,我们也可以再增加一层优雅。利用控制论的原理,我们可以给每个代理一个简单的局部记忆(一个积分器),使其能够学习并抵消未知偏差的影响。这是​​内部模型原理​​的一个例子,这是一个深刻的思想,它指出要抑制一个扰动,控制器必须包含该扰动的模型。这种分布式的、自我修正的机制恢复了完美的共识,展示了在一个混乱的世界中,反馈在达成一致方面所具有的力量与美感。

应用与跨学科联系

在我们之前的讨论中,我们深入了分布式共识的核心,探索了那些让一群独立的、易于故障的计算机能够就单一真相达成一致的原理和机制。我们视之为逻辑战胜混乱的胜利,是在一个混乱、不可预测的世界中创造秩序和确定性的方式。但是,一个强大的工具的好坏取决于我们能用它来建造什么。现在,我们提出这样一个问题:凭借这种铸就一致的非凡能力,我们能竖起怎样宏伟的结构?

事实证明,答案惊人地广泛。共识的线索贯穿了现代技术的肌理,并延伸到我们可能意想不到的领域,从物理机器人的编排到经济谈判的建模。它是一个统一的概念,使我们能够构建不仅健壮可靠,而且能在巨大规模上实现协调和智能的系统。

构建坚不可摧的数字基础设施

让我们从最直接,或许也是最关键的应用开始:让我们的数字世界变得可靠。几乎你今天使用的每一个大规模服务,从云存储到在线银行,都暗中依赖于一群协同工作的计算机。挑战在于让这个“合唱团”唱出同一首歌,即使其中一些成员忘记了歌词或突然离开了舞台。

共识所能实现的最基本的技巧被称为​​状态机复制(SMR)​​。想象你有一个单一而宝贵的服务——比如说,一个关键系统的审计日志,它必须以精确、不可更改的顺序记录每一个事件。一台单独的计算机是一个单点故障。但通过共识,我们可以用许多物理计算机构建一台逻辑计算机。我们给每台机器一份审计日志的副本和一份添加新条目的规则副本。当一个新事件发生时,这些机器运行一个共识协议,就下一个要追加的条目达成一致。因为它们都同意相同的操作序列,所以它们的日志保持一致。这创造了一个单一、权威的历史记录,能够抵御单台机器的崩溃。这个群体就像一台理想的、绝无错误的机器,为我们构建其他一切提供了信任的基础。

一旦我们拥有了这台绝无错误的机器,我们就可以让它为我们管理事务。考虑一个服务器集群,需要共享一些稀缺、昂贵的资源,比如高端图形处理单元(GPU)。没有协调,两台服务器可能会试图抢占同一个 GPU,导致混乱。我们可以通过使用我们的复制状态机来实现一个分布式信号量来解决这个问题。这台机器的“状态”仅仅是可用 GPU 的数量和一个等待服务器的队列。一个 Acquire 请求是发送给状态机的命令。共识协议对这些命令进行排序,状态机的逻辑确定性地在有空闲 GPU 时分配一个,或者将请求加入队列。安全性得到了保证:因为所有副本看到相同的命令顺序,它们绝不会分配比实际存在的更多的 GPU。

但这个解决方案揭示了一个更深层次的问题。如果一台服务器获取了 GPU 然后崩溃了怎么办?它将永远不会发送 Release 命令。这个 GPU 现在就永远地从系统中丢失了,被一个“幽灵”持有。这会导致所有等待的服务器陷入饥饿状态。系统是安全的,但它不具备活性。解决方案与问题本身一样微妙而优雅:有时间限制的租约和​​隔离 (fencing)​​。系统不是永久授予资源,而是授予一小段时间。持有者必须定期续约。如果它崩溃了,租约就会到期,状态机就可以安全地收回资源。

这种隔离“幽灵”——来自崩溃或被假定死亡的组件的过时请求——的想法是一个反复出现的主题。想象一个分布式的 cron 定时任务调度器,它必须精确一次地触发一个关键任务(比如计算每日财务报告)。系统选举一个领导者来触发该任务。但如果领导者发送了触发命令后,在知道是否成功之前就崩溃了怎么办?一个新的领导者将被选举出来,并且由于担心任务从未运行,它可能会再次运行它。为了防止这种情况,我们使用共识来维护一个单调递增的“隔离令牌”或纪元号。每个新领导者都会获得一个更高的令牌。它将这个令牌连同任务请求一起发送给执行服务。执行服务本身是一个有状态的系统,它会记住针对给定任务所见过的最高令牌。它将拒绝任何携带比其记录中的令牌更低的请求。因此,来自一个旧的、“幽灵”领导者的消息被隔离墙挡住,无害地从一个由共识建立的更高权威上弹开。

当我们考虑安全性时,赌注变得更高。在一个大型组织中,访问控制——谁被允许做什么——是由一个基于角色的访问控制(RBAC)系统管理的。如果一名员工被解雇,他们的访问权限必须立即且在任何地方被撤销。在一个全球分布式的系统中,这是一个深刻的挑战。如果发送了一个撤销命令,但网络分区将某些服务器与其余部分隔离开来,会发生什么?处于隔离分区中的服务器可能无法得知撤销信息,并可能错误地授予访问权限。这是一个灾难性的故障。解决方案优美地阐释了著名的 CAP 定理。为了保证原子性的撤销(一种强一致性属性),我们必须使用共识协议进行更新。这意味着只有大多数服务器才能提交一次撤销。处于少数派分区中、无法与多数派通信的服务器知道自己可能已经过时。为了保持安全,它必须采取一种“故障关闭”策略:在有疑问时,拒绝访问。它仍然可用于查询,但只提供唯一安全的答案,“不”。在这里,共识提供了确定性的基石,使系统能够在面对模糊性时推理自身状态并安全地采取行动。

释放并行性与大规模计算

如果说共识的第一个故事是关于构建可靠的系统,那么第二个故事就是关于构建快速和可扩展的系统。在高性能计算的世界里,挑战往往是如何将一个巨大的任务分配给许多处理器,而不会让它们互相干扰。

有时,共识是我们用来确保正确性的“重锤”,但理解其成本有助于我们欣赏更轻量级的工具。例如,在设计一个分布式内存分配器时,一个关键的安全性要求是防止“二次释放”——将同一块内存两次返还给空闲池。人们可以使用一个成熟的共识协议来就每一次 free 操作达成一致,这当然是正确的。然而,如果我们需要保护的状态仅仅是内存块本身上的一个标志(“已分配” vs “空闲”),一个简单的硬件级原子指令,如“比较并交换”(CAS),可以以远高于此的效率实现同样的安全保证。这教给我们一个宝贵的教训:共识是复杂、多步协议的最终裁决者,但对于简单的、单变量的状态改变,我们常常可以找到更直接、性能更好的解决方案。

在为极端并行性构建的系统(如分片区块链)中,共识的成本成为一个核心设计参数。一个区块链可以通过将其交易处理负载分散到许多并行的节点组中来进行“分片”。理论上,这意味着 SSS 个分片可以提供 SSS 倍的吞吐量。然而,这些分片不能在完全隔离的情况下运行;它们必须定期同步以形成一个单一、一致的全局状态。这个同步步骤是一个共识屏障。在此阶段,所有分片必须暂停其正常工作并进行通信,以就全局状态达成一致。这个协调阶段引入了无法并行的开销。因此,总系统吞吐量并非理想的各部分之和,而是受限于生产性工作时间与在共识屏障处等待的时间之比。这是 Amdahl 定律的一个优美的分布式系统版本:任何任务的串行部分,在这里即全局一致,将最终限制从并行化中获得的加速比。

然而,共识算法的结构本身可以激发执行大规模计算的新方法。考虑一下在一组分布于数千个节点上的庞大数据集上训练一个现代机器学习模型的艰巨任务。目标是找到一组能够最小化全局损失函数的模型参数。这可以被重新定义为一个共识问题:所有节点必须就最优参数向量达成一致。在像分布式最速下降法 这样的方法中,每个节点根据其本地数据切片计算一个梯度。然后,它不仅根据自己的梯度更新其本地参数副本,还通过将其参数拉近其邻居的参数来更新。这种朝向一致的“拉力”是一种强制共识的惩罚。经过许多轮的局部计算和邻里通信——即使存在通信延迟——整个节点网络也会共同朝着一个单一的最优解下降。共识机制不再是一个黑盒,而是被编织进了优化算法本身的结构之中。

协调物理世界与经济世界

分布式共识最美丽和最令人惊讶的方面或许是其核心思想如何超越数字领域。协调具有局部信息和通信延迟的独立代理的问题并非计算机所独有。它是生物学、工程学和经济学中的一个基本问题。

想象一个自主机器人或无人机集群,任务是探索一个区域。我们希望它们能收敛到一个单一的目标位置——一个共识目标。然而,我们还需要它们彼此保持通信链路以共享信息;它们不能相距太远。我们可以设计一个基于人工势场的分布式控制器。每个机器人都感受到一股将其拉向邻居的引力,鼓励达成共识。同时,如果它太靠近其通信范围的边缘,它会感受到一股强大的斥力,形成一个防止群体断开连接的“屏障”。最终的行为是,集群作为一个有凝聚力的、连接的整体朝向一个共同点移动,这是一个平衡了一致性与连通性的共识协议的物理体现。

这种分布式控制的概念可以被推广。不考虑物理机器人,而是考虑一个大型经济系统或电网中的“代理”。中央权威不可能实时了解每个组件的状态并发出最优指令。相反,我们可以使用像交替方向乘子法(ADMM)这样的数学框架,以分布式方式解决巨大的优化问题。一个巨大而棘手的中央问题被分解为每个代理的更小的局部问题。这些代理解决自己的问题,然后进入一个共识步骤,在此步骤中,它们调整自己的解决方案以与一个共享的全局变量(例如,电力的市场价格)对齐。这种局部优化和全局寻求共识的迭代循环,使得整个系统能够在没有中央独裁者的情况下收敛到全局最优行为。

当我们将这个比喻应用于人类互动时,它变得更加强大。我们可以将一场国际贸易谈判建模为一个分布式算法。每个国家都有自己的偏好和目标(其局部的“效用函数”)。目标是就一个单一、统一的政策(例如,关税水平)达成一致,这个政策在某种意义上对集体是最好的。使用相同的 ADMM 框架,我们可以模拟一个谈判过程,其中每个国家首先确定其理想政策,然后进入一个“共识”阶段,在此阶段它看到平均提案并调整自己的立场。这个过程重复进行,局部利益和全局一致性相互迭代地塑造对方,直到谈判系统收敛到一个稳定、相互接受的结果。这是一个惊人的认识:为使计算机可靠而设计的数学机制,也可以为描述我们人类如何合作以达成共识提供一种强大的新语言。

从确保一个比特的可靠存储,到编排一个机器人集群,再到模拟全球经济的复杂舞蹈,分布式共识的原理揭示了自己是一个深刻而统一的思想。它是从离散、不完美的部件中创造一个连贯整体的艺术与科学——一个我们在试图构建或理解几乎每一个复杂系统时都会面临的基本挑战。