Erlang的99.9999999%(九个九)可靠性

112

Erlang已有超过20年的生产系统应用历史,其可用性达到99.9999999%。

我进行了如下计算:

20*365.25*24*60*60*(1 - 0.999999999) == 0.631 s

这意味着在20年的时间段内,该系统仅有不到一秒的停机时间。我并不试图挑战这个有效性,只是好奇我们如何能够有意或无意地将一个系统关闭仅0.631秒。熟悉大型软件系统的任何人能向我们解释一下吗?谢谢。


有人知道如何计算集群处理单元(或机器)上服务的停机时间吗?


32
也许它被用于远超过一个电脑——有些国家的生育率只有1.2个孩子… - weltraumpirat
3
由于Erlang的分布式特性,它需要在许多计算机上使用,这是有道理的。 - Ning
15
没错,这是服务的正常运行时间,而不是运行该服务的计算机。 - RCE
4个回答

100

可靠性指标并不是衡量 AXD301(所讨论的项目)任何部分在20年内关闭的总时间。它代表了在这20年中,AXD301 系统提供的服务从未离线的总时间。微妙的区别。正如 Joe Armstrong 在 这里 所说:

AXD301 实现了九个 9 的可靠性(没错,你没看错,99.9999999%)。让我们把它放在上下文中:五个 9 被认为是很好的(每年 5.2 分钟的停机时间)。七个 9 几乎是无法实现的……但我们做到了九个。

为什么呢?没有共享状态,加上一个复杂的错误恢复模型。

如果你深入挖掘一下,阅读 Joe 写的博士论文(其中包括对 AXD301 的案例研究),你会发现:

本章研究的项目之一是爱立信 AXD301,一种高性能、高可靠性的 ATM 交换机

因此,只要交换机所在的网络没有停机,作者就可以宣称AXD301具有“九个9的可靠性”(这是他所说的全部,避免了具体细节)。这并不一定意味着Erlang是产生如此高可靠性的唯一原因。

编辑:实际上,“20年”本身似乎是一种误解。乔在同一篇文章中提到了20年的数字,但它实际上与九个9的可靠性数字没有直接联系,后者可能来自一个更短的研究(正如其他人所提到的)。


13
RCE说:“是的,这是服务的正常运行时间,而不是运行它的计算机。” - Luke Stanley
就像我回到了1993年在GT MSCS上学一样!你做得很好。 - Mike Polen
4
正如我在回答中所解释的那样,这个数字并不是基于AXD301运营20年的数据。它是基于英国电信在单次试验中对14个节点进行了8个月的测试。这几乎无法代表AXD301系列在20年内的全部运行特性(我相信它们仍然很棒,只是没有达到九个"9"的水平)。 - Edwin Fine
我的电脑在过去的三秒钟里出现了十五个九。故障是随机的,如果你没有足够长时间的采样,你不一定能看到完整的故障分布。话虽如此,我在寻找有关为什么艾伦哲学很棒的东西时发现了这个页面,所以我对这个说法的精神几乎不持异议。 - lahwran

59
虽然其他人已经回答了你提出的具体问题,但是你的问题似乎基于错误的理解。你提出问题的方式让我认为你在想象系统在崩溃或因维护而关闭之后需要手动处理才能重新运行。
Erlang有几个功能可以消除人工工作时间作为停机时间的来源:
1. **热代码重载**。在Erlang系统中,很容易为现有模块编译和加载替换模块。BEAM仿真器会自动进行交换,似乎不会停止任何东西。这个转移过程无疑会花费一些微小的时间,但它是以计算机时间自动进行的,而不是以人工时间手动进行的。这使得可以实现几乎零停机时间的升级。(如果替换模块存在导致系统崩溃的错误,那么您在部署到生产环境之前需要进行测试。)
2. **监视器**。Erlang的OTP库内置了一个监视框架,可以定义系统在模块崩溃时应该如何反应。标准操作是重新启动失败的模块。假设重新启动的模块不会立即再次崩溃,则整个系统的停机时间可能只有几毫秒。稳定的系统可能确实只累积了几年的运行时间内有一小部分停机时间。
3. **进程**。这些大致对应于其他语言中的线程,但它们除了通过持久数据存储之外不共享状态。除此之外,通信是通过消息传递进行的。由于Erlang进程非常廉价(比操作系统线程便宜得多),这鼓励了一种松散耦合的设计,使得如果一个进程死亡,只有系统的一小部分会经历停机时间。通常,监视器会重新启动该进程,对系统的其他部分几乎没有影响。
  • 异步消息传递。当一个进程想要告诉另一个进程一些信息时,Erlang语言中有一个一流的运算符可以让它这样做。发送消息的进程不需要等待接收方处理消息,也不必协调发送的数据的所有权。Erlang的消息传递系统采用了异步函数式的特性来解决这些问题,这有助于保持高可用性,因为它减少了系统某个部分停机对其他部分的影响。

  • 集群。这是从前面的观点得出的结论:Erlang的消息传递机制在网络上的多台机器之间工作得很透明,因此发送进程甚至不必关心接收方是否在单独的机器上。这提供了一种简单的机制来将负载分散到许多机器上,每个机器都可以独立地关闭,而不会影响整个系统的正常运行时间。


  • 15
    重要的是要注意如何计算停机时间。 只要ATM交换机进程本身不停止,无论您交换多少次代码模块,重新启动失败的模块等都没有关系。 就像YouTube一样-下载可以暂停几秒钟-但只要您有足够的缓冲器,视频仍然可以播放 :) - NPSF3000
    你关于Erlang的所有描述都是正确的;误解在于整个AXD301系列具有九个9的可用性,这一点我在我的回答中进行了解释。 - Edwin Fine

    38
    99.9999999% 的可用性数字是一个经常被引用但基本上是误导性的统计数据。AXD-301团队成员之一Mats Cronqvist在2010年Erlang Factory会议上(我参加了这个会议),就这一精确可用性统计数据做了演讲(视频)。他说,这一数字是由英国电信声称的,在使用AXD-301进行为期“5个节点年”(我认为是从2002年1月到9月)的试验期间得出的。试验结束时有14个节点运行实时流量。
    Cronqvist特别指出,这并不能代表整个AXD-301历史或Erlang的普遍情况,并且他并不高兴Joe Armstrong一直引用这个数字,导致人们对Erlang的可靠性抱有过高期望。其他人写道,五个九更符合实际情况。
    应该说明的是,我是一个狂热的Erlang支持者和开发者,相信在专家使用Erlang的情况下可以实现非常高可用的系统,但只是希望减少炒作。当然,我假定Cronqvist对事实的陈述是准确的,没有理由相信其他情况。

    1
    非常感谢我的帖子的编辑们,他们对其进行了大幅改进(修复了一个损坏的链接,添加了演示视频)。 - Edwin Fine

    7

    我理解这些统计数据是针对生产中的所有AXD301系统进行计算的。我们可以预期,当AXD301出现严重问题时,它将停机超过0.631秒。在此期间,其他AXD301将接管以保持网络运行。

    然而,当你将所有正在运行的AXD301的总小时数相加,并为一个失败的AXD301计算比率,你会发现99.999999%。

    这就是我理解这个数字的方式。

    希望这有所帮助。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接