快速失败是让失败立即快速发生! - pathelland


随着我们逐渐利用云计算,这变得越来越具有挑战性。由于各个组件都面临着被称为“灰色失败”的新挑战,因此我们创建强大解决方案的方法仍然面临压力 。在出现灰色故障时,服务器或网络的一部分不会快速失败,而是开始缓慢运行。慢跑比快跑更糟。慢速组件有时以低于正常速度1%的速度运行,可能很健康,可以说“我还在这里!” 但速度慢到足以阻塞所有工作。这使快速故障方案容易受到攻击。
 
云计算环境增加了亚稳定性
14世纪哲学家让·伯里丹(Jean Buridan)命名的悖论叫做“伯里丹的屁股” 。Buridan的《屁股》强调了确定性概念固有的明显矛盾,或者认为每个事件都源于先前事件。矛盾的是,一个非常饿的驴正好放在两捆干草之间的中间位置。假设驴将去最近的资源,它将饿死。
在电子学中,有一种称为METASTABILITY的现象。这意味着系统可能会在无限制的时间内处于不稳定状态。为了使有效信号作为电路的输出,它必须位于一定的电压或电流水平之内。如果输出降落在中间的灰色区域,则下一个电路会发生混乱的情况。它也可以做奇怪的事情。
这种亚稳定性是异步电路固有的。由于您不知道输入信号的时序,因此在某些时候,各种输入会同时到达,并且电路无法在两捆干草之间做出决定。
步数字系统通常在输入信号上添加仲裁器,以确保对信号进行排序,从而避免亚稳态。当在同步设备的时钟域内工作时,时钟用于确保提供给逻辑电路的输入的时序,并且避免了亚稳性问题。当同步电路接收输入的异步信号时,特殊的同步器将使亚稳性的可能性逐渐消失,但仍然是可能的。
如果我们将分布式系统转移到复杂的云计算环境中,则我们的分布式系统设计会带来很多新问题。在虚拟机中运行服务器可为您提供大量有价值的计算,而且价格合理。但是,它可以根据自己的时间范围进行操作。嘈杂的邻居问题是指您的虚拟机与同一个物理服务器上的其他虚拟机竞争资源时,其容量有所变化。多核服务器增加了乐趣,因为它们的协调可能会或可能不会阻止您希望发送的消息。通过云网络基础架构进行的旅行可能会遇到拥塞,导致通信模仿美国邮局。这使得基于计时器的故障快速概率成为可能。
以前,当我们将分布式系统与非常可预测的服务器和网络组成时,您会想到一个很好的主意,即您的队列可以多快完成健康检查。使用该期望,您可以快速删除有病的节点,而仅很少删除健康的节点。这是一个概率游戏,您做出正确决定的机率极高。这很像在时钟域内工作的电路,以避免亚稳态行为。 
服务器和/或往返于它们的消息并非总是以可预测的速度工作。它与删除同步电路中的时钟非常相似,因此它是一个异步数字系统。我们可以抑制和消除亚稳定性的可能性已经大大降低。  
更糟糕的是,我们的大多数系统都依赖于数据中心中的其他系统。HDFS取决于Zookeeper 。Zookeeper和其他服务取决于DNS 。这些系统中的每一个都有超时和重试。这可能会导致级联的延迟,超时和故障。这是亚稳态的另一种形式,可以加重问题而不是减轻问题。
当这种亚稳定性干扰分布式系统中的主要系统或领导者时,您将无法快速访问我们许多系统所需的“完美真理”或线性化能力。可用性可能会受到很大影响。
 
分布式算法:“相当好”胜于完美
现在,让我们将注意力转移到那些不能给出最新理想答案的算法上(banq注:CAP定理的高一致性与可用性)。当对用户的请求基于包含过期状态的复制节点群时,任何一个节点就足够了。
我们看到了类似的新兴容忍算法,用于日志记录。Apache Bookkeeper [3]是一个开放源代码日志记录子系统,在该子系统中,无需向包含日志副本的所有日志服务器发送将新记录追加到日志的写操作。到达所需的子集就足够了。
同样,AWS Aurora [1],[2]在集中式服务器中运行数据库,但将其更新发送到存储服务器池。由于并非所有存储服务器都需要及时响应,因此Bookkeeper和Aurora所采用的方法可显着提高服务器延迟的弹性。单个副本可以活在自己的时间扭曲中,而我们更广泛的分布式算法则可以轻松进行。
 
您是否遇到过稳定的分布式算法?
在超现实世界上运行时,我们的某些算法确实是稳定的。但是,有些不是。如果继续朝着亚稳态集群发展的趋势,则依赖于固定的响应服务器集合来传达高度一致的线性化数据的任何算法都将越来越面临挑战(CAP定理)。
哪些算法可以为我们提供清晰明了的线性化更新以及99.9%的时间快速延迟?大约有99.999%的时间?当环境压力很大时,这些反应如何?  
我们如何才能从对亚稳性敏感的算法发展到一个可以容忍和抑制大多数亚稳性的世界?