在分布式系统中,故障处理是一个重要的议题。单机与分布式系统在故障处理上存在差异。单机软件运行较可预测,硬件正常时操作结果具确定性,遇硬件问题多导致整个系统故障。而分布式系统会面临部分失效情况,具有不确定性,其部分组件可能以不可预知方式损坏,这使分布式系统工作难度增加。
高性能计算(HPC)领域的超级计算机多用于科学计算,作业常将计算状态存盘,节点故障时通常停止集群工作负载,重启后从检查点继续,类似将部分失败升级为完全失败来处理。云计算则与多租户数据中心等相关联,节点由商品机器构建,故障率较高,需构建容错机制,允许系统容忍故障节点继续工作,以保障服务不中断。
即便组件不可靠,也可通过如纠错码、TCP 协议等机制构建更可靠的系统,但可靠性有限。在分布式系统中要接受部分故障可能,将容错机制融入软件设计,考虑各种错误情况并测试,不能简单假设缺陷罕见。
网络是分布式系统中机器通信的唯一途径,多为异步分组网络,存在请求丢失、排队、远程节点失效或响应延迟等诸多问题,导致难以区分故障原因,通常采用超时机制处理,但超时设置面临长时等待或误判节点失效的两难困境。
计算机网络建设多年,仍普遍存在故障,如数据中心网络、公有云服务都受其困扰,人为错误是网络中断主因,且网络分区等故障若处理不当会引发严重后果,需明确软件应对方式并测试。
判断节点是否故障较难,虽存在如操作系统关闭 TCP 连接、脚本通知、查询交换机、路由器回复等可反馈故障信息的情况,但不能完全依赖,多数情况无反馈,需重试并结合超时判定节点状态。
现代计算机有时钟(实时时钟)和单调钟两种时钟,时钟根据日历返回日期时间,常与 NTP 同步但存在跳跃、精度有限等问题,不适用于测量经过时间;单调钟用于测量持续时间,保证一直前进但绝对值无意义,不同计算机的单调钟值不可比,在分布式系统中测量超时等情况较适用。
获取时钟的方法存在诸多不可靠和不准确因素,如石英钟漂移、NTP 同步受网络延迟限制、NTP 服务器可能错误或配置错误、闰秒处理复杂以及虚拟机中时钟虚拟化等问题,使用需要同步时钟的软件时要监控时钟偏移,以防数据丢失等问题。
依赖时钟对多节点事件排序有风险,如最后写入为准(LWW)冲突解决策略,会因时钟不同步或精度问题导致数据库写入丢失、无法区分顺序写入和并发写入等情况,逻辑时钟相对更适合排序事件。
分布式系统中节点只能通过消息判断其他节点状态,因网络、暂停等问题无法确切知晓真实情况,所以很多分布式算法依赖法定人数投票做决策,如宣告节点死亡等情况,减少对单个节点依赖。
在分布式系统实现如数据库分区领导者、资源锁等唯一性控制时,需注意节点自认为的角色不一定获法定人数节点认可,可能因网络或暂停等原因出现问题,像租约过期仍写入导致数据损坏,可通过防护令牌机制,要求写入时附带递增的令牌,资源端检查令牌拒绝旧令牌请求来保障安全。
拜占庭故障指节点有意 “撒谎” 破坏系统保证,在如航空航天、多组织参与等特定场景需考虑拜占庭容错,但制作拜占庭容错系统协议复杂、成本高,在多数服务器端数据系统不实用,不过可添加一些简单机制防止弱形式的 “撒谎” 行为来提高可靠性。