又是一年放榜日,众多考生满怀期待的点开招生网,结果输了信息才发现根本没办法查询——查询人数太多了,直接把系统打挂了!

这个时候,还没翻身的码农闰土被问到一个直击心灵的问题:这个系统可用性达到了多少个 9?

想要回答这个问题,我们得先有些前置知识。

可用性&可靠性

这两个词很相似,我也一直找不到一个很好的定义区分这两个词,直到后来在看分布式系统的时候,看到了一个解释:

可用性被定义为系统的一个属性,它说明系统已准备好,马上就可以使用。换句话说,高度可用的系统在任何给定的时刻都能及时地工作。 可靠性是指系统可以无故障地持续运行,是一个持续的状态。与可用性相反,可靠性是根据时间段而不是任何时刻来进行定义的。

举个例子,想要评估一个舔 🐶,可用性就是你找他的时候能不能找到,而可靠性就是你需要花钱的时候他出手大不大方。一个舔 🐶 如果随叫随到,但是花钱太抠,就是高可用、低可靠;而如果他经常找不到人,但出手很大方,就是低可用、高可靠。

类比到系统时,如果系统在每小时崩溃 1ms,那么它的可用性就超过 99.9999%,但是它还是高度不可靠。与之类似,如果一个系统从来不崩溃,但是每年要停机两星期,那么它是高度可靠的,但是可用性只有 96%。

百度百科对于系统可靠性的解释是:系统可靠性一般是指在规定的时间内和规定的工况下,系统完成规定功能的能力/概率。也就是系统的无故障运行概率。而在我们在评估一个系统的可用性和可靠性时,一般都会说三个 9,四个 9 之类的。这些一般都是说系统的**SLA(Service Level Agreement)**具体是几个「9」,以此,来表示该系统一年中具体宕机的时间。对于这几个 9 的解释,我会放到第三节来详细解释。

不过,在实际交流过程中,大多数人对这两个词的理解还是差不多的。况且咬文嚼字也并非本文的主题,接下来我们来看看可用性的计算方式。

可用性计算

通常我们用 A 表示一个系统的可用性,用以下几个指标来辅助计算:

相关指标

MTBF

MTBF,即平均故障间隔时间,英文全称是“Mean Time Between Failure”。是衡量一个产品(尤其是电器产品)的可靠性指标。单位为“小时”。具体来说,是指相邻两次故障之间的平均工作时间,也称为平均故障间隔。

MTTR

MTTR,全称是 Mean Time To Repair,即平均修复时间。是指可修复产品的平均修复时间,就是从出现故障到修复中间的这段时间。MTTR 越短表示易恢复性越好。

通过上述公式计算出单个组件的可用性后,我们便可以以此计算出整个系统的可用性,而系统可用性是通过将系统建模为串联和并联的组件来计算的。以下规则用于确定系统是串联的还是并联的:

  • 如果组件的失效导致组合变得不可操作,则认为这两个部件是串联操作的
  • 如果组件的故障导致另一部件接管故障部件的操作,则认为这两部件并行操作

串行可用性

如上图所示,两个组件 X 和 Y,如果有一个出问题导致整个组合都不可用,就认为 X 和 Y 这两个组件是串联的。只有组件 X 和组件 Y 同时可用时,整个组合才可用。由此可见,组合的可用性是这两部分的乘积,公式如下:

A = Ax Ay

从上面的等式我们看出,串联系统中,整体组合的可用性,总是低于单个组件的可用性。

对于上面 X 和 Y 两个串联组件,可用性如下:

从上面的表中,我们看到,即使使用了非常高可用性的组件 Y,但组合系统仍然受组件 X 的影响,会降低好多,和「木桶原理」一致,都受最短板的影响。

并行可用性

如上图所示,如果两个组件都失败时,整个系统会失败的话,这两个组件会被认为是并行的。任一组件可用时,整个系统都是可用的。整体可用性是 1- (两个组件都不可用),公式如下:

A = 1-(1-Ax )2

从上面我们能看出,两个组件并行的系统,整体可用性要任一单独的组件可用性高。如上图假设是组件 X 的两个部分,可用性如下:

我们看到,即使一个可用性低的组件 X,组合后的系统可用性也很高。

X 个 9

说完了可用性的计算后,总算是回到本文的重点了,有个衡量其可靠性的标准——X 个 9,X 个 9 表示在系统 1 年时间的使用过程中,系统可以正常使用时间与总时间(1 年)之比,我们通过下面的计算来感受下 X 个 9 在不同级别的可靠性差异。

  • 3 个 9:(1-99.9%) × 365 × 24=8.76 小时,表示该系统在连续运行 1 年时间里最多可能的业务中断时间是 8.76 小时。
  • 4 个 9:(1-99.99%) × 365 × 24=0.876 小时=52.6 分钟,表示该系统在连续运行 1 年时间里最多可能的业务中断时间是 52.6 分钟。
  • 5 个 9:(1-99.999%) × 365 × 24 × 60=5.26 分钟,表示该系统在连续运行 1 年时间里最多可能的业务中断时间是 5.26 分钟。

那么 X 个 9 里的 X 只代表数字 3~5,为什么没有 1~2,也没有大于 6 的呢?我们接着往下计算:

  • 1 个 9:(1-90%) × 365=36.5 天
  • 2 个 9:(1-99%) × 365=3.65 天
  • 6 个 9:(1-99.9999%) × 365 × 24 × 60 × 60=31 秒

可以看到 1 个 9 和、2 个 9 分别表示一年时间内业务可能中断的时间是 36.5 天、3.65 天,这种级别的可靠性或许还不配使用“可靠性”这个词;而 6 个 9 则表示一年内业务中断时间最多是 31 秒,那么这个级别的可靠性并非实现不了,而是要做到从“5 个 9” 到“6 个 9”的可靠性提升的话,后者需要付出比前者几倍的成本。

可用性 A X 个 9 停机时间(分钟) 适用产品
0.999 3 个 9 500 电脑或服务器
0.9999 4 个 9 50 企业级设备
0.99999 5 个 9 5 一般电信级设备
0.999999 6 个 9 0.5 更高要求电信级设备

怎么做到更多的 9?

每个公司对几个 9 的定义都不一样,好多的互联网公司要求都是 99.99。像一些事业单位网站,办事网站等,经常故障服务不可用,估计最高也就到 99.9。

而我们经常用到所谓 4 个 9 或者 5 个 9,也就是 99.99%与 99.999%。虽然这两者的差距是 0.009%,还不到 0.01%。但对于系统而言,恰恰是这不到 0.01%的差距,决定了系统完全不在一个档次上。

我们知道一个系统的可靠性并不完全取决于硬件,而由软件和硬件共同来决定,如果是软件问题,就需要监控自己的服务,在服务出现异常或者宕机的时候,能及时恢复。增加冗余,防止出现问题。

但是要提高系统的可靠性,除软件外,还有硬件的部分,包括网络、服务器以及存储设备等。其中,网络可以借助多运营商接入来解决,存储有 RAID、快照等应对技术,通过备份来提高数据安全性。对于服务器来说,我们可以选择集群的方式保证高可用。