我在极客时间《架构实战营》的视频课里面,经常遇到同学问"MTTR、MTBF、MTTF、可用性、可靠性"这一大堆名词的区别于联系,坦白的说,以前我们在做架构设计方案的时候,并没有太多去刻意深入研究这几个名词,更多的只是知道大概的含义,以及在实际架构设计和监控中我们应该怎么做。通常我们会发现,大家用的比较多的就是“几个9”这个高可用的指标,具体在计算的时候就是统计非故障的时间占总运行时间的比例,而且一般情况下,我们谈论可靠性和谈论可用性基本是一个意思,有的人习惯说可靠性,有的人习惯说可用性,大家沟通交流也没有什么障碍。
虽然如此,很多同学反馈在面试的时候要背背八股文,如果这些指标的区别和联系不清楚的话,面试的时候很容易讲不清楚,或者讲的时候发现卡壳了,因此我决定深入去研究一下,按道理来说这个东东应该是很容易查到的。
好家伙,不查不知道,一查吓一跳,这几个概念的解释和理解,网络上的文章也是各种说法,有的说法还是自相矛盾的,我挑选几个典型的说法给大家感受一下。
第一种解释(原文链接):MTBF = MTTF + MTTR
第二种解释(原文链接):MTBF = MTTD + MTTR + MTTF
这篇文章里面的图和MTBF的计算方法是冲突的,按照它的计算方法,MTBF应该是MTTF的平均值,但是图里面展示的内容却又是:MTBF = MTTD + MTTR + MTTF
第三种解释(原文链接):MTBF是指系统正常运行的时间,不包含MTTR
这个定义符合我最初的理解,但是如果这样理解的话,感觉MTBF和MTTF又是一样的意思了。
第四种解释(原文链接):这是wiki的解释,实际上也是我们在做监控的时候用到的方法
初步一轮查下来,我自己都有点懵逼了,主要疑惑的点有几点:
1)MTBF包含MTTR吗?我个人理解是不包含的,如果包含的话,理解起来就怪怪的,也与实际计算可用性的公式对不上;
2)MTBF和MTTF是什么关系?MTBF = MTTF + MTTR吗?
3)可用性和可靠性什么关系?可靠性高是不是就可用性高?
带着这些疑问,继续深入查询,经过持续两天的查各种中文英文资料,最后总算把这几个东东给梳理清楚了。下面我们来看一下如何理解这些概念的区别以及它们的关系。
首先,最重要的一点,也是理解这一堆概念的关键,就是我们要把故障分为“可修复”和“不可修复”故障,字面意思很好理解,举个简单的例子:我们的电脑是一个可修复的系统,比如说内存条坏了,我们就换一根内存条后电脑还是可以继续用;但是内存条坏了,对于内存条来说,这就是“不可修复”的故障,我们就只能换内存条。
有的人可能会说:内存条坏了也可以修呀,没有什么东西修不好的!这个道理是对的,但是实践中这样做就是错误的,原因在于修复的成本太高了,可能一条新的内存条价值100元,你修复一条烧坏的内存条成本是200元,因此对于这种“不可修复”的故障,我们肯定是直接换更划得来。但是如果电脑只坏了一根内存条,你就把整个电脑都丢了,要么你是土豪,要么就是傻了 :)
把故障分为“可修复”和“不可修复”有什么意义呢?主要就在于不同的故障我们衡量的指标不同,对于“可修复”的系统,我们衡量的是它的“可靠性”和“可用性”,这里的可靠性是指“正常运行的时长;对于“不可修复”的系统或者元器件,我们衡量的是它的可靠性,但这里的可靠性是指“寿命”。
基于这个理解,我们就可以把这一大堆概念分为两组:
因此,第一个结论就很明显了:MTTF是用来衡量“不可修复”的元器件(系统、资产等都可以)的“寿命”(可靠性),统计方法就是收集大量的元器件的寿命然后取平均值。MTTF不是MTBF的一部分,两者的应用场景是不同的,MTTF和MTBF只有一字之差”To“和”Between“,含义就是可修复和不可修复的区别。更进一步的解释可以参考这篇文章:What is mean time to failure?
接下来我们看第二个关键概念:MTTR。通过前面的截图我们可以看到,这个MTTR的解释有多种,有的把R解释为Recovery,有的解释为Repair,有的包含发现时间、定位时间、修复时间,有的只是说是修复时间,不包含发现和定位时间,因此又多了一个MTTD(Mean time to diagnose)的概念。
因为没有规范定义,我也不能直接说这些理解就一定不正确,但是无论从计算还是理解简单的角度来看,我觉得把MTTR理解为故障发生到故障修复完成这段时间是最合适的,这个时间段包括发现时间、定位时间、修复时间。当然,我们在做系统设计的时候,确实需要将MTTR继续分解为如何快速发现(监控设计)、如何快速定位(问题定位设计,例如日志收集、全链路跟踪)、如何快速恢复(例如倒换、降级)等,但是在计算可用性和可靠性指标的时候,是不需要将MTTR进一步细化的。
明白MTTR的定义后,第三个概念MTBF就很好理解了,MTBF就是指系统正常运行的平均时间,MTBF不包含MTTR,因为系统在故障修复期间是没有正常提供服务的。这也是MTBF中的”Between“的含义。因此我们可以看到wiki上关于MTBF的解释是正确的。MTBF的计算方式如下:
当我们理解MTTF、MTTR、MTBF的定义后,再来看看可靠性和可用性的定义和理解。
可靠性:无论是“可修复故障”还是“不可修复故障”,都有可靠性,但是衡量指标是不同的。
对于”不可修复故障”的元器件,可靠性衡量指标就是MTTF,简单来说就是寿命越长越可靠,比如说同样是内存条,A品牌的MTTF是2年,B品牌的MTTF是3年,那么B品牌的内存条更可靠。
而对于“可修复故障”,衡量可靠性指标就是MTBF,简单来说就是故障次数越少越可靠,比如说同样是电脑,A品牌的某个电脑一年坏5次,B品牌一年坏1次,那么肯定B品牌的可靠性高。
可用性:定义为系统正常运行的时间占比,其计算公式是:Availability = MTBF/(MTBF + MTTR)。有趣的是,可用性只涉及“可修复故障”,为什么呢?对于不可修复的故障来说,只要坏了就废弃了,就不存在什么正常运行时间的比例这个说法了。
虽然可用性的公式比较简单,但是这个公式背后蕴含的信息不少,我们来看几个有趣的问题:
如果你认真对照可用性的公式,以及前面关于MTBF和MTTR的定义,相信你能够推导出这几个问题的答案至于具体的解释,你可以尝试自己思考一下,如果你有疑问,可以在评论里面回复。
最后再汇总一下几个关键点: