第八章 分布式系统的麻烦

任何可能出错的东西都会出错

故障与部分失效

  • 单机与分布式系统差异:单机软件运行较可预测,硬件正常时操作结果具确定性,遇硬件问题多导致整个系统故障。而分布式系统会面临部分失效情况,具有不确定性,其部分组件可能以不可预知方式损坏,这使分布式系统工作难度增加
  • 不同计算系统的故障处理:高性能计算(HPC)领域的超级计算机多用于科学计算,作业常将计算状态存盘,节点故障时通常停止集群工作负载,重启后从检查点继续,类似将部分失败升级为完全失败来处理。云计算则与多租户数据中心等相关联,节点由商品机器构建,故障率较高,需构建容错机制,允许系统容忍故障节点继续工作,以保障服务不中断。
  • 构建可靠系统的思路:即便组件不可靠,也可通过如纠错码、TCP 协议等机制构建更可靠的系统,但可靠性有限。在分布式系统中要接受部分故障可能,将容错机制融入软件设计,考虑各种错误情况并测试,不能简单假设缺陷罕见。

不可靠的网络

  • 网络问题表现及处理:网络是分布式系统中机器通信的唯一途径,多为异步分组网络,存在请求丢失、排队、远程节点失效或响应延迟等诸多问题,导致难以区分故障原因,通常采用超时机制处理,但超时设置面临长时等待或误判节点失效的两难困境
  • 真实世界网络故障情况:计算机网络建设多年,仍普遍存在故障,如数据中心网络、公有云服务都受其困扰,人为错误是网络中断主因,且网络分区等故障若处理不当会引发严重后果,需明确软件应对方式并测试
  • 检测故障的难点与方法 :判断节点是否故障较难,虽存在如操作系统关闭 TCP 连接、脚本通知、查询交换机、路由器回复等可反馈故障信息的情况,但不能完全依赖,多数情况无反馈,需重试并结合超时判定节点状态。
    • 为什么需要自动检测故障节点
      • 负载平衡器需要停止向已死亡的节点转发请求(即从移出轮询列表(out of rotation))。
      • 在单主复制功能的分布式数据库中,如果主库失效,则需要将从库之一升级为新主库
  • 网络拥塞和排队影响 :网络数据包延迟的可变性常源于排队,受交换机、操作系统、虚拟机等多因素影响,TCP 执行流量控制也会带来延迟。不同应用对延迟敏感度不同,像视频会议等用 UDP 以牺牲可靠性换低延迟,多数系统需通过实验或借助故障检测器来确定合适的超时时间。
    • 计算机网络上数据包延迟的可变性通常是由于排队
      • 交换机队列填满
      • 目标机器的cpu繁忙
      • 多个虚拟机争抢cpu
      • TCP执行流量控制
    • 怎么解决多租户数据中心的网络拥塞问题
      • 原因:在公共云和多租户数据中心中,资源被许多客户共享:网络链接和交换机,甚至每个机器的网卡和CPU(在虚拟机上运行时
      • 解决办法:通过实验方式选择超时:在一段较长的时期内、在多台机器上测量网络往返时间的分布,以确定延迟的预期变化。然后,考虑到应用程序的特性,可以确定故障检测延迟与过早超时风险之间的适当折衷。
      • 更好的办法:不是固定的常量超时时间,而是连续测量响应时间及其变化来自动调整超时时间
  • 同步网络与异步网络对比 :将数据中心网络与传统固定电话网络对比,后者为同步网络,建立电路时分配固定带宽,保证最大端到端延迟固定(称之为有效延迟),而数据中心网络和互联网采用分组交换协议,针对突发流量优化,但存在网络拥塞、排队及无限延迟问题,目前技术难以保障网络延迟或可靠性。
  • 延迟和资源利用关系:延迟变化可视为动态资源分区结果,电话网络线路是静态资源分配,互联网则动态分享带宽,各有利弊,静态分配可实现延迟保证但利用率低、成本高,动态分配利用率高但有可变延迟缺点。

不可靠的时钟

  • 时钟分类及特点:现代计算机有时钟(实时时钟)和单调钟两种时钟,时钟根据日历返回日期时间,常与 NTP 同步但存在跳跃、精度有限等问题,不适用于测量经过时间;单调钟用于测量持续时间,保证一直前进但绝对值无意义,不同计算机的单调钟值不可比,在分布式系统中测量超时等情况较适用。
  • 时钟同步与准确性问题:获取时钟的方法存在诸多不可靠和不准确因素,如石英钟漂移、NTP 同步受网络延迟限制、NTP 服务器可能错误或配置错误、闰秒处理复杂以及虚拟机中时钟虚拟化等问题,使用需要同步时钟的软件时要监控时钟偏移,以防数据丢失等问题。
  • 有序事件的时间戳问题:依赖时钟对多节点事件排序有风险,如最后写入为准(LWW)冲突解决策略,会因时钟不同步或精度问题导致数据库写入丢失、无法区分顺序写入和并发写入等情况,逻辑时钟相对更适合排序事件。
  • 时钟读数的置信区间:时钟读数存在不确定性,应视为一个时间范围,不同时间源对应不同的误差计算方式,但多数系统不公开不确定性,Google 的 TrueTime API 是例外,会报告时钟置信区间,Spanner 利用该区间实现跨数据中心的快照隔离。
  • 暂停进程的影响及应对:分布式系统中,进程可能因垃圾收集、虚拟机挂起恢复、磁盘 I/O、页面调度、信号控制等多种原因长时间暂停,导致依赖同步时钟或假定执行时间短的代码出现问题,且分布式系统无共享内存,传统线程安全工具无法直接适用,不过可通过一些措施缓解垃圾收集暂停的影响

知识、真相与谎言

  • 分布式系统中的不确定性:分布式系统中节点只能通过消息判断其他节点状态,因网络、暂停等问题无法确切知晓真实情况,所以很多分布式算法依赖法定人数投票做决策,如宣告节点死亡等情况,减少对单个节点依赖
  • 领导者与锁定问题及防护措施:在分布式系统实现如数据库分区领导者、资源锁等唯一性控制时,需注意节点自认为的角色不一定获法定人数节点认可,可能因网络或暂停等原因出现问题,像租约过期仍写入导致数据损坏,可通过防护令牌机制,要求写入时附带递增的令牌,资源端检查令牌拒绝旧令牌请求来保障安全。
  • 拜占庭故障及相关情况:拜占庭故障指节点有意 "撒谎" 破坏系统保证,在如航空航天、多组织参与等特定场景需考虑拜占庭容错,但制作拜占庭容错系统协议复杂、成本高,在多数服务器端数据系统不实用,不过可添加一些简单机制防止弱形式的 "撒谎" 行为来提高可靠性。