一次停机事故的公开事后复盘
生活中的许多事情都有一种被普遍接受的“保守”做法,以及一种被普遍接受、至少按照大众观念应当避免的“冒险”做法。例如在投资领域,我们常常把购买政府债券或市政债券视为低风险,而把投资股票(公司股票)视为高风险——但统计数字却告诉我们,事实恰恰相反:几乎所有人都在债券上亏钱,却在股票上赚钱。所谓的“常识”,一经检验,结果发现纯粹是建立在情绪之上的,而情绪反过来又是基于种种误解,投资中最冒险的事情,正是用情绪来驱动投资策略。
同样地,在企业风险评估中,常见的做法是对危险产生一种情绪反应,而这会触发恐慌反应,使人们极易对感知到的风险反应过度。我们经常在小公司身上看到这种情况:它们的 IT 基础架构带来的收入微乎其微,或者对短期运营而言并非十分关键,却斥巨资去防范一种仅仅是部分被感知到、且表述得极其含糊的风险。这种情况往往变得如此夸张,以至于风险缓解过程常常是凭情绪而非凭理智来处理的,我们也屡屡发现一些公司在实施糟糕的系统设计,这些设计实际上增加了风险而非降低了风险,与此同时还花费了极其庞大的资金,然后,由于风险大多是凭空想象的,便基于一层又一层的误解,将该项目称为成功之作:想象出来的风险、想象出来的风险缓解,以及想象出来的成功。
在不久前,我有机会参与了一家小企业彻头彻尾的灾难。这场灾难几乎触及了“最坏的情况”。虽不完全是,但非常接近。当时对这场灾难的情绪反应十分强烈,而一旦灾难全面爆发,几乎人人都会陈述并反复声称:灾难规划存在缺陷,这个问题本应被避免。在任何灾难情境中,这都是十分常见的,人类总觉得理应有人为此负责,理应存在零风险的情境(只要我们正确地完成本职工作),但这种想法是完全错误的。
所幸我们进行了一次全面的事后复盘——正如在任何真正的灾难之后都应当做的那样——以查明什么出了差错,什么做对了,我们如何能够修正那些失败的流程和决策,以及我们如何能够保留那些曾经保护过我们的流程和决策。通常情况下,当某个重大的系统事件发生时,我并不能公开谈论它。但偶尔,我也能谈一谈。人们太常对一场灾难、对任何一场灾难做出这样的反应,心想“唉,要是我们当初……就好了”。但你必须审视这场灾难。关于流程,关于我们自身,有太多东西值得汲取。
首先,交代一些背景。一台关键服务器运行在一家企业数据中心内,承载着对几家公司都非常重要的若干关键工作负载。它的使用年限略超过四年,多年来一直独立运行。较旧的服务器在临近报废期时总是有点令人担忧。对于一台企业级服务器而言,四年远谈不上报废,但它当然也算不上年轻了。
这是一台单独的服务器,没有任何故障转移机制。备份是通过外部方式处理的,备份到同一数据中心内的一台企业级备份设备上。这是一套非常简单的系统设计。
我不会写出所有的内部细节,因为任何类似的情况在规划和运营上都有诸多错综复杂之处。这些细节最好留待内部的事后复盘流程去处理。
当这台服务器发生故障时,它垮得相当惨烈。故障是如此彻底,以至于我们无法远程对其进行诊断,即便有数据中心现场技术人员的协助也无济于事。就连服务器供应商也无法诊断出这个问题。这使我们陷入了一个艰难的境地——当硬件无法被可靠地修复时,你该如何应对一台报废的服务器。我们可以更换硬盘,可以更换电源,可以更换主板。谁知道究竟什么才是解决之道呢。
最终的决定是,必须将这台服务器以及备份系统迁回总部办公室,在那里可以当面、并动用最大限度的资源对它们进行分诊抢救。最终,该系统得以修复,没有丢失任何数据。之所以做出克制、不动用备份的决定,是因为数据恢复比系统可用性更为重要。
当一切尘埃落定时,这场灾难是在没有发生实际数据丢失的前提下,所能想象到的最为彻底的灾难之一。停机持续了许多天,动用了大量的备用设备、人工工时和各种尝试性的修复手段。整个过程令人精疲力竭,但完成之后,系统成功地得到了恢复。
漫长的停机,以及在进行诊断和尝试修复期间那种混乱无序的感觉,导致了一种整体上的失败感。人们开始这么说,而这又使得人们对此深信不疑。在应急响应的状态下,人们极易变得过度情绪化,尤其是在几乎无觉可睡的情况下。
但是,当我们退后一步、审视最终结果时,我们的发现令几乎所有人都感到意外:分诊抢救行动以及最初的风险规划都是成功的。
分诊抢救过程中所发生的混乱,往往会让事情显得比实际情况糟糕得多。但我们的分诊抢救处置堪称一流。分诊抢救并不意味着变魔术,它有一个发现阶段和一个反应阶段。当我们分析事件的先后顺序并将其在时间线上铺陈开来时,我们发现自己处置得如此出色,以至于几乎找不到任何可以缩短时间跨度的余地。我们做了恰当的诊断,在恰当的时机调动了恰当的各方,尽快让所需部件进入物流运转,而那些看似手忙脚乱、白白浪费掉的时间,大部分其实是“填充时间”——在这段时间里,当我们正在等待修复所需的部件时,我们一直在设法确定是否还存在其他选项,或者是否犯过什么错误。这让事情显得比实际情况糟糕得多,但所有这一切都是当时本应采取的一系列正确行动。
从分诊抢救和恢复的角度来看,尽管这次停机最终持续了许多天,但整个过程进行得天衣无缝。一旦灾难发生,并且发生到了如此令人难以置信的程度,恢复工作实际上进行得异常顺利。没有什么是绝对完美的,但它进行得极为顺利。这台机器按照预期发挥了作用。
更令人意外的部分,是审视这场灾难所造成的影响。看待这件事有两种方式。一种是更为明智的方式,即“不带事后诸葛亮”的方式。在这种方式下,我们审视这场灾难、灾难所造成的影响成本、缓解成本,并代入这场灾难本会发生的可能性,从而判断当初是否做出了正确的规划决策。这很难计算,因为风险系数始终是一个估算出来的数字,但通常你可以做到足够准确,从而知道你的规划有多么出色。第二种方式是“事后诸葛亮”式的、马后炮的方式——倘若我们早就知道这场灾难将会发生,我们当初会采取什么措施来防范它?显然,把风险系数剔除掉、然后用原始数字来看这场灾难的代价,是完全不公平的,因为我们无法预知会出什么差错,从而只针对那一种可能性去规划,或者为某件我们其实并不知道是否会发生的事情投入无限的资金。各公司常犯的错误,便是采用后一种计算方式,并指责规划者没有完美的先见之明。
就本案例而言,我们相当有信心,从一开始我们就下对了赌注。这套系统已经投入使用近十年,零宕机时间。系统的总体成本一直很低,分诊抢救成本属于中等水平,而该事件本身又极不可能发生。综合考虑风险系数后我们做出了良好的规划,这一点对任何人来说总体上都不足为奇。
令人意外的是,当我们在不考虑风险系数的情况下进行计算时发现,即便我们早就知道该系统会发生故障、并且会出现一次长时间的停机,我们仍然会做出同样的决定!这简直令人震惊。这次长时间停机的成本,实际上低于构建一套切实可行的风险缓解系统所需的设备、托管和人工的成本——在本案例中,那本应意味着在数据中心里部署一台与生产服务器完全冗余的服务器。事实上,通过接受这次长时间停机所节省下来的成本,已经接近一万美元了!
结果证明,这是一个极端的案例:停机情况糟糕得具有毁灭性,难以预测,无法快速修复,然而最终却依然带来了巨大的长期成本节约。但其中的教训意义重大。任何灾难都伴随着如此沉重的情绪包袱,倘若我们不进行恰当的事后复盘分析,不努力将情绪反应从我们的决策中剔除出去,那么即便事情进展顺利,我们也往往会贸然走向大规模的财务损失,或者错误地推卸责任、归咎于人。许多公司面对这场灾难时,本会做出这样的反应:大幅超额支出,以防范同样不太可能发生的事件在未来重演——即便他们眼前就摆着数学计算结果,明明白白地告诉他们:纵使那一事件确实重演,这样做也是在浪费钱!
从这次停机事故中还有其他一些教训可以汲取。我们了解到,哪些环节的沟通本可以更理想,哪些情况下恰当的人选并非总是处在恰当的决策位置上,哪些方面对客户的沟通未能达到应有的水准,客户没有妥善地将变更情况告知我们,等等。但总的来说,这些教训表明:我们做出了正确的规划,我们的分诊抢救行动运作得当,相比那看似“保守”的做法,我们为客户节省了数千美元,并且通过开展一次良好的事后复盘,成功地让他们以及我们自己避免了反应过度、避免在今后把一个好的决定变成一个糟糕的决定。如果没有事后复盘,我们极有可能会误以为我们那些好的流程是糟糕的流程,从而把它们给改掉。
我想要向你,向各位读者传达的关键启示是:事后复盘是任何灾难中至关重要的一环,传统的保守思维往往非常冒险,而对风险的情绪化反应所引发的财务灾难,常常比它们意图防范的技术灾难还要严重。