本页目录

故障模型

节点可能崩溃、可能失联、可能撒谎。从 crash-stop 到 Byzantine,故障模型的每一次升级都让协议设计难度翻倍——而工程中"超时多长算故障"本身就是一个没有正确答案的权衡:太短误判活节点,太长系统空等。

故障分类

Crash-Stop (Fail-Stop)

节点停止执行后不再重启⁠。这是最简单的故障模型——一旦节点 crash,它就永远不产生新的输出。共识协议(Paxos/Raft)在这个模型下有简洁的证明。

特点:不需要持久化(crash 后节点不需要恢复 log),状态可以放在内存。但实践中极少数系统是真正的 crash-stop——大多数系统需要 crash-recovery。

Crash-Recovery

节点停止,但经过一段(任意)时间后重启并恢复执行⁠。恢复需要从持久存储(WAL/journal)重放 pre-crash 状态。这是最实际的故障模型——Raft/etcd 就是针对 crash-recovery 设计的。

恢复后的关键问题:重启的节点必须能证明它的 log 没有丢失——即 log 被持久写入并在 crash 前确认了。这就是 Raft 为什么要求 fsync 日志条目后才回复 leader。

Byzantine (拜占庭) 故障

节点可以任意行为⁠——包括发送伪造消息、选择性响应、蓄意破坏。不仅是恶意攻击:内存 bit-flip (宇宙射线)、固件 bug、网络设备错误转发都可能产生 Byzantine 行为。

Byzantine 比 crash 难得多:Paxos/Raft 只容忍 f 个 crash 就需要 2f+1 个节点;PBFT(Practical Byzantine Fault Tolerance)需要 3f+1 个节点来容忍 f 个 Byzantine 节点。

原因:Byzantine 节点可以对不同的诚实节点说不同的话⁠——诚实节点无法区分"对方在撒谎"和"网络丢包"。PBFT 的 3f+1 的下限已被证明是必要的。

实践中的分布

实际系统极少需要 Byzantine 容错——在一个封闭的数据中心/集群中,crash-recovery 覆盖了绝大多数故障。Byzantine 主要出现在:

  • 区块链/加密货币(节点互不信任)
  • 跨组织协作(没有共同信任根)
  • 极其关键的基础设施(Spanner 用 TrueTime 防止了某些 Byzantine 式时钟攻击)

网络分区

分区不等于 crash——节点仍在运行,能接受客户端请求,但不能与其他节点通信。分区是对 CAP 定理的核心威胁:⁠分区发生时,你必须选择一致或可用。

对称分区 vs 非对称分区

  • 对称分区:集群被等分为两部分,每部分都有节点的多数 → (用 Raft) 只有有 majority 的那一半能选举 leader 并继续服务
  • 非对称分区:单个节点与其他所有节点断连 → 它不能成为 leader,也不会造成脑裂

Split-Brain (脑裂)

多 leader 系统 + 分区 = 两个分区各自选举了 leader → 两边同时接受写入 → 分区恢复时冲突。经典的解决方案:

  • Raft/Paxos: 永远只有 majority partition 能有 leader(数学保证)
  • 系统级防御:STONITH (Shoot The Other Node In The Head) → fence 旧 master 甚至直接断电

超时

分布式系统的核心张力:⁠超时太短 = 误判 crash (false positive);超时太长 = 故障检测慢 (增加不可用窗口)

Raft 的选举超时就是典型:150-300ms 随机化,既保证不同 candidate 有不同的超时(避免 split vote),又要足够长以覆盖正常的 RPC 延迟。

为什么没有"正确"的超时

网络延迟不是高斯分布——它有长尾(tail latency)。即使 p99 延迟是 10ms,p99.9 可能就跳到 100ms。如果你设 timeout=100ms,0.1% 的请求会误判为超时。如果设 timeout=1s,故障检测延迟就是 1s——这段期间系统不可用。

这个问题没有理论解,只有工程权衡。在实践中:用 φ-accrual failure detector(见 05 章)输出 suspicion level 而不是二值判断——让应用层决定"多大的怀疑值得做 failover"。

参考

  • 论文⁠: "Impossibility of Distributed Consensus with One Faulty Process" (FLP, 1985)
  • 论文⁠: "Practical Byzantine Fault Tolerance" (Castro & Liskov, 1999)
  • 论文⁠: "The φ Accrual Failure Detector" (Hayashibara et al, 2004)

Keywords: crash-stop, crash-recovery, Byzantine fault, network partition, split-brain, FLP, timeout, φ-accrual