浅谈服务器集群技术

1. 基础:同样的服务环境

      为了使得多台系统能表现的如同一台服务器系统一样,那么就必须具备一个基本条件,就是这么多台服务器系统,每台单独运行,都能提供完全一致的服务,否则,不同的服务器提供不一致的服务,又如何对外表现出完全一致的表现呢?这里,最简单的例子是Web服务器,我们可以设置Web服务器,使多个Web服务器中保存的网页文件内容完全一致,这样,无论访问哪个服务器,只要使用同样的URL就能得到同样的结果。

      因此,在这个阶段要保证内容的一致性,就需要使用诸如服务器之间的同步镜像、网络存储系统NAS或SAN,数据库的同步复制等等技术。

2. 实现:任务调度


      当所有的服务器都具备一致性的表现,接下来的任务就是将任务按照一定的方式分配给这些服务器,这就是任务调度。

      实现任务调度首先需要要将任务尽可能的按照小粒度分割,每个粒度应该是能够在不同服务器部分上单独执行的最小单位。粒度划分的越小,任务分割得越平均,因而整体效果就越好。但粒度的划分是有一定条件的,粒度越小,粒度之间的关联就越紧密,例如在SMP多处理器的计算机系统中,任意一个线程都可以在任一个处理器上执行,因此执行粒度可以划分为线程,但是线程之间是共享内存的,这已经在理论上提出,并在并行计算机上实现,但在不同服务器之间目前还是不现实的。

      由于大多数网络服务都是基于TCP网络连接的,因此最简单的考虑,可以按照TCP连接划分任务粒度,这适合包括Web服务,数据库连接等绝大多数情况。

      实现任务调度的方式有很多种,一种方法是在系统内部完成,所有的服务器能够自我协调,完成任务调度,这种方法要涉及所有的服务器,依赖于具体的应用系统,因而更为复杂。另一种方法是不在服务器之间实现调度,而依赖于外部的任务调度设备执行调度。无论那种任务调度方式,最大的问题就是害怕任务调度本身带来的额外消耗或性能瓶颈,因此使用硬件设备和单一的高效率系统,作为外部任务调度设备,成为了集群的首选方案。

3. 外部任务调度:负载平衡和虚拟服务器

      使用外部任务调度设备对任务按照网络连接进行分配,这种情况通常被称为网络服务器的负载平衡。外部的任务调度设备有很多种,例如基于BSD/OS的F5,CISCO的LocalDirector,以及一些七层交换机,例如Foundry的交换机等等,我也曾在98年基于FreeBSD的NATD做过这方面的探讨。目前,除了一些基于硬件交换机设备之外,完全软件的实现中最为流行的就是LVS,Linux Virtual Server,作为一个开放源代码的项目,他得到了Linux社区的大力支持,并用于大部分Linux集群设备中。LVS是由国防科技大学的章文松提出的一个开放源代码项目,事实上这也是国内Linux开发工作中最被国际认可的一个工作,这也标志着国内在这个方向上的研究并不次于国际同行。
      LVS中最为优秀的特点是实现了策略路由的观念,它允许一个TCP连接由任务分配设备分配给后端服务器中之后,后端服务器使用不同的路由,不再经过任务分配器,而是直接返回给客户,这种方式需要后端服务器也是Linux设备,因此不是简单的任务调度。

4. 服务器负担:容错与监控

      任务调度的关键是将所有的任务平均的分配给所有的服务器,如果不能做到合理的分配,就能出现部分服务器上的拥塞现象,此时还可能有后台服务器类型差异造成的处理能力的不一致等情况。

      为了达到这个任务分配的目的,必须使用一种方法来获得服务器状态,这里就有不同的几种方法。最简单的方法是按照当前服务器的任务数量来衡量服务器负荷,通常就是按照网络连接的数量来衡量,这种方法应该是比较模糊的,因此不同的连接对服务器造成的压力是不同的,例如一个静态网页的处理和一个后台CGI程序的处理,服务器负担就绝对不同。
      一些负载均衡设备通过测量设备对网络连接响应时间来判断服务器的负荷,这基本上能够反映一些情况,但也并非绝对如此,因为优秀的服务器对于基本的网络响应是迅速的,但对于后面的处理过程则受系统负荷的影响。因此,一些系统甚至引入了客户/服务器机制,在后台服务器中安装代理来完成探测系统性能的任务。
      当任务调度设备能够精确的了解服务器负荷的时候,它显然就能够达到了解后台服务器的可用性,就是说任务调度设备能够检测出某些后台服务器不能正确运行,从而避开这个服务器,将任务分配给其他设备,达到容错的目的。

5. 共享数据:会话管理

      还是以Web访问为例,对于普通的网页,不同的HTTP连接就可以认为是不同的任务。但是,对于更复杂的应用,例如需要用户登录,并根据不同用户提供不同服务的情况呢?
      此时,如果仍然还是要把不同的HTTP连接看作不同的任务,那么这些连接之间实际上还是有一定关系的,事实上每个用户从登录到退出,可以被看作一个完整的HTTP会话。
      由于这些会话必须保存的数据比较少,例如仅仅是用户名和简单的一些秘密设置,任务调度的时候可以不考虑这些会话,那么就可能发生这样的情况,同一个会话的不同HTTP连接可能在不同的后台服务器上进行处理,因此这就需要进行这些服务器之间的数据共享。数据共享可以通过多种方式,通过共享的存储空间,通过独立的服务程序,通过数据库,甚至通过共享网络间内存等等。
      虽然任务调度程序可以不理会这种会话,不同服务器之间可以共享,但如果能够支持会话功能,使得同一个会话可以被同一个服务器所处理,这样会带来效率上的提高。因此,一些任务调度设备提出了“粘滞”的概念,能够根据Cookie或其他标记判断会话,并导向同一个服务器。

6. 相关技术

        虽然目前用于解决网络服务的集群技术,在技术层次上比较简单,事实上只是应用了此前并行计算技术研究的一些简单方面,但在实用化方面的作用还是很明显的。
        但在理论上,目前所使用网络服务器集群技术还是有很大的挖掘之处,例如,目前的任务调度的粒度是基于TCP连接的,如何更细化。目前,在并行计算领域,人们使用PVM和MPI,允许运行在不同计算机上的多个进程进行协同,在进程之内可以进行任务调度,粒度被切割到更细致的计算单元,如果能将这些概念应用于集群系统,必然能更好的解决对大负载任务的处理任务,缩减处理时间。
        此外,目前一旦任务调度设备将任务分配给一个服务器,那么这个任务就一定在这个服务器上运行,直到完成。有时,人们需要将一个任务从一个服务器透明的迁移到另一个服务器正常执行,目前,在Linux上的Mosix能达到这个目标。
        事实上,PVM、MPI、Mosix等等技术,都是构建用于计算目的的Linux集群计算机的有效工具。用于处理计算的Linux集群计算机是由多台Linux节点构成的超级计算机,主要用来处理计算任务,他们处理的任务通常要比用于网络服务的集群计算机更为复杂,使得节点之
间的I/O非常频繁,造成了相当多的额外负荷(例如一个进程从一个节点迁移到另一个节点上的网络负荷)。
        因此,对于处理网络服务来讲,由于服务类型简单,目前的这种集群方式还是比较实用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值