Lec 8容错同步共识算法
Lec 8 容错同步共识算法
对应 Lynch《Distributed Algorithms》第 5.1 节、第 6.1–6.3 节 · 主题:协同进攻不可能性、停止故障与拜占庭共识算法(FloodSet、EIG、EIGByz)
TL;DR
- 在消息可能丢失的链路故障下,协同进攻问题(Coordinated Attack)被严格证明确定性不可解,印证了链路不可靠比节点故障更为本质。
- 在可靠同步信道中,停止故障可通过 FloodSet 或 OptFloodSet 协议在 轮内达成共识,利用至少存在一个无故障轮传递全部活跃值。
- 指数信息收集树(EIG)结构可推广至拜占庭故障;当且仅当 时,EIGByz 通过自底向上的递归严格多数表决过滤伪造信息,达成共识。
1. 本讲要回答的核心问题
共识(consensus / agreement)是容错分布式系统的核心:一组进程各持初值,需在故障存在下达成一致的决定。本讲分两条线:
- 链路故障(消息可能丢失):即便最弱的“协同进攻(coordinated attack)”也确定性不可解;
- 进程故障(停止 / 拜占庭):链路可靠时共识可解,给出 FloodSet、EIG、EIGByz 算法。
这一对照揭示了一个深刻事实:链路不可靠比进程崩溃更难对付。
共识问题的三条标准条件:
共识正确性条件
- 一致性(Agreement): 任两个(非故障)进程不会决定不同的值。
- 有效性(Validity): 决定值必须合理——例如若所有进程初值同为 ,则只能决定 。
- 终止性(Termination): 所有非故障进程最终都做出决定。 :::
2. 协同进攻:链路故障下的确定性不可能性
场景. 若干将军要从不同方向协同进攻;只有全体进攻才能成功,部分进攻则全军覆没。将军间只能靠步行信使通信,而信使可能被俘(消息可能丢失)。通信图无向连通、人人皆知,且消息延迟有已知上界。其计算机科学本质是分布式数据库的提交问题(commit)。
形式化( 进程,已知图,初值 ,=进攻/提交,=不进攻/中止;同步模型但允许任意消息丢失)的有效性取弱形式:
- 若全体初值为 ,则只能决定 ;
- 若全体初值为 且所有消息都送达,则只能决定 。
定理 5.1. 设 为两节点一条边的图,则不存在求解协同进攻问题的算法。(两点不可解 ⇒ 任意 节点图不可解。)
证明(不可区分性链 / indistinguishability chain). 反设算法 存在。设 为“双方初值 、全部送达”的执行,由有效性双方在 轮内决定 ;令 为“ 轮后丢弃全部消息”的执行,仍决定 。
从 出发,逐条删去最后一条消息构造执行序列,每相邻两个执行对某进程不可区分(): ( 删去进程 1→2 的最后一条;对进程 1 不可区分,故 1 仍决定 1,由一致性 2 也决定 1;如此交替)。最终 为“双方初值 、零消息送达”,仍被迫双方决定 。
再考虑 (进程 1 初值 、进程 2 初值 、零消息):对进程 1 与 不可区分,故 1 决定 ,由终止+一致性 2 也决定 。最后 (双方初值 、零消息):对进程 2 与 不可区分,故 2 决定 ——但有效性要求决定 ,矛盾。
直觉: 消息可丢失时,“全送达决定 1”与“全丢失决定 0”两个极端被一条每步只差一条消息的链连起来,每步都有人察觉不到差异,于是决定值无法在链上改变——一致性与有效性不可兼得。
3. 进程故障模型
链路可靠(消息必达),但至多 个进程故障。两种故障:
- 停止故障(stopping/crash failure): 进程可在任意时刻彻底停止,甚至在一轮发消息中途停止(任意子集消息被发出)。
- 拜占庭故障(Byzantine failure): 进程可表现任意行为(任意初态、任意消息、任意转移),唯一限制是只能控制自己的输出与状态,不能篡改他人。
两模型的一致性/有效性略有不同:拜占庭版本只对非故障进程要求一致与有效。
4. 停止故障算法(完全图)
4.1 FloodSet:最简算法
FloodSet: 每进程维护集合 ,初始为自己初值的单元素集。共 轮,每轮广播 并把收到的全部值并入 。 轮后:若 则决定其唯一元素,否则决定默认值 。
正确性关键:“ 轮中必有一轮无人故障”:
引理 6.1. 若第 轮无进程故障,则该轮后所有仍活跃的进程 相同。 引理 6.2. 若某轮后活跃进程 都相同,则其后各轮仍然相同。 引理 6.3(关键). 若 在 轮后都活跃,则 。 证明: 个故障 ⇒ 轮中至少有一“干净轮” (无故障),引理 6.1+6.2 即得。
定理 6.4. FloodSet 求解停止故障下的共识。 复杂度: 轮; 条消息;每条 位(=单值位数),共 位。
4.2 OptFloodSet:降低通信
观察:每进程最终只需知道“ 时的那个值”或“ 这个事实”。故每进程最多广播两个值(首轮广播初值;之后首次见到不同值时广播该新值)。轮数仍 ,消息降到 ,通信 位。
4.3 指数信息收集 EIGStop
EIG(Exponential Information Gathering)用一棵标号树记录“谁告诉谁……的初值是什么”的传播链。
有 层(层 =根到层 =叶)。层 的每个节点有 个孩子。根标号为空串 ;标号 的节点对每个 各有一个标号 的孩子。每条根到叶的路径是一条互异进程的链。
EIGStop 算法: 每进程持一棵 ,跑 轮,给层 节点在第 轮末“装饰”一个值或 null。根装饰自己初值;节点 装饰值 意为“ 在第 轮告诉我: 告诉过 …… 的初值是 ”;null 表示该链被故障打断。决策:令 =树中所有非 null 值之集, 则决定其元素,否则 。
引理 6.13. 若 非故障,则 。 证明: 设 , 不含 。(a) : 非故障,会在第 轮把 转给 ,故 。(b) :链 有 个互异索引, 个故障 ⇒ 必含某非故障 , 会把 转给 ,故 。对称得 。
定理 6.14. EIGStop 求解停止故障共识。用 轮, 消息。
5. 拜占庭故障算法(完全图,)
5.1 三进程不可能性的直觉
设进程 1,2,3 解一容错拜占庭共识,约定两轮、首轮广播初值、次轮转述。
三进程不可能性的直觉
- :1,2 非故障初值 1,3 故障初值 0,3 向 1 谎称“2 在第 1 轮发了 0”。有效性迫使 1,2 决定 1。
- :对称——2,3 非故障初值 0,1 故障,1 向 3 谎称“2 发了 1”。有效性迫使 2,3 决定 0。
- :1,3 非故障(初值 1 与 0),2 故障,向 1 说自己是 1、向 3 说自己是 0。则 (故 1 决定 1)、(故 3 决定 0)——违反一致性,矛盾。
要害: 进程 1 能察觉“有人故障”,但分不清是 2 还是 3。
5.2 EIGByz 算法
与 EIGStop 同用 、同传播 轮。决策规则不同——不能信任树中所有值,须用自底向上的递归多数表决屏蔽假值:
EIGByz 决策规则(newval)
轮后,把所有 null 改成默认值 。自叶向根计算 :
- 叶节点 :;
- 非叶节点 : 其孩子 的严格多数值,若无多数则取 。
最终决定 。
正确性要点( 在此处发挥作用):
引理 6.16. 若标号 以非故障进程索引结尾,则存在 使所有非故障 都有 。 归纳关键: 节点 有 个孩子; ⇒ ⇒ 多数孩子的标号以非故障索引结尾,它们 一致,多数表决得正确值。
引理 6.18(公共路径覆盖). 存在一个公共路径覆盖:取所有形如 ( 非故障)的节点构成集 ;每条根到叶路径含 个互异索引的非根节点, 故障 ⇒ 必经过某非故障索引结尾的节点,故 覆盖所有路径且其节点都公共。
由此可证一致性与有效性。
定理. EIGByz 在 时求解拜占庭共识,用 轮。
6. 本讲小结与共识算法全景
| 设定 | 结论 / 算法 | 轮数 | 进程数要求 |
|---|---|---|---|
| 链路故障(协同进攻) | 不可解(定理 5.1) | — | 任意 |
| 停止故障 | FloodSet / OptFloodSet / EIGStop | 无要求 | |
| 认证拜占庭 | EIGStop + 数字签名 | 无要求 | |
| 拜占庭 | EIGByz(指数)/ PolyByz(多项式) | / |
两条主线索:链路 vs 进程故障的本质鸿沟;以及 EIG 树作为从停止→认证→拜占庭逐级通用的数据结构。下一讲证明 与 轮这两个代价都是不可避免的。