作者:迈克尔·尼加德(MichaelNygard)
硬件会出错,于是我们增加冗余资源来增加系统的可靠性。这样做虽然可以避免由于单点故障引起的系统错误,但同时也增加了至少一台设备出错的概率。
软件会出错,由软件构成的应用程序自然也会出错,于是我们增加额外的监控程序,好在应用失效时报警,但是监控程序也是软件,一样会出错。
人无完人,我们也会犯错,所以我们把操作、诊断和处理都变成自动化。可是自动化虽然降低了主动犯错的概率,却增加了系统被忽略的概率。何况任何自动化系统应付环境变化的能力都比不上人类。
于是我们又为自动化增加监控,结果是更多的软件,导致更高的故障率。
计算机网络由硬件、软件和长距离的线路构成,当然也会出错。实际上,即便网络工作正常,由于状态空间的无限性,网络的行为也是不可预测的。独立部件的行为可以确定,但是所有部件组合起来,就会无法避免地出现混沌现象。
所以用来避免故障的安全机制都会带来新形式的故障。集群软件可以把应用程序从故障服务器转移到正常的服务器,但如果集群网络功能失常,又会出现“网络分区综合症(split-brain-syndrome)”(译注1)。
别忘了三哩岛核电站泄漏事故(Three Mile Island accident)(译注2)是由于减圧阀引起的,而减压阀本身是用来避免过压故障的安全机制。
既然系统必然会出错,我们该怎么办呢?
应当承认系统中必然存存在着不同形式的故障陷患,无论如何无法彻底消灭。如果你不否认这个事实,管理故障和限制故障就无从谈想。只有承认这一点,才能针对特定的故障设计决策,正如汽车工程师知道交通事故无法避免,所以设计缓冲区(crumple zones)来保护乘客一样,你也可以设计预护措施来限制故障,保护系统其余部分。
如果不事先设计好防范故障的模型,就无法应对威胁系统安全的意外情况。
译注1:split-brain-syndrome愿意是裂脑综合症,指两个脑半球的感觉及运动功能的连接被切断,以致患者丧失日常生活自理能力的病症。这里用来比喻网络分区之间正常通信失效的情况。
译注2:Three Mile Island accident指1979年发生在美国宾夕法尼亚州三哩岛的核电站泄漏事故。事故最初由二号反应堆的辅助回路泠凝水泵故障引起,导致二号反应堆内温度和压上升,触发堆内的减压阀开启。卸压后,由于减压阀故障,阀门未能按预期自动关闭,进一步导致冷却水大量溢出,堆心温度上升。待工作人员发现问题所在的时候,47%的堆心燃料己经融毁并发生泄漏,幸好有防护外壳阻挡,未造成人员死亡,但经济损失超过10亿美元。