技术开发 频道

灾难总是近在咫尺 复杂系统故障面面观

        【IT168 技术】去年6月29日,Amazon EC2美国东部1号区域的一个availability zone遭大规模雷暴袭击而断电,该事故殃及了包括Netflix、Instagram、Pinterest在内的一大批服务,详情参见Amazon针对此次事故的官方报告。几天后,偶然在Channel 9上看到一篇文章,进而顺藤摸瓜找到了Richard Cook的这篇发表于1998年的How Complex Systems Fail。这篇文章总结了十八条关于复杂系统故障的经验,言简意赅却一针见血,读之让人击节叫好,大有拨云见日之感。

  回顾Amazon针对这次事故的官方报告,以及自己在过去若干年间遇到的种种线上事故,几乎无不落入这十八条之内。这篇文章并没有将视线局限在技术领域,而是从系统、从业人员、事故评估等一系列角度全方位地探讨了复杂系统故障的性质,点破了复杂系统中的一系列“潜规则”。有意思的是,本文讨论的本是医疗IT系统,得出的结论却同样适用于大规模互联网基础服务,真可谓大道归一。在今年的Velocity大会上,Richard Cook就同一主题发表了演讲,同样值得推荐。

  需要指出的是,这篇文章没有任何量化分析,也没有提供任何实际案例,这种情况下文中的观点很容易引发争议。所谓经验,无非就是以非形式化的语言对过去遇到过的问题进行建模。对于采纳相关经验的人来说,如果当前面对的问题与该经验背后的模型相契合,那么经验就生效;反之,该经验便无效。若这十八条能够给读者带来启示,那最好不过;反之,若认为文中观点有偏颇之处,也请先结合具体场景再加以讨论。

  独乐乐不如众乐乐,特将此文译出,以飨读者。这篇文章字数不多,译起来却颇费功夫。如果有错译之处,还请在评论中不吝赐教。

  复杂系统本质上都是高风险系统

  各种备受瞩目的复杂系统(如交通系统、医疗系统、电力系统等)都是高风险系统,这是它们固有的内在属性。尽管风险事故的爆发频度时有高低,导致系统固有高风险性的内因却无从化解。这些风险又催生了各式各样的风险防范措施,进而塑造了形形色色的复杂系统。

  复杂系统都对故障严加防范并且行之有效

  故障造成的高昂代价促使人们逐渐构筑起重重防范措施来抵御故障。其中既包括必要的技术措施(如后备系统、设备的各种“安全”功能等)和人力措施(如培训、经验传承等),也包括多种机构性措施、制度性措施和监管性措施(如政策流程、资格认证、工作守则、团队培训等)。这些手段构成了一系列防护,令日常运维得以远离意外事故。

  灾难性事故是由多起故障共同造成的——单点故障不足以兴风作浪

  多重防范的确行之有效,一般情况下足以保障系统正常运转。重大灾难性事故往往是由多起无足轻重的轻微故障共同导致的系统性的意外事故。这些轻微故障中的每一起都是事故的诱因,但只有当它们叠加在一起时,才会酿成事故。换言之,故障的发生概率比重大系统事故的发生概率要高得多。系统内预设的安全组件可以排除大部分故障。渗入到业务层面的故障绝大部分也会被排除,这一层面的故障通常需要从业人员人工处理。

  复杂系统中潜伏着变化多端的故障组合

  由于复杂性过高,这些系统在运转时总是伴随着多种缺陷。然而这些缺陷在系统运转过程中显得无足轻重,因为其中的任何一种缺陷都不足以单方面导致故障。要彻底清除潜在故障,经济成本往往太过高昂。此外,除非真的发生事故,否则我们也很难看出这些故障如何会诱发事故。不断演变的技术和工作机构,再加上人们为了排除故障而付出的种种努力,使得故障也不断地发生变化。

  复杂系统运转时总是处于降级模式

  由上一条可知,运转中的复杂系统总是残缺不全。之所以还能运转,是因为系统内备有充足的冗余部件,即便存在诸多缺陷,人们仍然有办法让它工作。从以往的事故评估结果来看,事发之前系统几乎都出现过险些酿成灾难的“准事故(proto-accident)”。有观点认为,通常情况下,简单的系统性能监控手段便足以发现这些系统降级情况,它们本该在重大事故发生之前就得到应有的重视。系统的运作过程是动态的,各种(机构、人员、技术)部件会不断发生故障进而被更替。

  灾难总是近在咫尺

  复杂系统都有可能引发灾难性故障。在从业人员的身边,各种潜在故障每时每刻如影随行——灾难随时随地都有可能发生。所有复杂系统都有可能导致灾难性的后果,这是它们的标志性特征之一。人们不可能完全杜绝这类灾难性故障;这是由系统自身的性质决定的。

  在事发之后将事故归咎于某一“罪魁祸首”的做法是完全不可取的

  重大故障都是由多重失误共同造成的,因此事故背后的“肇因”不可能是孤立的。导致事故的因素多种多样,但其中任何一种都不足以单方面造成事故。只有当这些因素叠加在一起时事故才会发生。实际上,滋生事故的温床正是由这些因素环环相扣共同形成的。因此,事故背后根本就不存在孤立的“罪魁祸首”。这种将事故归咎于某一“罪魁祸首”的做法无法反映故障的技术本质;之所以抓住某一局部力量或事件不放并加以责难,无非为了迎合社会和文化诉求罢了。

  事后成见会扭曲事故评定人员的认知

  在已知事故后果的情况下,人们会产生一种错觉,倾向于认为当事人理应更早注意到酿成事故的种种事件。这意味着人们无法客观地分析事故经过。已然了解事故后果的事故分析人员往往会先入为主,难以站在当事人的角度忠实地还原事故经过。当事人似乎“理应注意到”这些因素“必将”导致事故。事后成见一直是事故调查中的主要障碍,在有专家参与时尤甚。

  操作人员分饰二角:他们既是故障的始作俑者,也是故障的防范者。

0
相关文章