“固定进程集合 $\Pi$ 与崩溃上界 $f$,采用可靠点对点信道和公平异步执行,并让两侧使用同一种 crash stop 故障模型。本页固定分布式共识的 uniform 一致性,以及原子广播…”
“本库的分布式主线可按“可靠广播 → 共识 → 原子广播及其等价定理 → 状态机复制”阅读:可靠广播先固定消息传播与去重责任,共识决定一个值或一个日志位置,本页证明连续共识与全序交付可以互相构…”
模型Model
施工中 · 内容逐步修订
Atomic broadcast · Total-order broadcast
所有正确进程以同一总序交付广播消息。
原子广播(又称全序广播)是在可靠广播之上增加全局排序约束的广播原语。令 broadcast_p(m) 与 deliver_p(m) 分别表示进程
前三条给出可靠传播;第四条等价于所有交付序列都是某个共同全序的前缀。特别地,对任意
前缀表述还排除一个进程先交付共同序列中更晚的消息。Non-uniform 规格只量化正确进程;讨论归约或容错边界时必须固定同一版本。FIFO 或因果版本则额外要求共同全序尊重发送者顺序或因果顺序。
可靠广播只保证正确进程最终看到同一批消息,却允许它们以不同次序看到;而副本状态一般依赖操作先后——“存入 100 再翻倍”与“翻倍再存入 100”结果不同。原子广播让每个副本沿同一消息序列前进。副本在现实时间上可以快慢不同,但从相同初始状态出发的确定性状态机,只要应用了同一前缀就处于相同状态。
交付是排序层向应用宣布消息的事件,不等于网卡收到了数据。节点可以提前收到后续消息,把它暂存在缓冲区,待缺失的前缀补齐再交付。应用若绕过这个接口直接执行收包内容,就失去了全序保证;应用速度不同也不意味着交付序列已分叉。
把每次全序交付追加到下一个索引,就得到复制日志的 committed 序列;反过来,按索引交付日志新提交条目也可提供全序广播。两者是同一排序能力的不同接口面,日志另暴露索引、提交与应用位置。本页仍只规定消息交付性质,不吸收日志的本地尾部和恢复语义。
正例:节点 A 广播
边界在于,全序只承诺“大家采用同一个顺序”,不承诺顺序从何而来。它既不自动尊重实时先后,也不自动尊重 FIFO 或因果先后:即使同一发送者先广播
统一前缀条件还约束故障节点。例如 A 已交付 [x] 后崩溃,B 先交付 [y],即使 B 后来再交付 x,也已违反本页规格,因为 [x] 与 [y] 当时互不为前缀。仅要求“两个节点都交付两条消息时顺序相同”的较弱条件,会漏掉 A 永远不交付 y 的情况;因此本页的前缀版本不能在证明中偷偷换成仅比较共同消息的版本。
原子广播也不等于“一次选一个值”。广播接口面对任意长消息流,需要为每条合法消息提供不饿死的交付保证;一个 one-shot 决定只能确定共同序列的第一个位置。若系统允许崩溃恢复,还必须持久保存交付位置或由等效恢复协议重建;按进程生命期计的一次交付,并不自动保证跨重启只执行一次业务效果。
原子广播是状态机复制的直接排序手段。本页的统一前缀版本与 uniform 分布式共识在固定成员、匹配的 crash/termination 规格及普通可靠广播的辅助传播下可相互归约(见共识与原子广播等价性)。
从原子广播到 one-shot 共识:每个进程广播自己的提议,并决定它交付的第一条消息。完整性保证决定值确曾被提议,前缀全序保证所有决定者看到相同首条消息,有效性与一致性保证正确进程最终取得首条消息并决定。
从共识到原子广播:可靠传播带唯一 ID 和完整 payload 的消息,对槽位
这一等价性把FLP 不可能性传导过来——纯异步崩溃模型中不存在保证终止的确定性原子广播,实用协议需借部分同步、故障检测器或随机化取得活性。