其他
可用性指标大家族
量化互联网产品可用性的方法论有很多,基于数量的Success-Ratio、基于目标的Error-Budget、基于故障时间的MTTR/MTTF、基于规则阈值的SLA/SLO、基于状态的Up/Down、等等,还有一个比较新颖的指标:基于用户时间的User-Uptime(及其派生出的Windowed User-Uptime)。只要需求不断,指标家族就会不断有新成员加入。
“improving availability”:提升系统稳定性,如优化代码和系统架构,力求提供高质量的代码制品和高性能高可用的运行环境; “quantifying availability”:量化系统稳定性,如统计成功率、请求延迟等指标,力求能一目了然地回答“我的产品挂了没有”、“一个月挂多久”等问题,也方便对外做出商业化SLA承诺“请您放心,我的产品一个月最多只挂这么久!”(尤其付费云服务)
基于数量的Success-Ratio 基于目标的Error-Budget 基于故障时间的MTTR/MTTF 基于规则阈值的SLA/SLO 基于状态的Uptime/Downtime ……
定义: 指一段时间内(如一天、一周、一个月)成功请求的数量除以全部请求总数量,success-ratio=successful request count÷total request count。是失败率的反义。 优点: 原理简单,说服力强,易统计。 缺点: 二义性。产品在同一时间统计到的请求成功率只有一个结果(如98%),但不同人却会有不同的感知和解读。典型情况就是高频请求用户和普通用户,前者发出98个请求失败了1个,后者可能发出了1个请求就失败了1个(对他们来说失败率是100%)。而对系统整体而言,收到了100个请求失败了2个,成功率计算结果确实是98%无误。 结果虚高。一类用户在发现产品故障后会选择离开一会(不想坐在那里不停重试),失败请求的数量少下去,公式计算出来的成功率百分比会偏高(分子不变,分母变小,商变大),无法准确反映对用户的影响程度。
定义: 指一段时间内系统正常时间除以总时间,incident-ratio=up minutes÷total minutes。“up”和“down”取决于系统已知的线上系统故障。 优点: 直观,说服力中等。 缺点: 二义性。何谓up何谓down,需要去定义,则存在人为操作和解释的空间。 不适用于大型分布式系统。对现代化的大规模系统而言,几乎不存在绝对的down和绝对的up,微服务拆分、多实例部署、主从热备、异地多活等手段令得整个网站很难彻底挂,而可能只是商品评论按钮点击没反应、购物车列表加载不出来、广东某市访问变慢、之类的“局部”异常。
定义: 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)、等一批术语,原理大体相同。 优点: 倾向于描述系统整体可用性的宏观情况。 缺点: 与“系统故障率Incident-Ratio”指标一样,需要去定义故障,也仅适用于只有up/down二元状态的系统。 粒度粗。顾名思义,这批指标都是Mean/Average/平均值,可衡量宏观但不适用于描述某次具体故障。
定义: 事先给产品设定可用率目标,如系统宕机时间一个月不得大于50分钟、用户下单每天失败次数不得大于1000次,这里的“50分钟”、“1000次”就是给团队的“预算”(最常用的量化维度是时间)。每次发生故障则相应扣除,通常用燃尽图展示,简称EB。 优点: 直观,易操作,多用作考察手段。 缺点: 粒度粗。无法描述每次具体故障及其影响。
定义: 第一步:为产品设定可用率目标(使用百分比),即Service Level Agreement(SLA),常见如一个月不低于99.99%(俗称“4个9”)表示一个月故障时长不得大于4.3分钟,这“4.3分钟”便视为给团队的“错误预算”(ErrorBudget,简称EB); 第二步:为产品选择最合适的几个黄金指标,即Service Level Indicator(SLI),最典型是Google SRE团队推荐的4大黄金指标,分别是Latency(请求延迟)、Traffic(流量)、Errors(请求错误率)、Saturation(资源利用率)。此外,还有很多指标,如Accuracy(数据准确性)、Coverage(覆盖率)、等等,详见下表。SLI并非选得越多越多,以网易严选为例,因为这是一个典型的在线电商产品,我们只挑选了最适合HTTP WEB类产品的两个指标Latency和Error去进行严选的SLA/SLO实践; 第三步:为每个黄金指标设置阈值,即Service Level Object(SLO),常见如下单请求Latency 99线不高于500毫秒(ResponseTime_99th≤500)、支付请求错误率不大于万分之一(5xx_Ratio<1‱)。 第四步:持续监控这些目标是否真的达成,不能达成则自动扣除错误预算,直至耗光预算甚至跌至低于SLA承诺值,则将触发用户赔偿。因为SLA是一种有法律效应的商业承诺,一旦不能达成将按协议作相应赔偿,如提供消费抵价券、延长服务时长等,在各大云厂商官网都可以找到SLA承诺及赔偿方案,如亚马逊AWS SLA、阿里云ECS SLA、阿里云短信服务SLA、网易云信SLA等; 优点: 业界通行。尤其SLA,这是厂家和用户都认可的共同语言。 强烈的指导意义。SLA有绝对的考察意义,团队无法达成则将触发惩罚性措施(如对外用户赔偿、对内绩效扣分等),而EB燃尽速度也常用于控制新版本的发布变更频率、故障演练次数。 缺点: 不易操作。整套方法论不复杂,但是概念多,易踩的坑也多。挑选哪些sli,slo阈值设置多少,sla定什么周期几个9,都需评审,需联合多团队(负责人+研发+测试+运维±法务),并需要大量素材。 研发成本。与CMDB概念一样,业界没有绝对标准的落地方案,每家企业都有自己一套CMDB,实施SLA/SLO/SLI也都是“本土化”建设,研发成本有大有小,质量参差不齐。黑猫白猫能抓老鼠就行。 维护成本。不能一劳永逸,需定期展开复盘和评审,讨论SLI是否增补、SLO阈值是否修改、SLO是否需要增加规则去覆盖产品即将上线的新功能、SLA目标是否上调、以及上个月EB为什么消耗这么快等议题。
定义: 统计产品正常工作或者宕机的状态(Up/Down),以及时间长度(Uptime/Downtime),并面向用户公开,通知渠道可以有多种,常见如邮件推送、RSS订阅、管理后台展示、官网展示等。 优点: 用户友好,直观。 缺点: 信息有限,量化不足。只知道一个产品挂了,不知道成功率是跌到99%还是80%,是全部接口都挂了还是只挂了写操作的接口而读操作接口正常。
无法反映故障的严重程度。同样是挂10分钟,这10分钟内系统功能是100%全挂还是只挂了10%; 无法反映用户的影响程度。同样是挂10分钟,夜间10分钟和白天高峰期的10分钟所造成的用户影响肯定不同; 指导性弱。仅凭“挂了10分钟”是看不出哪里挂了; 依赖人为判断。对于一个大型分布式系统而言,定义纯粹的二元状态up/down是困难的,毕竟通常只挂了某个产品功能(某个微服务)而不会全挂。只影响商品评论但不影响下单支付算不算故障?影响1000个用户才算故障还是只影响1个用户就算?只影响广东用户但不影响吉林用户算不算?上文提到的“下单请求Latency 99线不高于500毫秒(ResponseTime_99th≤500)”这条SLO规则的阈值为什么是500毫秒,而不是502毫秒?
数字对用户意义没那么大。一个产品的请求成功率为99%(感觉很高了),但这个产品在一天24小时里每一分钟都要挂一挂,一个运气很差的用户在0点到23点之间每个小时打开产品总会遇到一两次报错弹窗,对这个用户的体感来说,这个产品是挂了一整天。 数字会被高频用户意外放大。高频用户发出的请求数量可能是普通用户的1000倍,他们对分母和分子的贡献非常大,很容易淹没普通用户的贡献,汇总后的产品成功率有80%但可能高频用户全部100%成功了,而低频用户只有40%。 数字会受客户端行为影响而放大/缩小。两个极端场景,一个是用户看到页面报错弹窗后选择不断刷新页面或者点击按钮,这些重试行为会产生大量请求,而且全都是失败请求(此时系统还处于故障状态尚未得到修复),进而意外地拉低成功率。另一个极端是用户看到页面报错后干脆关闭离开,系统只剩下巡检系统每1分钟发来的一条探活请求,失败请求数量变少,进而意外拉高成功率。
巡检系统,均匀地发送探针请求,每分钟1次。success-ratio=67%, user-uptime=67%,二者相同。
某个大活人user0,不均匀地随机发送请求,有疏有密。success-ratio=68%, user-uptime=65%,二者不同。
真实世界 系统在第30分钟~50分钟之间发生了数据库故障,影响到商品查询服务和下单支付服务,但不影响小游戏、商品评论等其它功能。让我们看看同一个故障是如何对不同用户造成不同影响的: user0喜欢隔一会就刷新检查某款商品是否已补货,前面几次都顺利但突然报错,再重试3次还是失败,气跑了今天不再来了; user1今天首次打开网站就撞见这次故障,他一直报错并频繁刷新连续报错53次,皇天不负有心人第54次之后功能就正常了; user2与user0很像,本来开心地刷着商品列表但突然报错,重试5次后终于恢复正常,不再报错,还成功下单支付了; user3是个另类的用户,他打开网站不是来买东西而是玩一款内置小游戏,小游戏功能今天一切正常没有失败;
在一次成功(或失败)的请求之后,我们就假定系统会一直保持正常(或故障),直到下一次请求来到并看到相反的结果。从一次成功请求到一次失败请求之间的时间长度视为uptime,一次失败请求到一次成功请求之间的时间长度视为downtime; 在一次成功(或失败)的请求之前,我们假定系统是一直保持成功(或故障),直到收到一次真实请求。一次成功请求之前的时间长度视为uptime,一次失败请求之前的时间长度视为downtime; 把两次结果相反的相邻请求(一次成功一次失败)之间的时间长度取中间值,一半视为uptime,另一半视为downtime;
两个指标显示出Mean可用率分别是75.8%和74.2%,都在期望的75%左右,没有问题。 前者的Stdev标准差是0.078,后者只有0.049,右侧的柱状图分布更为“紧凑”。成功率会收到用户重试行为(故障期间重试必定失败)的影响而出现不少次实验的可用率下降在60%左右,导致左侧柱状图显得更“松散”,不能有效集中在0.75绿线旁边。
新概念1:Windowed user-uptime。
新概念2:Minimal Cumulative Ratio(MCR)
第一步,计算“1分钟”窗口的WUU。首先,以“1分钟”为粒度去平均切割过去3天,一共得到24×60×3=4320个片段。接着,计算片段1(3天前00:00:00至00:01:00期间)的user-uptime比率,即00:00:00至00:01:00期间的uptime除以totaltime,假设结果是99.4%(这1分钟里系统发生了一次时间极短的小故障)。然后计算片段2(3天前00:01:00至00:02:00期间)的user-upitme比率,假设结果是100%(这1分钟里系统没发生任何问题,用户请求全部成功)。以此类推,计算出片段3、片段4、直至片段4320的结果。最后,从4320个结果(4320个百分比)中找出最小值,假设是92%(在2天前10:20:00至10:21:00期间系统发生了一次严重故障,影响了大量用户请求,导致这个窗口片段的user-uptime比率只剩下92%),这个92%便是“1分钟”窗口的WUU。 第二步,计算第二个窗口“5分钟”的WUU。过程相同,先以“5分钟”为粒度去平均切割过去3天,一共得到(24×60×3)÷5=864个片段。接着,计算出片段1(3天前00:00:00至00:05:00期间)的user-uptime比率,以及片段2、片段3、直至片段864的结果。最后,从864个结果中找出最小值,假设是94.3%,这个94.3%便是“5分钟”窗口的WUU。 第三步,以此类推去计算“15分钟”、“1小时”、“6小时”、“1天”这四个窗口的WUU,假设结果分别是96%、97.2%、99.2%和99.96%。 最后一步,绘制MCR曲线图。X轴为六个离散的时间窗口,Y轴为WUU。将6个WUU点(92%、94.3%、96%、97.2%、99.2%和99.96%)按顺序打上去并连成线。这条曲线即系统的MCR。
整个季度的整体可用性达到99.991%(最右侧末段的点); 1分钟最差的可用性是92%(最左侧开端的点),没有比92%表现更差的分钟了; 拖垮系统可用性跌至92%的那次故障一共持续了约2个小时(曲线第一个拐点,它位于在1hour~4hours的中间位置),在半天以及更大时间尺度来看,系统可用性都维持在99%以上而不再出现大型故障(曲线在第一个拐点之后突然变陡,曲线斜率变大并迅猛地爬升);
数据1:当描述系统整体可用性
数据2:当描述超高频用户与常规用户
99%是常规用户,一段时间请求不多于100次。贡献了请求总量的38%。 1%是超高频用户,请求频率是普通用户的1000倍。贡献了请求总量的62%。
数据3:从MCR累积角度看
《Meaningful Availability》:https://www.usenix.org/system/files/nsdi20spring_hauer_prepub.pdf GC MMU理论:https://www.cs.cmu.edu/~guyb/papers/gc2001.pdf 四大黄金指标:https://sre.google/sre-book/monitoring-distributed-systems/#xref_monitoring_golden-signals 亚马逊AWS SLA:https://aws.amazon.com/cn/compute/sla/ 阿里云ECS SLA:http://terms.aliyun.com/legal-agreement/terms/suit_bu1_ali_cloud/suit_bu1_ali_cloud201909241949_62160.html?spm=a2c4g.11186623.0.0.7ec063ddvdkqFB 阿里云短信服务SLA:https://terms.aliyun.com/legal-agreement/terms/suit_bu1_ali_cloud/suit_bu1_ali_cloud201803091117_75307.html?spm=a2c4g.11186623.0.0.3805697bkFI1qb 网易云信SLA:https://yunxin.163.com/clauses?serviceType=1
本文由作者授权严选技术团队发布