共识理论基础⚓︎
共识问题⚓︎
在分布式系统中,共识问题(Consensus Problem)是指多个独立的物理或逻辑节点在面临网络延迟、数据包丢失、节点宕机等不可靠因素时,如何就某个特定的值或系统状态达成全局一致的状态。
共识算法是状态机复制(State Machine Replication)的基础。为了保证系统的正确性,共识算法必须同时满足以下三个基本属性:
- 终止性(Termination):所有未发生故障的节点最终都能够在有限的时间内完成决议过程,不会陷入无限等待。
- 一致性(Agreement / Safety):所有未发生故障的节点最终决定的值必须完全相同。系统不能出现两个正常节点得出不同结论的情况。
- 合法性(Validity):最终达成共识的值必须是由系统内某个节点明确提议(Propose)的值。节点不能随机生成一个无关的值来达成一致。
共识问题旨在解决如何在物理上分散的不可靠组件之上,构建出逻辑上可靠的系统,这广泛应用于分布式数据库的 Leader 选举、分布式事务的提交以及全局配置的同步等场景。
故障模型⚓︎
共识算法的设计严格依赖于其假设的运行环境。根据系统中节点可能发生故障的类型和行为模式,分布式系统理论将故障模型划分为两个主要层级。
Crash Fault Tolerance(CFT)⚓︎
崩溃容错模型(Crash Fault Tolerance, CFT)假设系统中的节点只会发生物理级或网络级故障,节点不会伪造或篡改数据。
故障表现:
- 宕机(Crash):节点进程意外终止、服务器断电关机。
- 网络异常(Network Issues):消息在传输过程中发生延迟、丢失、乱序或重复。
- 静默故障(Fail-Stop):节点发生故障后直接停止工作,不再向外发送任何消息。
行为特征:节点要么发送完全正确的消息,要么不发送消息。系统内部不存在蓄意破坏的恶意实体。
容错阈值:为了保证在多数派网络分区中系统依然可用,CFT 算法要求系统总节点数 N 与最大允许宕机节点数 f 之间满足:
系统必须有超过半数的节点存活才能继续推进共识。典型算法包括 Paxos、Raft 和 ZAB。CFT 算法通常部署在单一组织内部的封闭网络中,默认内网环境在数据内容上是安全的。
Byzantine Fault Tolerance(BFT)⚓︎
拜占庭容错模型(Byzantine Fault Tolerance, BFT)包含 CFT 模型中的所有故障情况,并额外允许系统中存在表现出任意行为的恶意节点。
故障表现:
- 恶意篡改:节点可能会修改数据内容、伪造签名或时间戳。
- 合谋攻击(Collusion):多个恶意节点可能互相配合,共同输出错误数据。
- 两面派行为(Equivocation):同一个节点可能向不同的目标节点发送内容完全冲突的消息,试图引发系统的状态分歧。
行为特征:节点的状态和输出是不可预测的。系统无法信任任何单一节点发来的数据,必须通过交叉验证和密码学手段(如非对称加密、消息认证码)验证数据安全。
容错阈值:在异步网络模型中,为了在恶意节点的干扰下依然保证诚实节点能达成一致,BFT 算法要求系统总节点数 N 与最大允许拜占庭节点数 f 之间满足:
系统需要收集超过三分之二节点的确认才能推进共识。典型算法包括 PBFT、Tendermint 和 HotStuff。BFT 通常应用于跨越不同信任主体的去中心化网络中。
常见协议⚓︎
常见协议分类
分布式协议通常可划分为以下三类:
- 事务提交:2PC
- Crash Fault 共识/复制:Paxos、Raft、ZAB、VSR
- Byzantine Fault 共识:PBFT、HotStuff
- 2PC:两阶段提交,主要解决分布式事务提交问题。
- Paxos:经典 CFT 共识算法,提供了理论基础。
- Raft:CFT 共识算法,通过强领导者模型提升了可理解性和工程实现难度。
- ZAB:ZooKeeper 使用的原子广播协议,适合主从式元数据同步。
- VSR:Viewstamped Replication,采用复制状态机路线的算法。
拜占庭故障分析⚓︎
拜占庭将军问题(Byzantine Generals Problem)是由 Leslie Lamport 提出的一种逻辑抽象,用于形式化描述分布式系统中最严格的故障模型。在技术语境下,该问题探讨的是在一个缺乏可信中心节点且存在恶意节点的异步网络中,正常节点如何通过消息交换达成一致。
解决该问题在数学推导上具有高复杂性,主要原因在于:
- 两面派行为:在拜占庭模型中,恶意节点可以向节点 A 发送特定状态,同时向节点 B 发送完全相反的状态。这种行为导致基于简单多数派的投票机制失效。
- 无法区分节点状态与网络延迟:在异步网络中,如果一个节点没有响应,其他节点无法区分该节点是发生宕机、网络拥塞,还是故意保持沉默。
- 消息伪造与篡改:恶意节点可以在转发消息时篡改前置节点的数据,或者伪造其他节点的身份发送指令。
BFT 与 CFT 的差异⚓︎
拜占庭故障(BFT)与一般宕机故障(CFT)在系统假设和算法复杂度上存在显著差异:
验证机制差异:
- CFT 算法:主要处理消息的顺序和日志复制。系统通过比对任期号和日志索引来确定状态,无需对消息发起者进行防篡改校验。
- BFT 算法:必须引入密码学工具。每条参与共识的消息必须附带数字签名,节点在处理消息前必须进行解密和验签计算,确保消息来源不可伪造且内容完整。
网络通信复杂度差异:
- CFT 模型:通常采用 Leader 主导的通信模型,达成一次共识的网络消息复杂度通常为 O(N)。
- BFT 模型:为了防止单点欺骗,通常需要进行多轮的全网广播(All-to-All Broadcast)来进行交叉确认。经典 PBFT 算法网络复杂度达到 O(N^2)。