Linux界现在好像处在疯狂地热衷于集群概念之中。几乎就在几个月之前,唯一的解决方案还只能是自己编写集群软件以达到较高的实用性。当然在科学集群方面,还可以使用Beowulf或者传送消息的集群库(例如 PVM)。但除了早先的这些解决方案,Linux在专有和商业集群的方面上是大大落后的。
但现在的发展看起来令人欣慰了很多。SGI的Failsafe已基本移植;Linux High Availability(高效性Linux)计划已经启动;Red Hat 推出了Piranha集群软件;等等。
同时还出现了一些可行的科学集群解决方案,其中最值得推荐的是Mosix。Mosix使用的是单一系统图形(SSI)集群器。SSI集群器之所以受到欢迎是因为它们给用户的感觉像是在一台巨型计算机上工作,而不是一群单个的节点。用户可以登录到Mosix集群器上的任何一个节点,并启动集群器中任何节点上运行的程序,只要内核中的集群软件认为这些程序是可以运行的。如果用户运行的DNS是正确的,他们只需telnet到cluster.mynet.com,DNS的循环功能会让他们随机地登录到某个节点及其分支程序上,然后再分支,分支。
装配Mosix集群器
有些Mosix集群器可以达到世界上前50种性能最强的的超级计算机的水平。如果有足够多闲置的计算机设备的话,就可以考虑自己动手组装一个Mosix集群器。
例如,在如下硬件上安装Mosix内核:
3台双CPU计算机,主频从500MHz到933MHz,内存总和为1.5GB左右。
8台单CPU计算机,主频从MMX266MHz到933MHz,内存总和为1.8GB。
而存储空间,用了Network Appliance F720,约有120GB的磁盘空间,并使文件系统对所有计算机为可读。非常重要的一点是,所有机器都必须有统一的用户ID和群组ID,否则访问数据时就可能会出现问题。
这些机器通过100/1000Mbit的网络连接起来,中心安置一个光学转换器。
在这个设计中采用的是用 Network Appliance 存储服务器来实现中心存储的方案,所有集群器节点都围绕其中。有些节点用的是1000Mbit 的网卡,有些用的是较旧的100Mbit。Mosix 会测得每个节点之间的等待时间,并在某个节点上负载过高决定将它的程序转移到其他节点时考虑这个因素。这里使用的网卡是Phobos公司的产品,转换器用的是Nbase公司的。
从上述网站下载两个RPM,并用“rpm -install xxx.rpm”命令进行安装。其中一个RPM是给2.2.16内核的,其中带有所有编译好的 Mosix扩展。另一个则是为监测集群器所用的一套Mosix用户空间命令而备的。
重新启动各节点进入Mosix内核,此时,工作就已接近尾声了,最后要做的就只是让每个节点知道其他节点的位置。要做到这点,编辑一个映射文件/etc/mosix.map,在文件中指定所有其他的节点和它们的IP地址,这与/etc/hosts文件相似。
检测一下是否所有节点都能互相看到彼此,运行“mon”监测程序。它将显示所有工作节点的图表和各自的负载水平、内存消耗,及其他信息。
<img src="http://linux.chinabyte.com/image/010613mon.jpg">
mon监测程序的运行界面
启动集群器
现在就实践一下吧,可以试着创建一个进程,如distributed.net所说的dnetc RC5破程序。然后再加几个其他的进程。此时看一下“mon”程序会发现你的计算机的负载很高,而其他则仍很低。但很快,你节点上的负载量会逐渐降低,而其他节点则相应上升,因为你机子上的一些进程被转移到了其他更佳的节点上了。Mosix会自动调节转移的时间和节点位置,而无需用户对此进行控制。
为了对这个新集群器的强大性能有个具体的概念,笔者在集群器之外的Linux上写了一组脚本,在某个节点上启动程序并测定该集群器的运行情况。这些程序由质数运算器、互动式空程序,及共享的内存使用进程组成。
当节点在集群器(双CPU PIII 933-MHz,768MB RAM)之外时,该机器最高达到20个质数运算器、40个互动式任务,以及大约30个共享内存进程。运行了这些程序后,几乎连登录都不能运行,再也不能添加额外的负载了。
而在集群器中的情况就大为不同了,在最大的节点上可以运行450个以上的质数运算器、数百个shell和大约210个共享内存任务(内存参考模式规定,共享内存程序不能转移到其他节点。)
如果在单个的计算机上要完成这些任务,不知道需要多高的配置,但至少不会低于Sun E6000或HP V2000大型机的水平,它们的价格达十万美元之巨。而现在所有这些硬件只需要不到2万美元,是Linux使我们做到了这一点。
网络文件系统
在多个节点上创建单一图形集群器只有在程序被转移到另外节点时仍能看到其设备和文件时才是有意义的。Mosix无需中央存储器就能做到这一点,具体情况如何呢?
当一个进程转移到集群器中的另一个节点时,它的代码存根仍保留在原来的节点上。每当需要输入/输出时,该进程会将请求发送到最初节点的代码存根上,而后代码存根在本地进行输入/输出处理并返回结果。
当然,这会加大输入/输出密集的程序的负担。为减少这种网络活动,提高整个输入/输出的效率,Mosix开发人员开始将
全局文件系统(Global File System,GFS)移植到Mosix集群器中。
全局文件系统是Linux的共享盘集群器文件系统。GFS支持客户机故障时的日志和恢复。GFS集群器节点通过Fibre Channel或共享的SCSI 设备物理共享共同的存储器。看起来,文件系统在每个节点上都像是本地机上的,GFS使文件访问在集群器中保持同步。GFS是完全对称的,也就是说,所有节点都是均等的,没有哪个服务器会是瓶颈或出现任何故障。GFS在维护所有Unix文件系统时使用读/写缓冲。
但是,GFS也存在着一个缺点,它只能运行在较新的SCSI控制器上,而不能在以前的产品上运行。不过对于装备了新设备并且确实有集群必要的用户来说,GFS是非常好的解决方案。
Mosix GFS执行的时间还不长,但性能确实很好。想想家里要是有这么个功能强大的巨型机该是多么好的感觉。那么,如果你有好几台装了Linux的闲置机器,又想搞个大型机玩玩的话,就试试Mosix吧。
欲对Mosix有一个全面的了解,请访问网站:http://www.mosix.org/。