什么是级联故障?
我们做不到总是完全隔离故障:被高负载压垮的进程会增加集群其余部分的负载,从而使其他节点更有可能发生故障。级联故障能够从系统的一部分传播到另一部分,扩大了问题的范围。
有时,级联故障甚至可能来源于完全善意的目的。例如,某个节点离线了一段时间,因而没有接收到最近的更新。当它恢复在线时,乐于助人的其他节点希望帮助它追赶上最近的变化,于是开始向它发送缺失的数据,而这又导致网络资源耗尽,或是导致该节点启动后短时间内再次发生故障。
通过熔断器防止故障扩散
为了防止系统的故障扩散并妥善处理故障场景,我们可以使用断路器(或熔断机制)。在电气工程中,断路器可通过中断电流来保护昂贵且难以更换的部件,使其免受电流过载或短路的影响。在软件开发中,熔断机制会监视故障,并使用回退(fallback)机制保护整个系统:避免使用出故障的服务,给它一些时间进行恢复,并妥善处理失败的调用。
当与某一台服务器的连接失败或服务器没有响应时,客户端将开始循环重连。那时候,过载的服务器已经难以应付新的连接请求,因而客户端的循环重试也无济于事。为了避免这一情况,我们可以使用退避(backoff)策略,客户端不要立即重试,而是等待一段时间。
设计合理的重试策略
退避通过合理安排重试、增加后续请求之间的时间窗口来避免问题扩大。退避用于增加单个客户端的请求间隔。但是,使用相同退避策略的多个客户端也会产生大量负载。为了防止多个客户端在退避期之后同时重试,我们可以引入抖动(jitter)。抖动在退避上增加了一个小的随机时间间隔,从而降低了多个客户端同时醒来并重试的可能性。
通过文件检验和checksum防止数据损坏
硬件故障、比特位腐烂和软件错误都会导致数据损坏,而损坏的数据会通过标准的传递机制传播。如果没有适当的验证机制,系统可能将损坏的数据传播到其他节点,甚至可能覆盖未损坏的数据记录。为了避免这一情况,我们应该采用校验和(checksum)以及验证机制,来验证节点之间交换的任何内容的完整性。
通过计划和协调执行可以避免过载和热点问题
相比于让各个对等节点独立执行操作步骤,我们可以用协调器来依据可用资源准备一份执行计划,并根据过去的执行数据来预测负载。
总之,我们应该始终考虑这样的情形:系统某一部分的故障可能导致其他地方也出现问题。我们应该为系统装备上熔断、退避、验证和协调机制。处理被隔离的小问题总比从大规模故障中恢复更简单。