在谈网站运营之前,先发一篇旧文。今天有同学问为什么数据要和服务器放在不同的机器上,重发和做些说明。不但数据库服务器或程序会当掉,或叫崩溃。有时候操作系统也会当掉。当然在上面运行的任何程序都当掉了,如果要起用备份服务器,它从那里拿数据?放数据硬盘的专用机器,中文叫数据柜,里面插一排排的专用数据硬盘。就是我前面说的一块一块的,我以为大家都知道,就没有细说。架构非常简单可靠,是不会当掉的,所有服务器共享,
个人接触服务器群技术,从BEA weblogic 开始,当时数据中心的概念刚刚起来。今天,数据和处理分开,已经是IT的一个基本概念。BEA 代表他们三个创建人,A是一个老中, 专做技术 ,当时的硅谷的数据英雄,还没有老印什么事情。今天,老中还能称雄的,只剩下与物理有关的一些IT领域了。 个人接触IT中文,要归功于IBM中国。IBM中国提供很多IT文件的的中文版本,曾经帮一个本土公司与IBM竞争一个省级城市的信息化项目,与IBM的高级工程师在市里有关的技术人员和官员面前大战一场,很有意思,
简谈多程序架构和服务器群之二, 兼与懒网讨论
我们把前文问题简化为一个软件在更新后重新起动的时候,需要其作用不被间断, 这样的问题我们在上文中指出在很多时候都有实际需求。 懒网提出用双子星架构来解决这个问题。 采用过程是: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 的。墨非定律。如果它可能出错,那么它一定出错。 不管你怎么改都没有用的。那么有没有从设计开始就不容许出错的语言,编译器和计算机呢,当然有的。不过就不在本文范围之内了。
注: 本文全凭记忆和个人经验。 如有错误,欢迎指正。
|