知识卡片
系统模型用时序假设与故障假设的组合定义算法适用的现实边界
内容
为了让分布式算法不必依赖某套具体硬件软件的运行细节,需要先用系统模型把”这个算法 假设环境会出什么样的问题”形式化下来,算法的正确性只需要相对这个模型成立即可。时序 假设方面常用三种模型:同步模型假设网络延迟、进程暂停、时钟误差都有已知的固定上限 (不要求零延迟,只要求”不会超过某个界”)——现实中很少有系统真的满足这个假设,因为 无限延迟和无限暂停确实会发生;部分同步模型假设系统大多数时候表现得像同步系统,但 偶尔会突破这些界限——这是对大多数真实系统更贴切的刻画:平时网络和进程表现良好 (否则什么都做不成),但必须承认任何时刻这些假设都可能被打破,一旦打破延迟和暂停 可能变得相当大;异步模型完全不对时序做任何假设,算法甚至不能使用时钟或超时,能在 这个模型下工作的算法非常有限。节点故障方面也有三种常用模型:崩溃停止模型假设节点 只会以”崩溃”一种方式失效,一旦崩溃就永远消失、不会再回来;崩溃恢复模型假设节点可能 在任意时刻崩溃,但也可能在未知时间后恢复响应,且假设稳定存储(非易失磁盘)能在崩溃 中保留数据、只有内存状态会丢失;拜占庭(任意)故障模型假设节点可能做绝对意义上的 任何事,包括故意欺骗其他节点。对真实系统建模时,”崩溃-恢复故障”叠加”部分同步”通常 是最实用、最贴近现实的组合——这也是本章及下一章讨论的大多数分布式算法所依赖的 基础假设。
结构图:
flowchart LR
A[时序假设] --> A1[同步模型: 延迟/暂停/时钟误差有固定上限]
A --> A2[部分同步模型: 多数时候同步, 偶尔突破界限]
A --> A3[异步模型: 不假设任何时序, 不能用超时]
B[故障假设] --> B1[崩溃停止: 崩溃后永远消失]
B --> B2[崩溃恢复: 可能崩溃后又恢复, 稳定存储数据不丢]
B --> B3[拜占庭: 节点可任意行为甚至撒谎]
A2 -.最贴近真实系统.-> C[部分同步 + 崩溃恢复<br/>最常用于真实系统建模]
B2 -.最贴近真实系统.-> C
参考来源
- 位置:《数据密集型应用系统设计》第八章《分布式系统的麻烦》"系统模型与现实"
(源文件:_epub-src/ch8_split_005.html)
- 结论依据:原文分别定义同步/部分同步/异步三种时序模型和崩溃停止/崩溃恢复/拜占庭
三种节点故障模型,并明确指出"具有崩溃-恢复故障的部分同步模型通常是最有用的模型",
直接支撑本卡片的结构梳理。
- 原始内容:同步模型假设网络延迟、进程暂停和和时钟误差都是受限的……部分同步意味着
一个系统在大多数情况下像一个同步系统一样运行,但有时候会超出网络延迟……崩溃停止
模型中,算法可能会假设一个节点只能以一种方式失效……对于真实系统的建模,具有崩溃-
恢复故障的部分同步模型通常是最有用的模型。