航天飞机
让我们用一个独立、冗余、能够恢复多级错误的系统示例来结束本章。事实上,它也是第一个将冗余和故障管理思想发挥到极致的大规模软件系统。它让宇航员可以将生命托付给它。
没错,我指的就是美国航天飞机计划。
航天飞机计划有一些重大且严重的机械问题,但是我们不会在这里来讨论它们。我们要说的是航天飞机中的软件系统,以及它如何将冗余和独立的错误恢复发挥到极致。
航天飞机的主计算机系统由5台计算机组成。其中4台计算机中运行的软件和硬件都一样,但是第5台则不同。我们稍后会来讨论这一点。
在执行任务的关键部分(例如,发射和着陆)时,这4台主计算机都会运行一样的程序。这4台计算机中的数据和软件也是一模一样的,因此它们计算出的结果也应该是一样的。所有这4台计算机执行一样的计算,并不断地与其他计算机比较结果。如果,在某一时刻,任意一台计算机计算出了一个不同的结果,这4台计算机会投票选举哪一个结果是正确的。在使用获得选举的结果后,产生错误的计算机会在整个飞行过程中被关闭。航天飞机可以在只有3台计算机的情况下安全飞行,并且可以在只有两台计算机的情况下安全着陆。
这就相当于民主制度的最终形态。胜者统治,败者终结。
但是如果4台计算机无法达成一致呢?这可能出现在多次失败以及多台计算机关机的情况下。或者,由于某个严重的软件问题同一时间影响了4台计算机(毕竟这4台计算机运行着完全一样的软件)。
这时就需要第5台计算机来发挥作用了。通常它都处于空闲状态,但是如果有需要,它可以执行与其他4台计算机一样的计算。关键在于它上面运行的软件。第5台计算机上运行的软件,是由一个完全独立的开发小组开发的简化版本。在理论上,它不会与主软件存在一样的软件错误。
因此,如果4台计算机上的主软件之间不能就结果达成一致,它们会将决定最终结果的权利交给第5台完全独立的计算机。
这就是一个从上层角度隔离可能问题的高冗余、高可用的系统。
在航天飞机运行的30年中,计划从来没有在执行过程中由于软件或者计算机的故障而遇到危及生命的严重问题—即使它是当时空间计划使用的最复杂的软件系统。