接上一篇《工程事故与现实世界》,继续分享一些现实中的工程事故,以及其中带来的启示。
关键报警
1979 年 3 月,美国宾夕法尼亚州三里岛核电站发生泄漏,20 英里范围内的居民全部撤离,从此以后美国放弃了核电站建设。
事故发生时,反应堆容器发生压力积聚,在这种情况下,正常的应对方案是打开一个安全阀门,降低压力到安全水平。这个安全阀门的设计是通过加电压到电磁制动器上使其打开,打开后会有一个监控指示灯亮起,降压后重新关上阀门,指示灯就会熄灭。
操作人员在压力聚集后按正常处理流程进行了阀门打开降压操作,压力下来后,操作人员移除电压,阀门应该关闭,但实际上阀门被卡在了打开位置,而此时的监控指示灯却熄灭了,操作人员误以为阀门已正常关闭,实际却并没有关上。
之后,反应堆容器中的冷却剂一直泄漏了近 2 小时,直到反应堆顶部从冷却液中暴露出来,燃料棒和芯块开始融毁,在随后的仓皇失措中,轮班人员一直相信控制面板上的指示灯,认为人工减压阀处于正常的关闭状态。
就是这样一个小小的报警指示灯故障,导致了这次核事故。对于像核反应堆阀门这样的关键系统部件,其工作状态需要更准确的监控报警,甚至多重监控报警进行交叉验证。比如:除了电路传感的指示灯报警,还应该有更直接的开闭位置传感报警。
三里岛核事故带来的启示是:对于系统中的核心关键节点,需要绝对直接而且准确的监控报警,报警本身就需要高可用,而且还能多重交叉验证。
忽略变化
20 世纪 50 年代,英国哈维兰公司开发出了第一个商用喷气式飞机,但后来该机型在同一年连续两次出现坠毁。
后经事故调查研究找到了原因:喷气式飞机因为比其他机型飞行高度更高,在飞机起飞和着陆时为使乘客不至于感到不适,不可避免要进行机内空气加压和减压循环;而在喷气式飞机出现之前的机型因为飞行高度低,不需要做加压和减压循环处理;当时的飞机设计人员没人想到这会有什么影响。
但反复的空气加压和减压循环,导致飞机顶部天窗用以发射无线电的铆钉处金属疲劳,产生应力老化裂纹,多次加减压循环后,裂纹扩大变成了裂缝,最终在某次飞行过程中导致了空中解体。在飞机实验室的压力测试环境下并没有真实的模仿实际的加压和减压周期,工程师对自己设计的可靠性陷入了一种错误的认识之中。
更可怕的是,在第一次坠机事故后,并没有找到这个真正的原因,以为是一次意外偶然事件。在该机型停飞了两个月后,由英国首相丘吉尔和该公司总裁联合做出保证不会再出事,数周后该公司的另一架由罗马飞往开罗的班机又坠毁于地中海后,工程师们才找到真正的原因。
在我们做系统时,有一些变化发生了,可能只是我们没有注意到;还有一些变化可能并不常发生,它只在特定的异常下发生。互联网应用的很多在线系统,大部分时候流量压力是逐步积累的,但在特定的情形下也可能会发生剧烈的变化。同样一个量级的流量,是逐步达到的,还是突然剧烈产生的,对系统带来的压力并不一样。
比如,在做 IM 系统时,有一种场景是如果出现集中网络闪断,那么所有 IM 客户端的长连接都会一起断开,并集中重连。这时负载均衡极有可能会让突发的集中重连流量全部打到后端第一个被轮询到的机器上,单机就会被突发的集中流量击垮。而如果是逐步提升的流量,则会均匀的被均衡到后端所有的分布式服务器上。
设计时,尽力考虑所有可能的使用场景变化,而哈维兰的教训实在太深刻与悲痛了。
蠕变效应
2006 年,波士顿的一个隧道内,有 4 块天花板,每块重 3 吨,突然脱落掉了下来,砸中了行驶中的小车。
那么问题来了,天花板为什么会突然坍塌,而之前却毫无征兆?它们是如何固定的?天花板是由金属支架支撑,支架使用螺栓插入钻孔固定在隧道顶部,而螺栓则使用环氧树脂胶填充螺栓和孔腔之间的间隙。
环氧树脂是一种聚合物,其硬度会随时间和温度的变化而变化,如果突然施加一个负载,环氧树脂能在短时间内很好的保持原来的形状。但如果其持续承受负载(静态负载),聚合物的分子可能会慢慢移动,造成环氧树脂逐渐变形,这个过程就是 “蠕变”。
而隧道中使用的环氧树脂具有很差的抗蠕变性,负责安装的工程师忽略了这个事实,也可能是对此缺乏了解,因此造成了这次事故。
而程序系统中类似 “蠕变效应” 的问题有很多,比如:磁盘日志,缓存空间,内存回收,数据存储,索引周期。所有这些都可能因为足够长时间的系统运行,造成 “蠕变” 积聚,直到撑不住引发事故。
系统中没有所谓的抗 “蠕变” 组件,因此我们需要对这些可能发生 “蠕变” 的地方进行周期性的检查,并及时处理。
...
以上就是我这次双十一前读到的一些关于现实世界更传统的工程事故,以及带给我的启示。泰坦尼克号号称当时世界上最安全的船,在撞上冰山之后,回过头来一看到处都是显而易见的问题。俄国作家费奥多·陀思妥耶夫斯基曾说过一句名言:
当失败时,似乎一切都显得愚蠢。
现实世界的工程事故会显得更残酷,不免感慨工程师真要有敬畏之心,能修复缺陷,解决问题固然不错,但能提前去规避和发现会更好。