故障与部分失效

单节点一般是要么工作要么失效,但是分布式系统多节点面临部分失效,大大提高了分布式系统的复杂性。

单节点软件特性:

  • 硬件正常工作时,相同的操作通常总会产生相同的结果,即确定性。
  • 如果发生了某种内部错误,我们宁愿使计算机全部崩溃,而不是返回一个错误的结果。

云计算和超算

  • 超算:垂直扩展的极端,设置检查点,一点节点故障则全部失效从上一个检查点重新开始(离线批处理),类似单机上内核崩溃。
  • 云计算:水平扩展的极端
  • 传统企业位于两个极端的中间

分布式可靠必然面临部分失效,需要依赖软件系统来提供容错机制。我们需要在不可靠的组件上构建可靠的系统。

不可靠网络

  • 分布式无共享系统:成本低廉。
  • 互联网以及大多数 IDC 内部网络都是异步网络:不保证发送一定到达(排队),等待响应时可能出现任何错误。

现实中的网络故障非常普遍

故障检测:HA、主从切换、保活机制(ICMP,SYN)

超时与无限期的延迟

网络拥塞与排队

  • 网络负载过高会出现拥塞。
  • 数据在发送的过程中分别会在发送端和接收端进行排队:等待发送和等待处理。
  • TCP 的拥塞控制机制。
  • 虚拟化 CPU 核切换虚拟机

同步与异步网络

  • 同步网络:固定电话网络,一路电话分配固定的电路、有带宽保证,规定延迟内保证完成数据包发送,不会丢弃数据包,成本高,利用率低
  • 异步网络:数据中心网络,共享带宽,无法保证延迟和数据包发送,成本低廉,利用率高

不可靠时钟

单调时钟与墙上时钟

时间同步与准确性

  • 计算机中的石英钟不够精确
  • NTP 服务器不稳定(网络、防火墙或服务本身)
  • 虚拟机中时钟是虚拟化的。
  • 终端设备不可控:休眠、故意设置

依赖同步的时钟

时钟陷阱:

  • 一天可能不总是 86400 秒
  • 回拨
  • 多个节点上的时间完全不相同

需要精确同步的时钟:

  1. 自己监控所有节点上的时钟偏差
  2. 某个节点时钟漂移超出上限则将其宣告失效

时间戳与时间顺序

时钟的置信区间

通过直接安装 GPS 接收器或原子(铯)时钟,它的误差范围通常可以查询制造商手册。

全局快照的同步时钟

Google Spanner 根据部署了 GPS 接收器或者原子时钟的 TrueTime API 返回的时钟置信区间。确保读事务足够晚发生,避免与先前事务的置信区间产生重叠。

进程暂停

  • 垃圾回收
  • 虚拟化暂停虚拟机
  • 磁盘 I/O
  • 内存交换分区
  • 手动暂停进程(SIGSTOP/SIGCONT)

响应时间保证

  • RTOS 系统

调整垃圾回收的影响

知识,真相与谎言

真相由多数决定:Quorum 一致性

主节点与锁

Fencing 令牌

拜占庭故障

理论系统模型与现实

计时方面

  • 同步模型:有上界网络延迟、上界进程暂停、上界的时钟误差。
  • 部分同步模型:允许少量的网络延迟、进程暂停、时钟误差超过上界。
  • 异步模型:不会做任何假设。

节点失效模型:

  • 崩溃-中止模型
  • 崩溃-恢复模型
  • 拜占庭(任意)失效模型

算法的正确性

  • 唯一性:两个令牌不能获取到相同的值
  • 单调递增
  • 可用性

安全性和活性

  • 安全性:没有意外发生
  • 活性: 预期的事情最终一定会发生