MTTF(Mean Time To Failure,平均失效前时间)指系统可无故障运行的平均时间(或者工作次数),越高表示系统持续服务能力越强;
MTTR(Mean Time To Recovery,平均故障恢复前时间)指从出现故障到修复故障之间的时长(包含了确认失效和排查故障源头等所需的时间),越短表示系统易恢复性越好;
MTBF(Mean Time Between Failures,平均故障间隔时间)指两次相邻故障之间的时长,MTBF=MTTF+MTTR。通常MTTR远小于MTTF,因此MTBF≈MTTF;
此外,还有MTTD(D表示Detect,指检测)、MTTA(A表示Acknowledge,指响应时间)、MTTI(I表示Identify,指识别和确认)、MTTK(K表示Know,指定位到根因)、MTTV(V表示Verify,指实施修复之后验证工作所需的时间),以及MDT(Mean Down Time)、MTRS(Mean Time to Restore Service,MTRS = total downtime / # of failures)、MTBSI(Mean Time Between Service Incidents,MTBSI = MTBF + MTRS)、等一批术语,原理大体相同。
这三种选择如下图所示,综合来看,我们选择第一种方案。3.1.3.2 挑战2:活跃与不活跃阶段如果一个用户很久不请求(离开电脑去吃饭了,关掉手机去睡觉了),隔了几小时或者几天才发来下一个请求,该用户的时间轴(提醒:在这套理论里,每个用户是有自己的时间轴的,用户之间的时间轴是独立不相干的)会出现一段很长很长的绿色(或红色)线段。在这段期间系统对他来说是down还是up呢?或者问,这段时间要算为uptime还是downtime呢?似乎都不合适。谷歌团队引入了一个“cutoff时间”的新概念。如果一个用户两次请求相隔时间超过cutoff时间,这段时间忽略不用于计算uptime和downtime。一个系统可以选定自己的cutoff时长,谷歌团队选择的是用户在线交互平均时间间隔的99线(the 99th percentile of the interarrival time of user requests),对Gmail而言就是30分钟。克服这两个挑战之后,我们就可以重新定义uptime、downtime及inactivetime:我们可以说,这里的uptime是特指user-uptime,是站在用户侧看到的uptime,即对用户来说一款互联网产品对他而言,切切实实的正常工作时间。3.1.4 实验例子谷歌做了这么一个实验,模仿用户行为随机地向系统发起请求,并故意制造一场持续15分钟的故障(发生在30~45分钟期间),以下图为例,是其中2个用户(user0和user1)的请求分布情况,也是他们俩人使用产品的“亲身体验”。实验总时间是60分钟,系统故障时间是15分钟(即,系统正常时间是45分钟)。直观来说,这个系统的可用性的期望值应该在45÷60=75%左右。那么,实验结果是75%吗?谷歌将这个实验重复做数千次,并统计出请求成功率(success-ratio)和用户可用时间(user-uptime)两个指标的可用性正态分布图。可以看出:
既然系统稳定性管理员从上一张图已经得知系统发生过一次持续近2小时的故障,从MCR图表下钻到更细粒度的“每分钟可用性”详图便可以知道这次故障在某一天下午13:50开始发生功能异常(影响用户请求),在15:40开始逐步恢复,到16点附近系统可用性爬升回到99.9%理想水位,整个过程持续了约2个小时。3.2.3 MCR单调递增谷歌在数学上证明了MCR公式的单调性(monotonicity),篇幅太长这里不赘述,证明过程详见paper原文(5.2、5.3及尾部附录Appendix章节)。也就是说,只要窗口是越来越大,那么MCR曲线只会越走越高,斜率取决于系统真实可用性和故障程度。但MCR曲线是不会往下走的。通俗地说,1hour的Worst Availability是不会比1分钟的更低。由于1分钟是包含在1小时之内的,如果1分钟的最差可用性为99%,那这1个小时也差不到哪去,肯定不会比99%更低,而只会比99%更高至少持平。4. 指标的关系4.1 分开来看谷歌收集了全部Google G Suite产品(Calendar、Docs、Drive、Gmail、等)在2019年度的用户请求数据(已脱敏),并分别从用户可用时间(user-uptime)及请求成功率(success-ratio)两个角度去计算,向我们展示了这两项指标的作用,以及优劣势。如开篇所言,Google G Suite团队原先就只有success-ratio图表但看着总觉得哪里不够用,指导性不够,才会去折腾琢磨user-uptime这个新指标。好消息是,试水结果很好,没有白折腾。
X轴是不同的窗口大小,可以看到橙线和蓝线形状和斜率相似,但橙线水位更高。无论是数据1按时间分布,抑或数据3按窗口累计分布,可以看到user-uptime橙线都要比success-ratio蓝线更高一些。让我们下钻到每分钟的详图,在这个故障发生之前(下图最左侧)和故障恢复之后(下图最右侧),橙线蓝线基本吻合。但是,在故障持续期间两条线有明显偏差,为什么呢?进一步分析,发现是来自一批Google G Suite产品的滥用用户(abusive users),他们使用第三方邮箱产品并设置同步Gmail邮件,但这个第三方产品功能有bug,可以同步中低数量邮件的邮箱,但无法成功同步海量邮件的邮箱,同步过程会报错并立即重试(不断又循环失败下去),重试之前没有间隔一定的休眠时间。这批滥用用户会拉低请求成功率(success-ratio)指标,并不断上下抖动,但由于请求失败的只是这一小戳用户,其余大量用户的请求全部都成功,用户可用时间(user-uptime)指标看上去就平稳。4.2 兼容并包,各取所长从上文数据1、数据2和数据3的分析可以看出,请求成功率这个指标的最大问题在于容易受特殊用户(超高频用户、滥用用户、等)的行为干扰,而用户可用时间这个指标则更加稳健,不易受干扰。借助上文这两项指标的数据对比,谷歌系统管理员便可以直观意识到有哪些极端用户和意外场景的存在,并进一步追查和优化,如联系第三方邮箱产品并沟通适配同步Gmail邮件的方式等。以前只有请求成功率这一张图,管理员是不易察觉到这样的深层次问题的存在的,可能会盯着蓝线单调地起起伏伏而熟视无睹,现在有了橙线的辅助,偏差一目了然。有偏差,就意味着哪里有问题。下面左图是把2个指标摆一起看,右图是把2个产品摆一起看,一对比,一些隐藏问题就可以跃然纸上。因此,这两个指标(其它指标亦然)之间不是非黑即白的矛盾关系,而都是系统管理员武器库中的成员,武器种类越多当然越好。而且,这些武器不是那种管理员手上拿着刀便举不了枪的互斥关系,而是手上拿着刀头上还戴多一副红外夜视眼镜的相辅相成关系,让黑夜里数据变得更直观,信息更透明。4.3 已获得银弹和万能钥匙?答案是否定的。尽管新指标有诸多优点,新指标与成功率等旧指标摆在一起呈现可以给管理员提供更多信息和线索,但不意味Success-Ratio、MTTF/MTTR、SLA/SLO等旧指标就一无是处,也不意味着User-Uptime新指标就无所不能。举个最常见的例子,某些故障令用户请求根本就达到不了系统(域名DNS失效、机房光纤挖断、等),这些也影响产品可用性和用户体验,但无论Success-Ratio还是User-Uptime都是“灯下黑,睁眼瞎”,需要其它手段。5. 需求不断,创新不止回顾Google G Suite团队整个指标创新的过程,我的感觉是这样的:回到开篇管理员的那声嘀咕,假如你在工作中也浮现过这样的“别扭瞬间”,说明当前的工具或者方法还不够好,说明有创新空间在,说明自己和团队可以抓住这个宝贵的痛点痒点进一步深挖和创造。可能今天介绍的User-Uptime新指标不一定适用于你的产品你的系统,但这个敢于创新的精神是普世的。再大的痛点也不慌,再小的痒点也不要错过,“从0到1是创新,从1到1.1也是”,与诸君共勉。6. 参考资料: