本文共 6253 字,大约阅读时间需要 20 分钟。
支付宝故障事件引发了大量的关注和讨论。事情基本过程是因为电信运营商光纤被挖断,导致支付宝服务故障,2小时左右后服务恢复正常。本人曾有幸做过一些关于系统可靠性方面的工作,想借此次事件抱着抛砖引玉的态度,班门弄斧地谈一下系统的可靠性和对YunOS可靠性的一些想法。
系统可靠性对于Availability, 经典定义是:
由于上面的经典公式比较泛化,业界除了军事和航天外都没有明确的计算标准,所以计算Availability通常会采用下面的公式: 即服务总时间减去历次服务中断的时间除以服务总时间。
上面公式引入的Outage的 概念,一般翻译为服务中断。按照产生原因可以分为3类, 通常在系统设计中只关注第1类即产品因素导致的outage:
TL9000 标准中定义了2类Outage类型:
其中:
经常会听到有产品介绍自己的可靠性时会说达到了几个9,那么具体是什么概念呢?
平均计算一年的时间,包括闰年有365.25天,即525960分钟 (365.25 * 24 * 60)
从表格中可以看出,5个9对应着一年中的服务downtime 要求 <= 5.26分钟;3个9对应着一年中的服务downtime 要求 <= 525.96分钟,大约为不到9个小时
除了几个9的要求,还有DPM (Defect per million request or task), 即在1百万请求或者操作当中,处理失败的数量,一般DPM 与 几个9的对应关系大致为:
此外,系统运行出现错误要求能够及时探测,并且在规定时间内完成服务切换,如上文中提到的,5个9要求自动切换时间<15秒。这里涉及的内容较多,同时与本人目前从事YunOS工作关联不是特别紧密,就不展开详述了,如:
没有特别关注这个事件的具体细节,只是有个了解,从公开途径得知的大致情况是:
从上文的分析可以得知,这次支付宝服务中断属于由外部因素导致的Partial Outage;好像也没听说之前还出过其他Outage, 就假定没有了;如果本年内不再有其他计划外的Outage,则本年内支付宝服务的Availability 和 Reliability可以达到99.9% - 99.99%, 介于3个9 与 4个9之间,非常接近4个9。 应该处于互联网服务高端位置,但是还没有达到其他有更高要求领域的标准,如电信领域的运营商客户普遍要求5个9,99.999%的可用性。
从中可以看到由于异地多活的容灾策略,让小部分业务可以完成短时切换,完全满足了High Availability 和 Reliability的要求。
但是作者也大胆推测异地多活目前可能还是试用阶段,大部分受影响的其他业务很可能还不支持异地多活。如果支持的是Active-Standby模式,备份服务在服务中断事件发生时是否立即启用自动代替主服务,即备份服务的Failover Recovery策略是否及时生效,同时异地容错(Geo-Redundancy)是否支持, 这些从公开的信息中都没有提及,不过从出现2个小时的Partial Outage的结果来看还是有不少地方可以改进的。
上面提到了异地多活,这里还想在对Geo-Redundancy 和 Fault Tolerance & Disaster Recovery再多说几句。容灾策略可以分为:
具体来讲,比如在系统架构设计时可以分别部署N/2个 Node在两地,即1+1 Active with Geo-Redundancy,让每个地区的Engineered Capacity为系统最大能力的40%,而满足整体业务能力要求可以通过增加系统资源实现。这样在一个地区内所有Node都完全失效的情况下,另一个地区即使完全接管失效节点所有服务,负载也只达到了系统Capacity的80%而没有Overload。此时即实现了N+K 中的1+1。
再例如:系统升级时,在支持N+K的系统中可以同时先关闭并升级最多K个Node, 而对外的服务能力没有任何降低,整个服务也没有downtime, 不需要Scheduled Outage 维护窗口.
下面2张系统架构图是本人曾经参与设计过的2个系统架构的例子,一个是传统模式,另一个是Cloud模式。贴出参考就不做过多分析了。
Legacy Mode: Geo-Diverse Active-Active with N+K
Cloud Mode: Geo-Diverse Active-Active with Auto-Scaling in Amazon AWS
YunOS, 是阿里巴巴集团旗下的一款智能设备操作系统产品,融合了阿里巴巴在云数据存储、云计算服务以及智能设备操作系统等多领域的技术成果,并且可搭载于智能手机、智能机顶盒(DVB/IPTV/OTT)、互联网电视等多种智能终端设备.
YunOS在应用层架构上大致可分为2部分:
云端服务属于典型的互联网服务,对这部分暂时不详细展开了,本文上面介绍的概念和方法都可以适用。想重点讨论的是客户端应用这部分,目的是希望从本文上面的分析中得到有助于提高客户端可靠性的方法或者是测试策略。
目前,终端侧的可靠性测试基本上是采用称为”MTBF测试”的专有测试活动来进行的。
中国移动2015版的MTBF测试的标准是:每轮测试5台终端并行连续循环执行以下用例7X24小时,期间记录系统级问题,包括死机、重启、白屏、脱 网等严重问题。最终计算终端的无故障运行时间
T:T = 5X7X24 /(故障数)
如果终端支持稳定性测试中对应的本地及通信类业务,则要求终端对于支持的业务满足稳定性测试中,在 TD-SCDMA、TD-LTE 网络下平均无故障运行时长指标不低于 250 小时。零售价 2500 元以上不低 于 350 小时。
北美电信运营商AT&T的MTBF指标是这样定义的:7台手机每天24小时不间断运行AT&T规定的测试,测试内容包括2G/3G语音呼叫、短彩信、浏览器上网、电话本操作。测试过程中出现的测试用例失败情况都会记录下来,然后用7台手机总的运行时间除以全部手机出现的测试失败次数,即得到MTBF值。整个测试过程全部采用自动化方式,并且都在AT&T的现网环境下进行,该测试已经成为所有与AT&T合作的终端厂商都必须通过的测试,而且是所有厂商公认的最难通过的测试。
YunOS的MTBF测试是由YunOS系统测试团队执行的,同时制定了更为严格的通过标准。
可以看出,MTBF测试标准的定义与上文介绍的System Availability的概念不是完全一致,因为移动终端毕竟与服务端从架构,实现方法,到用户群体都不尽相同;严格来讲MTBF测试是终端可靠性测试其中的稳定性测试部分。然而有不少地方是两者是相通和可以借鉴的。比如:
这个Topic太大了,不在这里详述了,有一点想要强调的是,任何系统的可靠性,健壮性都不是依靠测试来提高的,测试只能起到结果验证和数据反馈的作用;相反,可靠性是系统架构和设计的关键组成部分。
具体讲就是要在设计阶段对采用的模型,样式,架构等有清晰的需求,同时要详细计算系统中每个组件可能失效的场景和几率,以及由此引发的可能Outage带来的downtime,计算出产品目前距离达到可靠性标准的差距。然后通过合理的技术手段改进设计,改进的部分要作为产品的Feature 写入需求文档,实现后最终通过测试和产品环境上的历史数据来验证。
例如:下面是Downtime Budget图表示例,Downtime Budget是系统可靠性设计过程中的一个环节,通过分配系统各个组件可能的Downtime 比例来找到最需要改进提高的地方。
从整篇文章的分析逻辑中可以看出,系统的可靠性,包括产品的整体质量都不能仅仅依靠测试环节来保证。任何希望通过测试发现问题,修复Bug解决问题来提高产品质量的想法都是不切实际的,因为在产品设计之初,质量就被隐含其中了。
最后,分享一些和质量相关的观点和理念来作为此文的结尾:
关于测试:
关于需求:
关于产品质量:
转载地址:http://nwxil.baihongyu.com/