【IT168 专稿】计算机技术已经发展了半个多世纪了,在短短的几十年内,发展到了今天我们看到的情况,并依然有加速的趋势。现在我们似乎无法相信,最早期的计算机,只有个把CPU,几个兆的内存,半落软盘,加上内存总线和I/O总线,这些简单的部件承担了大部分计算机所需要完成的全部运算和输入输出功能,再接个ascII字符显示器,就完事了。
记得笔者小学三四年级的时候,学校里还有几十台Apple机。那时候的Apple机,除了CPU和“二乔(桥)”之外,主板上没有任何的单独的功能控制芯片,也没有文件系统和所谓的文件的概念。
到了笔者上中学的时候,486的机器开始流行。这个时期,电脑终于有了专门的显示适配器(SIS系列),有了I/O控制器,而在这以前两者的功能统统由CPU来实现。在屏幕上输出再也不用一句一句写代码了,一个printf()就行了。printf会调用显示适配器驱动程序提供的API,在屏幕上显示图象和字符。而软件方面,也有了盖茨团伙开发出的DOS操作系统,以及美国的大学开发的unix系列。
好不容易熬到了高中。这个时候,我们有了多媒体计算机。这些多媒体计算机都配置了声卡,当然那时候还基本靠CPU来运算发声(也就是我们所说的软声卡),而现在的计算机则大多采用独立的硬件控制芯片来控制声音的输出。很快网卡也有了,更为独立的磁盘控制器也加入了RAID功能。
说了一大堆废话,越说越后悔当初没好好学习。。。。。进入正题,我想说的是:分而治之中的“分”字。
无处不在的“分而治之”
在社会分工越来越精细化的今天,IT行业的硬件制造也似乎也遵循着“分而治之”的规律在细分蔓延。显示输出,音频输入输出,以太网编码解码器,磁盘IO控制器,这些原属于CPU的功能,如今都逐渐独立出来,犹如从CPU伸出的一条条手臂,完成各自专属的功能。
存储独立化趋势则更是“分而治之”的良好体现。磁盘子系统从主机独立出来之后,变得更加专业和独立,能够承担更大容量、更高可用性和更复杂的数据复制和移植功能。
NAS把文件系统从主机分出了一部分,由单独的NAS网络存储服务器来处理,然后呈现给OS,也同样体现了一个“分”字。OSI分了7层,也体现了一个分!RAID技术将数据分块存放在多块磁盘上,正是“分而治之”思想的完美体现。ToE,把TCP/IP协议处理从CPU转移到独立的芯片上,又比如大型机的前置处理机,比如DCP,3270等,这些“分而治之”的思想,体现了什么?是分布式的优势!
再来看HPC中的内容,这里面的“分”的思想就数不胜数了。比如,传统SMP架构,存在总线共享的问题,好,那就分,用crossbar也好,infiniband也好,sci也好,都成了交换架构,解决cache一致性问题,再也不用总线广播了,只需向曾经读取过对应cache块的节点处理机发送失效信号便可,而这是共享总线做作不到的。
软件方面,由于在集群系统中,使用廉价的pc server做节点,在没有SAN后端存储的情况下,基于本地磁盘的IO吞吐量瓶颈很大,远达不到科学计算的要求,怎么办呢?分吧!把数据分别存放在各个节点,把各个节点的direct attached的磁盘存储资源,整合成一个大的共享存储资源,这样齐心合力,提高I/O吞吐量,这就是分布式文件系统的效能,当然作用还不止这些。
这些文件系统一般都支持多节点可以读写同一个文件,利用加锁机制。通过集群网络通信,保持数据的一致性。在用SAN做后端存储的条件下,吞吐量问题是缓解了,但是文件共享问题还是没有解决,虽然可以用NFS之类的NAS解决,但是NAS需要在SAN前端加NAS头,这个是很大的瓶颈所在。所以出现了专门针对SAN的集群文件系统,用来解决共享问题,比如sanery以及其升级版合标准化版SAN文件系统,以及国内的BWFS等。这些SAN 文件系统,即保证了各个主机对SAN有直接访问权,消除了NAS头造成的瓶颈,又保证了不会造成冲突。
针对分布式并行处理集群,开发了通用API,比如MPI等等,让程序可以充分利用分布式资源。
什么促使了分而治之?
一篇清华大学的硕士论文,论述了一种在存储集群环境中,利用独立日志磁盘来同步磁盘数据的技术。虽然仅仅只是分而治之的一个特例,但我们依然可以看看,存储集群的环境中,分而治之是如何发挥作用的。
如我们所知:日志是用来保证文件系统一致性的普遍利用的技术,比如数据库这种必须保证数据一致性的环境,其原理就是IO操作数据先写入日志,当日志写完后即告成功,然后再从日志中将数据异步的后台转移到数据区磁盘空间。
换句话说,日志提供了一个磁盘IO缓冲区,这个缓冲区虽然提高不了IO性能(因为是磁盘IO不是RAMIO),但是他极大的保证了数据一致性,相比用没有掉电保护的RAM来做缓冲区的做法,这种方式更为廉价,但性能很低。有了日志缓冲区,即便突然掉电,日志仍然保存在磁盘上,可以下次通电的时候从日志将数据恢复到数据区。
但是保障了可靠性,就要牺牲性能,由于日志写到磁盘上,造成了IO的瓶颈,虽然前端数据库实例可以并发,但是写日志,仍然是串行写入,而且还必须面对磁盘的IO瓶颈。要提高性能,就要提高成本,比如,不用磁盘而采用nvram来保存日志数据,但显然这样成本太高。
而清华的这个fastsync日志记录系统,其基本原理是这样的:即利用单独的日志记录盘,而不是集成在数据区RAID Group中分出的LUN来记录日志,为什么这么做呢?因为他用了一种特殊的算法,即每个磁道只记录一条到3条日志,而且,通过预测磁头所处的位置的算法,在当前磁头所处的磁道处,不用寻道,就在当前位置进行写操作,当前磁道写一条或者3条日志,然后切换到下一磁道,继续写。
而他参考的前人一篇论文,那篇论文是每个磁道只写一个日志,然后换道,这种一对一的方法,对吞吐量小的IO比较有效,但是对大量快速到来的IO,换道将是一个耗时的操作,所以fastsync做了一些改进,即通过实验,发现每磁道写3条日志,比较适合快速的,大块的IO环境,所以fastsync可以根据IO速度和大小来自动调整写磁道策略。
通过实验,发现这种架构比传统方式快了5倍。而且,对于现在的盘阵系统,如果追求高性能,可以把cache设置为write back,这样同样保证了高I/O速率,而且cache也有电池保护,所以fastsync要想打赢,还有很多工作要做,不过对于追求性价比的用户,fastsync分而治之,将数据库日志记录空间独立出来也不妨是个选择。因为fastsync实现机制涉及到了底层的改变,而且linux没有提供相应的接口来获取磁头当前位置的信息,所以需要重新编译linux内核。
以上只是存储集群领域中独立数据库日志系统的一个特例,我们再来看一下LB集群,将用户的请求,按照一定策略轮询重定向到后端的多台服务器上,实现负载均衡,这也是分的思想。而相关的软件实现方式比如linux下的LVS,硬件产品比如F5,radware,甚至普通的cisco路由器也可以通过NAT来完成简单的轮询。
对于应用层面的用户来说,我们听到众多关于虚拟化、关于存储池的概念,似乎更多地强调了整合的意义。很显然,对于用户来说,后台的精细化和专业化已经不是关注的重点,任何硬件供应商都试图掩盖底层复杂的体系结构,为用户提供清晰简单的界面。而在清晰简单的界面之下,后台的硬件体系,随着功能的日趋完善和复杂,正逐步朝向“分而治之”的方向发展。由通用的变成专属的,由整合的变成独立的,当一些专属功能的硬件部分独立出来后,所提供的运算性能和效率也随之产生了质的飞跃。
利用1万多台PC组成了廉价的分布式集群,是这个思想最成功的典范!理论每秒浮点运算数达到100T!是什么促使了分而治之?就是一个速度,一个性能。
作者联系方式:myprotein@sina.com