简谈多程序架构和服务器群之二, 兼与懒网讨论
我们把前文问题简化为一个软件在更新后重新起动的时候,需要其作用不被间断, 这样的问题我们在上文中指出在很多时候都有实际需求。 懒网提出用双子星架构来解决这个问题。 采用过程是:A -> A' with alias B, B kills A, B deletes A, B copies itself to B', B' renames alias B to A'。 我们把一个已经启动的程序叫作它的 image 。就是它的机器码已经加载在一定的已经 allocated 好的 memory 内并在执行。 它的原码改动之后,可以再编译成一个新的可执行文件,假设还是叫 XX。EXE。 你可以再起动它,这样就有两个同名, 但内容不同, 彼此独立的 images 在跑。 但是,如果这两个images 都要占用机器的某些不可以共享的资源,或者是机器容量不足以容纳这两个images同时在跑,那么显然是有问题的。其他问题根据具体软件其实还有,不过这里先放过. 如果我们先把旧的image 杀掉,再让新的 image 起来。就没有资源和容量的问题,它们可以共享一个独立运行的数据库没有问题。但是,对于有 real time 数据进来的程序,这就至少会失去在等待新程序起来的时间内进来的数据。 传统上解决这个问题的方法是再用一个控制软件来控制这样的程序,不管两个程序是否同名。这个控制程序我们叫它 Director。Director只是一个小程序,它一般做成象计算机的一个 built in 的服务。它永远是在运行的。 它管理这些程序的启动和下去。并接受新image 上来之前的数据。以传给新的image, 这样就至少不会失去数据,即使可能处理不及时。 我说过,在做自动化控制的时候,软件不但要同时控制多个程序,还要控制多个在协作运行的机器。 这些机器和自带的控制程序还来自不同的厂家. 任何一个程序都可能当掉,下面我们看到连专业服务器群都可能当掉,所以任何架构都不是保险的。我们的一个底线就是要晶圆不掉下来和不碎。我们的设备是提供给英特耳的,那里正在处理中的一个晶圆可能价值很多万刀,我们有句话说,如果晶圆掉下来,那意味着我们的饭碗也掉下来。许多问题,在实际运行中才能发现,不是如同想象的那么好做。 这样的架构和概念发展成服务器群。一个目的是这些服务器可以同时运行做一样的工作。这样来支持多用户。另一个目的就是在某一个服务器,特别是某些专门的服务器需要重新启动或者是当掉的时候,对外的服务不被中断。有一个专门的服务器来管理整个服务器群,就是我们提到的 Director. 基本上,所有重要的服务都用服务器群,以免服务不被中断。
就在几年以前,我们曾用过专业的服务器群来提供网络电话的开发和测试,理论上不会失去数据,但在服务器转换的时候依然会失去real time 数据,我们的程序都没有看见数据进来。但处于同一个实验室的测试用户确实打了电话。我们都无法找到数据在那里丢失的. 我们甚至经常可以看到一些著名IT公司的服务都会断掉,就是说整个服务器群都当掉了。
为什么任何软件和机器都会出问题呢, 那就涉及到更深层的原因了。因为当前我们常见的民用计算机如PC,服务器。和程序语言如 C,C++, C#,Java 还有相应的编译器,等等,它们在设计上都是容许出错 runtime error 的。墨非定律。如果它可能出错,那么它一定出错。 不管你怎么改都没有用的。那么有没有从设计开始就不容许出错的语言,编译器和计算机呢,当然有的。不过就不在本文范围之内了。
注: 本文全凭记忆和个人经验。 如有错误,欢迎指正。 |