Archipelago

Lec 8容错同步共识算法

讲义完成更新于 2026-09-17

Lec 8 容错同步共识算法

对应 Lynch《Distributed Algorithms》第 5.1 节、第 6.1–6.3 节 · 主题:协同进攻不可能性、停止故障与拜占庭共识算法(FloodSet、EIG、EIGByz)

TL;DR

  • 在消息可能丢失的链路故障下,协同进攻问题(Coordinated Attack)被严格证明确定性不可解,印证了链路不可靠比节点故障更为本质。
  • 在可靠同步信道中,停止故障可通过 FloodSet 或 OptFloodSet 协议在 f+1f+1 轮内达成共识,利用至少存在一个无故障轮传递全部活跃值。
  • 指数信息收集树(EIG)结构可推广至拜占庭故障;当且仅当 n>3fn > 3f 时,EIGByz 通过自底向上的递归严格多数表决过滤伪造信息,达成共识。

1. 本讲要回答的核心问题

共识(consensus / agreement)是容错分布式系统的核心:一组进程各持初值,需在故障存在下达成一致的决定。本讲分两条线:

  1. 链路故障(消息可能丢失):即便最弱的“协同进攻(coordinated attack)”也确定性不可解;
  2. 进程故障(停止 / 拜占庭):链路可靠时共识可解,给出 FloodSet、EIG、EIGByz 算法。

这一对照揭示了一个深刻事实:链路不可靠比进程崩溃更难对付。

共识问题的三条标准条件:

共识正确性条件

  • 一致性(Agreement): 任两个(非故障)进程不会决定不同的值。
  • 有效性(Validity): 决定值必须合理——例如若所有进程初值同为 vv,则只能决定 vv。
  • 终止性(Termination): 所有非故障进程最终都做出决定。 :::

2. 协同进攻:链路故障下的确定性不可能性

场景. 若干将军要从不同方向协同进攻;只有全体进攻才能成功,部分进攻则全军覆没。将军间只能靠步行信使通信,而信使可能被俘(消息可能丢失)。通信图无向连通、人人皆知,且消息延迟有已知上界。其计算机科学本质是分布式数据库的提交问题(commit)。

形式化(nn 进程,已知图,初值 ∈{0,1}\in\{0,1\},11=进攻/提交,00=不进攻/中止;同步模型但允许任意消息丢失)的有效性取弱形式:

  • 若全体初值为 00,则只能决定 00;
  • 若全体初值为 11 且所有消息都送达,则只能决定 11。

定理 5.1. 设 GG 为两节点一条边的图,则不存在求解协同进攻问题的算法。(两点不可解 ⇒ 任意 ≥2\ge2 节点图不可解。)

证明(不可区分性链 / indistinguishability chain). 反设算法 AA 存在。设 α\alpha 为“双方初值 11、全部送达”的执行,由有效性双方在 rr 轮内决定 11;令 α1\alpha_1 为“rr 轮后丢弃全部消息”的执行,仍决定 11。

从 α1\alpha_1 出发,逐条删去最后一条消息构造执行序列,每相邻两个执行对某进程不可区分(∼i\overset{i}{\sim}): α1∼1α2∼2α3∼1⋯∼α′\alpha_1\overset{1}{\sim}\alpha_2\overset{2}{\sim}\alpha_3\overset{1}{\sim}\cdots\overset{}{\sim}\alpha' (α2\alpha_2 删去进程 1→2 的最后一条;对进程 1 不可区分,故 1 仍决定 1,由一致性 2 也决定 1;如此交替)。最终 α′\alpha' 为“双方初值 11、零消息送达”,仍被迫双方决定 11。

再考虑 α′′\alpha''(进程 1 初值 11、进程 2 初值 00、零消息):对进程 1 与 α′\alpha' 不可区分,故 1 决定 11,由终止+一致性 2 也决定 11。最后 α′′′\alpha'''(双方初值 00、零消息):对进程 2 与 α′′\alpha'' 不可区分,故 2 决定 11——但有效性要求决定 00,矛盾。□\square

直觉: 消息可丢失时,“全送达决定 1”与“全丢失决定 0”两个极端被一条每步只差一条消息的链连起来,每步都有人察觉不到差异,于是决定值无法在链上改变——一致性与有效性不可兼得。

3. 进程故障模型

链路可靠(消息必达),但至多 ff 个进程故障。两种故障:

  • 停止故障(stopping/crash failure): 进程可在任意时刻彻底停止,甚至在一轮发消息中途停止(任意子集消息被发出)。
  • 拜占庭故障(Byzantine failure): 进程可表现任意行为(任意初态、任意消息、任意转移),唯一限制是只能控制自己的输出与状态,不能篡改他人。

两模型的一致性/有效性略有不同:拜占庭版本只对非故障进程要求一致与有效。

4. 停止故障算法(完全图)

4.1 FloodSet:最简算法

FloodSet: 每进程维护集合 W⊆VW\subseteq V,初始为自己初值的单元素集。共 f+1f+1 轮,每轮广播 WW 并把收到的全部值并入 WW。f+1f+1 轮后:若 ∣W∣=1|W|=1 则决定其唯一元素,否则决定默认值 v0v_0。

正确性关键:“f+1f+1 轮中必有一轮无人故障”:

引理 6.1. 若第 rr 轮无进程故障,则该轮后所有仍活跃的进程 WW 相同。 引理 6.2. 若某轮后活跃进程 WW 都相同,则其后各轮仍然相同。 引理 6.3(关键). 若 i,ji,j 在 f+1f+1 轮后都活跃,则 Wi=WjW_i=W_j。 证明: ≤f\le f 个故障 ⇒ f+1f+1 轮中至少有一“干净轮” rr(无故障),引理 6.1+6.2 即得。□\square

定理 6.4. FloodSet 求解停止故障下的共识。 复杂度: f+1f+1 轮;O((f+1)n2)O((f{+}1)n^2) 条消息;每条 O(nb)O(nb) 位(bb=单值位数),共 O((f+1)n3b)O((f{+}1)n^3b) 位。

4.2 OptFloodSet:降低通信

观察:每进程最终只需知道“∣Wi∣=1|W_i|=1 时的那个值”或“∣Wi∣≥2|W_i|\ge2 这个事实”。故每进程最多广播两个值(首轮广播初值;之后首次见到不同值时广播该新值)。轮数仍 f+1f+1,消息降到 2n22n^2,通信 O(n2b)O(n^2b) 位。

4.3 指数信息收集 EIGStop

EIG(Exponential Information Gathering)用一棵标号树记录“谁告诉谁……的初值是什么”的传播链。

Tn,fT_{n,f} 有 f+2f+2 层(层 00=根到层 f+1f+1=叶)。层 kk 的每个节点有 n−kn-k 个孩子。根标号为空串 λ\lambda;标号 i1⋯iki_1\cdots i_k 的节点对每个 j∈{1,…,n}∖{i1,…,ik}j\in\{1,\dots,n\}\setminus\{i_1,\dots,i_k\} 各有一个标号 i1⋯ikji_1\cdots i_k j 的孩子。每条根到叶的路径是一条互异进程的链。

EIGStop 算法: 每进程持一棵 Tn,fT_{n,f},跑 f+1f+1 轮,给层 kk 节点在第 kk 轮末“装饰”一个值或 null。根装饰自己初值;节点 i1⋯iki_1\cdots i_k 装饰值 vv 意为“iki_k 在第 kk 轮告诉我:ik−1i_{k-1} 告诉过 iki_k……i1i_1 的初值是 vv”;null 表示该链被故障打断。决策:令 WW=树中所有非 null 值之集,∣W∣=1|W|=1 则决定其元素,否则 v0v_0。

引理 6.13. 若 i,ji,j 非故障,则 Wi=WjW_i=W_j。 证明: 设 v=val(x)iv=\mathrm{val}(x)_i,xx 不含 ii。(a) ∣x∣≤f|x|\le f:ii 非故障,会在第 ∣xi∣|xi| 轮把 vv 转给 jj,故 v∈Wjv\in W_j。(b) ∣x∣=f+1|x|=f+1:链 xx 有 f+1f+1 个互异索引,≤f\le f 个故障 ⇒ 必含某非故障 ℓ\ell,ℓ\ell 会把 vv 转给 jj,故 v∈Wjv\in W_j。对称得 Wj⊆WiW_j\subseteq W_i。□\square

定理 6.14. EIGStop 求解停止故障共识。用 f+1f+1 轮,O((f+1)n2)O((f{+}1)n^2) 消息。

5. 拜占庭故障算法(完全图,n>3fn>3f)

5.1 三进程不可能性的直觉

设进程 1,2,3 解一容错拜占庭共识,约定两轮、首轮广播初值、次轮转述。

三进程不可能性的直觉

  • α1\alpha_1:1,2 非故障初值 1,3 故障初值 0,3 向 1 谎称“2 在第 1 轮发了 0”。有效性迫使 1,2 决定 1。
  • α2\alpha_2:对称——2,3 非故障初值 0,1 故障,1 向 3 谎称“2 发了 1”。有效性迫使 2,3 决定 0。
  • α3\alpha_3:1,3 非故障(初值 1 与 0),2 故障,向 1 说自己是 1、向 3 说自己是 0。则 α3∼1α1\alpha_3\overset{1}{\sim}\alpha_1(故 1 决定 1)、α3∼3α2\alpha_3\overset{3}{\sim}\alpha_2(故 3 决定 0)——违反一致性,矛盾。

要害: 进程 1 能察觉“有人故障”,但分不清是 2 还是 3。

5.2 EIGByz 算法

与 EIGStop 同用 Tn,fT_{n,f}、同传播 f+1f+1 轮。决策规则不同——不能信任树中所有值,须用自底向上的递归多数表决屏蔽假值:

EIGByz 决策规则(newval)

f+1f+1 轮后,把所有 null 改成默认值 v0v_0。自叶向根计算 newval\mathrm{newval}:

  • 叶节点 xx:newval(x):=val(x)\mathrm{newval}(x):=\mathrm{val}(x);
  • 非叶节点 xx:newval(x):=\mathrm{newval}(x):= 其孩子 newval\mathrm{newval} 的严格多数值,若无多数则取 v0v_0。

最终决定 =newval(λ)=\mathrm{newval}(\lambda)。

正确性要点(n>3fn>3f 在此处发挥作用):

引理 6.16. 若标号 xx 以非故障进程索引结尾,则存在 vv 使所有非故障 ii 都有 val(x)i=newval(x)i=v\mathrm{val}(x)_i=\mathrm{newval}(x)_i=v。 归纳关键: 节点 xx 有 n−∣x∣≥n−fn-|x|\ge n-f 个孩子;n>3fn>3f ⇒ n−f>2fn-f>2f ⇒ 多数孩子的标号以非故障索引结尾,它们 newval\mathrm{newval} 一致,多数表决得正确值。

引理 6.18(公共路径覆盖). 存在一个公共路径覆盖:取所有形如 xixi(ii 非故障)的节点构成集 CC;每条根到叶路径含 f+1f+1 个互异索引的非根节点,≤f\le f 故障 ⇒ 必经过某非故障索引结尾的节点,故 CC 覆盖所有路径且其节点都公共。

由此可证一致性与有效性。

定理. EIGByz 在 n>3fn>3f 时求解拜占庭共识,用 f+1f+1 轮。

6. 本讲小结与共识算法全景

设定结论 / 算法轮数进程数要求
链路故障(协同进攻)不可解(定理 5.1)—任意 ≥2\ge2
停止故障FloodSet / OptFloodSet / EIGStopf+1f+1无要求
认证拜占庭EIGStop + 数字签名f+1f+1无要求
拜占庭EIGByz(指数)/ PolyByz(多项式)f+1f+1 / 2(f+1)2(f{+}1)n>3fn>3f

两条主线索:链路 vs 进程故障的本质鸿沟;以及 EIG 树作为从停止→认证→拜占庭逐级通用的数据结构。下一讲证明 n>3fn>3f 与 f+1f+1 轮这两个代价都是不可避免的。