论文地址:网络可靠的标准——Bailis和Kingsbury 2014

    网络可靠性很重要,因为它阻止我们进行可靠的通信,而这反过来又使构建分布式系统变得非常困难。(Peter Deutsch的“分布式计算的八个谬误”中的谬误1是“网络是可靠的”)。
    事实上,如果我们看一下这个列表,我们可以看到前三个谬误都对应于网络中有趣的失败模式,以及在快乐的道路上你必须考虑的东西。例如,突然的大延迟尖峰可能会对故障检测器造成很大的干扰,而嘈杂的网络邻居可能会占用您的大量带宽。

    • 网络是可靠的。
    • 延迟为零。
    • 带宽是无限的。
    • 网络是安全的。
    • 拓扑结构不变。
    • 有一个管理员。
    • 传输成本为零。
    • 网络是同质的。

    第5位也是我们必须学会适应云部署的全新程度。拓扑结构一直在变化是常态。
    如果我们可以假设“网络足够可靠”,那么在发生分区时变得不可用可能是一种工程权衡。我听说有人说“分区只在云中发生”,但在我们自己的数据中心中,我们从未真正看到它们的实际应用。本文作者之一凯尔·金斯伯里(Kyle Kingsbury)在精彩的Jepson报告中所做的有意识的权衡表明,现实世界中的许多系统都在与网络分区做斗争。
    部署环境中的可靠性程度在稳健系统设计中至关重要,它直接决定了系统能够可靠地执行而无需等待的操作类型。不幸的是,网络在现实世界中的可靠程度是一个值得讨论和不断发展的问题。一些人声称网络是可靠的(或者分区在实践中很少见),我们过于关注理论失效模式的设计。相反,其他人证明分区确实发生在他们的部署中…
    我们有一些关于磁盘、主机和机架故障率的非常好的统计数据,但关于网络故障的统计数据不多。然而,网络故障可能比磁盘故障等更具破坏性。
    因此,我们对现实世界中分布式系统的失效模式的大部分看法都是建立在猜测和谣言的基础上的。系统管理员和开发人员将交换故事,而不是啤酒,但详细的,公开的事后调查和全面的网络可用性调查是很少的。在这篇文章中,我们想非正式地把这些故事(在大多数情况下,这些故事是毫不掩饰的轶事)集中起来…
    下面是一长串你能想象到的各种网络故障的故事。这是一种累积效应,让你在阅读的过程中——从第2页开始,思考“是的,好吧,孤立的场景”,但故事总是来来往往。当你读到第12页时,你可能已经得出结论:墨菲在制定他著名的法律时,一定是在做一名网络工程师!
    分布式系统中脑分裂、分区、设备故障、链路故障、高数据包丢失率、维护和管理问题等等都在这里-导致在其上构建的系统出现严重错误。

    这读起来像是喜剧节目的小品:
    这个90秒的网络分区导致使用Pacemaker和DRBD(分布式复制块设备)进行HA(高可用性)故障转移的文件服务器相互声明对方死亡,并相互发出STONITH(向头部的另一个节点开枪)消息。网络分区延迟了这些消息的传递,导致一些文件服务器对认为它们都处于活动状态。当网络恢复时,两个节点同时射击。由于两个节点都已关闭,属于这对节点的文件不可用。
    你真的需要通读这篇论文才能得到整体印象,一个总结不能做到公正。
    因此:
    脑分裂并不是一个学术问题:它有时会连续几天发生在各种系统上。网络分区值得认真考虑…在分区发生之前考虑这个风险是很重要的,因为在白板上对分区行为进行决策要比在生产环境中重新设计、重新设计和升级复杂的系统容易得多,特别是当它向用户抛出错误时。对于某些应用程序,失败是一个选项,但您应该将其作为设计的一部分进行描述和明确说明。最后,考虑到分区感知设计的额外延迟和协调优势,您可能会发现,在一般情况下,计算这些分区也会带来好处。

    作者还承认,可能存在可靠的网络:
    另一方面,一些网络确实是可靠的。大型金融公司的工程师们曾轶事般地报告说,尽管他们在设计能够优雅地容忍分区的系统方面付出了认真的努力,但他们的网络很少(如果有的话)表现出分区行为。谨慎的工程和积极的网络发展(以及大量的资金)可以防止中断。此外,在本文中,我们介绍了故障场景;我们承认,要证明网络没有发生故障要困难得多。
    但如果我考虑未来的架构和云部署,我就不想依赖它。