大规模分布式系统中的级联故障 - stuttgart


对谷歌、亚马逊和 Co.等公司来说服务的可靠运行非常重要,但它们的系统一次又一次地出现故障,导致大量中断和糟糕的客户体验。
人们经常会遇到所谓的级联 故障,导致超出普通系统故障的不良并发症。
即使是在线业务的大玩家,怎么也不能完全避免这种故障呢?您可以为自己的系统使用哪些切实可行的风险缓解方法?
话虽如此,这篇博客文章的目标是了解如何通过防止故障传播来提高大型分布式系统的弹性。
 
级联故障
级联故障是一种由于正反馈循环而随时间增加的故障。典型的行为最初是由一个节点或子系统的故障引发的。这将负载分散到其余系统的更少的节点上,这反过来又增加了进一步系统故障的可能性,导致恶性循环或滚雪球效应[4]。级联故障是非常关键的,原因有三。首先,它们可以在很短的时间内关闭整个服务。第二,受影响的系统不会像更常见的问题那样恢复正常,而是会逐渐变得更糟。这最终导致了对人为干预的依赖。最后,在最坏的情况下,级联故障会在似乎没有警告的情况下发作,因为负载分布,以及由此产生的故障,会迅速发生[4][5] 。

尽管这篇博客文章将关注分布式计算背景下的级联故障,但它们也可能发生在其他各种领域:例如,电力传输、金融、生物学,还有生态系统。所以,它们是一种相当普遍的现象,与自然界中的模式有些相似[5]。
为了更好地了解计算机科学中的级联故障是什么样子的,我们来看看一个具体的案例研究。点击标题见原文
...
 
级联故障的原因
首先,应该提到的是,级联故障的触发点可能是多种多样的:例如,这些可能是新的推出、维护、流量耗尽、cron job、分布式拒绝服务(DDoS)、节流等等。它们的共同点是,它们在有限的资源背景下工作,可能意味着服务器过载、资源耗尽和服务不可用等效果[4][10]。让我们详细看看这些。

  • 服务器过载

最常见的原因是服务器过载或其后果。当这种情况发生时,系统性能的下降往往影响到系统的其他区域。如图2所示,在初始场景(左)中,来自两个反向代理的负载被分配到集群A和B之间,因此集群A以每秒1000个请求的假设最大容量运行。在第二种情况下(右图),集群B发生故障,整个负载打到集群A,这可能导致过载。集群A现在不得不每秒处理1200个请求,并开始行为失常,导致性能下降,远远低于每秒1000个请求的预期[4]。
  • 资源耗尽

服务器的资源是有限的。如果负载增加到某一阈值以上,服务器的性能指标,如延迟或错误率,就会恶化。这将转化为更高的崩溃风险。随后的影响取决于造成瓶颈的资源类型,例如。
  1. 如果CPU不够用,就会出现各种问题,包括较慢的请求,过多的排队效应,或线程饥饿。
  2. 如果内存/内存被过度使用,任务可能会崩溃,或者缓存点击率会下降。

另外,线程饥饿可能直接导致错误或导致健康检查失败。
  • 服务不可用

当资源耗尽导致一台服务器崩溃时,流量会扩散到其他服务器,增加了这些服务器也会崩溃的可能性。一个服务器崩溃的循环建立起来了。糟糕的是,这些问题仍然存在于你的系统中,因为一些机器仍然在停机或在重启的过程中,而不断增加的流量使它们无法完全恢复[4]。

一般来说,当我们把流量从不健康的节点重新分配到健康的节点时,级联故障的风险始终存在。
这可能是协调系统、负载均衡器或任务调度系统的情况。
为了解决级联故障,我们需要仔细研究一下所涉及的组件的关系。
 
脱离循环--如何修复级联故障
正如在DynamoDB的案例中所看到的,修复级联故障是很棘手的。特别是从一个大型科技公司的角度来看,分布式为你的系统增加了很多复杂性,这使得跟踪各种不同的互连关系变得更加困难。
这里说明(级联)关系的一个基本方法是所谓的因果循环图(CLD)。
CLD是一种建模方法,有助于将复杂系统中的反馈环路可视化。
图3显示了AWS DynamoDB故障的CLD。它可以解释如下。一个箭头代表了初始变量和后续变量之间的动态。例如,如果元数据服务的延迟增加,超时的数量就会增加,需要重试的数量也会增加。如果系统中的影响是非常不平衡的,也就是说,加号和减号的数量不是很相等,就会有一个强化的循环。这意味着,系统可能对级联故障很敏感。

现在,为了解决连带的情况,可以采取各种措施。第一个也是最直观的选择是增加资源。在上图中,你可以看到元数据服务能力给这个圆圈带来的减分。如果这一点被增加,它就会对强化循环起作用。然而,这可能是无用的,正如我们在AWS的案例中看到的那样。除了增加资源外,你可能需要采用其他策略。

  1. 尽量避免健康检查失败/死亡,以防止你的系统因过度健康检查而死亡。
  2. 在出现线程阻塞的请求或死锁的情况下,重新启动你的服务器。
  3. 大幅降低流量,然后慢慢增加负载,使服务器能够逐渐恢复。
  4. 通过丢弃某些类型的流量,切换到降级模式。
  5. 消除批处理/坏的流量,以减少由于非关键性或错误工作造成的系统负载。

因为这最终意味着系统的某些部分不能使用,这对客户来说是可见的,所以最好首先避免级联故障。

更多点击标题


banq评:这张图如果能绘制出来,解决方案肯定出来了,实际现实中,这张图一直在动态变化,也就是问题空间的图纸只在上帝肚子里,人类只能事后诸葛亮。