转自CU--基于Linux的集群系统(二)
时间:2006-03-21 来源:redandblack007
在《基于Linux的集群系统》系列文章的第二部分,作者将向我们介绍几个最典型的集群系统。
1. Lsf
如何管理各种各样的计算资源(如:CPU时间、内存空间、网络带宽、应用程序等)是许多企业当前都很头疼的问题。尤其是对于那些员工遍布全球的公司而言,如何充分利用有限的计算资源是非常关键的问题。由platform公司开发的lsf 多集群系统使多个异构的计算机能够通过局域网或广域网共享计算资源,并能够为用户提供对资源的透明访问。Lsf现在主要支持以下三种大规模资源共享:
一个大企业中的多个部门,每个部门可以有一个或多个集群,这样就使得部门内部和部门之间可以共享资源。
较小部门的数据中心。大的昂贵的计算资源如超级计算机可以透明地与远方较小的部门直接进行共享。
通过松散连接的站点共享资源。
Lsf将多个集群连接在一起,一个集群往往是企业中的一个部门,每个集群中有一个主控机,此主控机负责收集该集群系统中的各台主机的负载信息,并且根据各主机的负载信息情况对作业进行调度。各个集群系统之间根据一定的策略进行资源共享。在每个主控机上定义了该集群能共享哪些集群系统中的资源。当用户发送了一个任务请求时,lsf系统能将此任务发送到对应的资源所在地,并根据调度策略选择负载较轻的机器对此任务进行处理。当多个用户请求同一个资源时,根据用户的请求优先级来确保优先级高的用户的紧急任务能首先得到满足。Lsf还具有以下特点:
提供了增强的计算能力。
通过全局资源共享,用户可以访问各种各样的计算资源,许多闲置的计算机现在都可以充分利用起来进行任务处理,许多机器也可以并行地执行同一个任务,这样就大大增强了用户的计算能力。
lsf提供了用户可配置的安全策略。
通过让用户使用RFC931协议、Kerberos、和DCE认证等策略,系统保证了远方的任务来自授权的用户。
每一个集群都是一个自治的系统。
每个集群中的主控机的配置文件中记录了如下信息:如允许在多个集群系统之间传输的任务的数量与类型,允许在多个集群之间共享资源的用户名。
提供非共享的用户账号和文件系统。
当任务在多个集群之间进行传输时,用户的账号可以根据配置文件进行映射。为了支持异构的系统,lsf通过在任务执行前后将文件在集群系统之间传递来提供对非共享的文件系统的支持。
良好的可扩展性。
在单一的集群系统中通过主控机进行管理,所有的配置信息都在主控机上,多个集群系统之间信息的传递主要是与主控机有关,而与集群中的其它主机无关。因此lsf的集群能非常容易地扩展到成百甚至上千台。
lsf系统支持多种操作系统平台。
如主要的UNIX平台:Sun Solaris、 HP-UX、 IBM AIX、 Digital UNIX/Compaq Tru64 UNIX、SGI IRIX以及 Red hat Linux、 Windows NT、Windows 2000等。
2. TurboCluster
TurboCluster是一个企业级的集群方案,它允许在多个计算机上构建高可用的、可扩展的网络。它支持Intel和Alpha芯片,支持Linux 、Windows NT 和Solaris操作系统平台。使用TurboCluster系统可以显著地提高基于TCP/IP协议的多种网络服务的服务质量,这些服务包括Web、Mail、News和Ftp等。TurboCluster具有良好的可用性、可扩展性和可管理性,集群内部的实际服务器的数量可以扩充到无限台。TurboCluster是一种基于软件的集群系统解决方案,它还能够支持异构的网络环境。它的结构如图2-1所示。
当客户向集群系统发送一个请求时,该请求首先到达高级流量管理器,高级流量管理器通过一定的调度策略将此请求转发到集群中的某一台实际服务器上对此请求进行处理,最终的回应请求将直接发送给客户。由于最终的回应请求没有通过高级浏览管理器而是直接发送给客户,这样大大减轻了高级浏览管理器上的负载,从而降低了瓶颈产生的可能。TurboCluster中采用的调度策略有:轮回(Round Robin)、加权轮回(Weighted Round Robin)、最少连接(Least Connection)。为了减少高级流量管理器产生失效的可能,TurboCluster为高级流量管理器准备了一个备份机。该备份机不断询问管理器来确认它正在正常工作,一旦发现主管理器已经失效,备份机将接替它继续工作。
:
图2-1 turbocluster结构图
TurboCluster具有如下一些增强的性能。
通过heartbeat在备份机上监测流量管理器的运行状态来提供更高的可用性。
对不可预测的系统或应用程序的失效进行自动管理。
提供动态的负载平衡,它能够消除瓶颈并且处理峰值负载。
高级流量管理器只转发已经授权的请求,通过在实际的应用程序服务器的前端增加虚拟防火墙来提高网络的安全性。
TurboCluster对外只显现出流量管理器的IP,而集群系统中的实际服务器的IP地址对外界而言是不可见的。
当实际服务器正在对外界提供服务时就可以对它进行维护工作。
基于Linux的集群系统(三)
文是《基于Linux的集群系统》系列《典型集群系统分析》的第三篇,作者将继续向我们介绍几个最典型的集群系统。
3. Linux Virtual Server
Linux虚拟服务器(Linux Virtual Server, LVS)建筑于实际的服务器集群之上,用户看不到提供服务的多台实际服务器,而只能看见一台作为负载平衡器的服务器。实际的服务器通过高速局域网或地理上分散的广域网连接。实际服务器的前端是一台负载平衡器,他将用户的请求调度到实际服务器上完成,这样看起来好像所有服务都是通过虚拟服务器来完成的。Linux虚拟服务器能够提供良好的可升级性、可靠性和可用性。用户可以透明地增加或减少一个节点,可以对实际服务器进行监测,如果发现有节点失败就重新配置系统。
Linux Virtual Server的结构如图3-1所示。:
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.fengnet.com/pic/2002.11.27.14.13.13.fig11.gif');}" src="http://www.fengnet.com/pic/2002.11.27.14.13.13.fig11.gif" onload="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border=0>
图3-1 Linux虚拟服务器结构图
3.1 调度算法
LVS提供了四种调度算法:轮转调度,加权轮转调度,最少连接调度,加权最少连接调度。
轮转调度(Round Robin Scheduling)
轮转调度不考虑服务器的连接数和响应时间,它将所有的服务器都看作是相同的。当以轮转的形式将连接分发到不同的服务器上。
加权轮转调度(Weighted Round Robin Scheduling)
根据每个机器的处理能力的不同给每个机器分配一个对应的权重,然后根据权重的大小以轮转的方式将请求分发到各台机器。这种调度算法的耗费比其它的动态调度算法小,但是当负载变化很频繁时,它会导致负载失衡,而且那些长请求会发到同一个服务器上。
最少连接调度(Least Connection Scheduling)
最少连接调度将用户请求发送到连接数最少的机器上。最少连接调度是一种动态调度方法,如果集群中各台服务器的处理能力相近,则当负载的变化很大时也不会导致负载失衡,因为它不会把长请求发送到同一台机器上。但是当处理器的处理能力差异较大时,最少连接调度就不能很好的发挥效能了。
加权最小连接调度(Weighted Least Connection Scheduling)
根据服务器的性能不同而给它们分配一个相应的权重,权重越大,获得一个连接的机会就越大。有如下的运算方法:(假设共有n台机器,每一台服务器i的权重为Wi (i=1,..,n),活跃连接数为Ci (i=1,..,n), 所有的连接数为Ci (i=1,..,n)的总和,下一个连接会发送给服务器j,服务器j满足以下的要求):
(Cj/ALL_CONNECTIONS)/Wj = min { (Ci/ALL_CONNECTIONS)/Wi } (i=1,..,n)
由于ALL_CONNECTIONS是一个常数,因此上面的式子可以优化为:
Cj/Wj = min { Ci/Wi } (i=1,..,n)
3.2 负载平衡方法
LVS提供了三种IP级的负载平衡方法:Virtual Server via NAT 、Virtual Server via IP Tunneling、Virtual Server via Direct Routing。
Virtual Server via NAT方法使用了报文双向重写的方法, Virtual Server via IP Tunneling采用的是报文单向重写的策略, Virtual Server via Direct Routing采用的是报文转发策略,这些策略将在以后的文章中详细描述。
4. MOSIX
MOSIX为Linux核心增添了集群计算的功能。它支持的操作系统平台有BSD/OS 和Linux,它允许任意多个基于X86/Pentium的服务器和工作站协同工作。在MOSIX集群环境中,用户无需对应用程序进行修改,或将应用程序与库连接起来,或将应用程序分配到不同的节点上运行。MOSIX会自动将这些工作透明地交给别的节点来执行。
MOSIX的核心是适应性的资源管理算法,它对各节点的负载进行监测并做出相应的回应,从而提高所有进程的整体性能。它使用抢先的进程迁移方法来在各节点中分配和再分配进程,从而充分利用所有的资源。适应性的资源管理算法具体上又包括适应性的负载平衡算法、内存引导算法和文件I/O的优化算法。这些算法都对集群中的资源使用情况的变化做出响应。如:节点上的不平衡的负载分布或由于内存不足而导致的过多的磁盘换入换出。在这种情况下,MOSIX将进程从一个节点迁移到另外一个节点上,从而来均衡负载或将进程迁移到有足够的内存空间的节点上。
由于MOSIX是在Linux的核心中实现的,因此它的操作对应用程序而言是完全透明的。可以用它来定义不同的集群类型,这些集群中的机器可以相同也可以不同。
与Turbocluster、Linux Virtual Server、Lsf等集群系统不同的是,MOSIX集群中的每个节点既是主节点又是服务节点,不存在主控节点。对于那些在本地节点创建的进程而言,该节点就是一个主节点;对于那些从远方节点迁移过来的进程而言,该节点就是服务节点。这意味着可以在任意时刻向集群中增加节点或从集群中删除节点,而不会对正在运行的进程产生不良的影响。MOSIX的另外一个特性就是它的监测算法能够监测每个节点的速度、负载、可用内存、IPC 以及I/O rate 。系统使用这些信息来决定将进程发送到哪个具体的节点上。当在某个节点上创建了一个进程以后,该进程就在这个节点上执行。当该节点的负载超过了一定的阀值以后,就将该进程透明地迁移到别的节点上继续执行。
MOSIX文件系统采用直接文件系统访问的方法,它可以允许迁移到别的节点的进程在本地进行I/O操作。这样就减少了需要进行I/O操作的进程与创建该进程的节点之间的通讯,从而允许这些进程更加自由地在集群中的节点中进行迁移。MOSIX文件系统使所有节点都可以像访问本地文件系统一样透明地访问其它节点上的所有目录和文件。
一个低端的MOSIX配置可以包含通过以太网连接起来的多台PC机。一个较大的配置可以包含通过快速以太网连接起来的多台工作站和服务器。高端的MOSIX配置可以包含通过Gigabit-Ethernet连接起来的多台SMP 或非SMP工作站和服务器。
5 EDDIE
Eddie的主要目的是提供一些供那些进行重要任务处理的网站使用的工具,从而使这些网站能够提供持续的高级服务。Eddie创建了一个真正的分布式web服务器结构,它支持分布于不同的物理地点的web服务器。它的结构如图5-1所示。
图5-1所示的分布式服务器包含两个集群,它们分别是site 1 和site 2。每个集群都包含着一台域名服务器和若干台运行web服务器软件的实际的服务器。当用户敲入一个域名时,首先在Local DNS上对这个域名进行解析,找出与其对应的IP地址。如果Local DNS无法对这个域名进行解析,就将此域名发送到Authoritative DNS上,Authoritative DNS返回应该访问的服务器的IP地址,然后用户就可以访问指定的服务器上的内容了。
:
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.fengnet.com/pic/2002.11.27.14.14.10.fig2.gif');}" src="http://www.fengnet.com/pic/2002.11.27.14.14.10.fig2.gif" onload="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border=0>
图5-1 Eddie集群结构图
Eddie主要包含两个软件包:HTTP网关和增强的DNS服务器。如图5-2所示,在每个站点上增加一个新的服务器(即前端机),在其上运行HTTP网关来接受外界发来的请求并且将请求调度到合适的后端机上执行,DNS服务器上运行增强的DNS服务器软件,通过该软件可以在多个地理上分散的网址上均衡负载。
Eddie主要有以下与众不同的特点:
提高了web服务器的吞吐量。通过提供强大的负载平衡能力,Eddie使用户可以充分利用分布式web服务器中的所有资源。主要在两个地方使用了负载平衡。首先后端机将本机上的负载信息如CPU负载、内存、磁盘延迟、运行队列数据以及页面错等信息发送给前端机,前端机根据负载轻重将外界请求发送到合适的服务器上。另外在增强DNS服务器软件中也提供了负载平衡的功能,前端机和后端机的综合负载信息都发送到Authoritative DNS服务器上,然后Local DNS可以根据各个Authoritative DNS上的负载的轻重来决定将域名解析的任务发送到哪一台Authoritative DNS上。这样就可以充分利用分布式服务器环境中的所有资源,增强了web服务器的吞吐量。
提供很好的服务质量。首先Eddie通过使用静态和动态负载平衡策略提高了web服务器的吞吐量,减少了用户请求的响应时间;其次,当用户发一个请求时,系统就要检查是否来自该用户的连接已经存在,如果存在,就将请求继续发送到上次对该请求提供服务的服务器上,这样就保证了用户对web访问的持续性。如果没有足够的资源,则将用户请求加入等待队列,并且告诉用户它的请求要等待一会儿才会被处理。
基于Linux的集群系统(四)
典型系统小结及评测标准
在本系列的前面几篇文章中,作者为我们介绍了几个最典型的集群系统。在本篇中,作者将就典型的集群系统做一个小节,并提出对集群系统的评测标准。
1. 典型集群系统小结
典型的集群共有的特点是:
集群都是将普通PC 工作站、工作站或服务器通过某种方式连接起来构成的多机系统。连接方式可以采取通过网络适配器和网络集线器,或通过将各个机器的RS-232串口直接连接起来,还可以通过内存通道卡和内存通道集线器的方式连接各台机器。
集群系统都具有良好的可用性。即它们都能够在集群的某部分资源出故障的情况下继续向用户提供持续的服务。几乎所有的典型集群都拥有灾难恢复功能。
集群系统有良好的可扩展性。只需很少的配置工作就可以方便地向集群中加入或删除工作节点。
典型的集群系统提供了良好的可管理性。管理人员通过简单的操作就可以对集群中的工作节点或控制节点进行配置工作。
集群系统一般都提供了负载平衡功能。负载平衡包括静态负载平衡和动态负载平衡,为了最大程度地利用集群中的一切资源,集群需要具有动态负载平衡功能,它能够通过监视集群中的实际节点的负载情况并动态地进行调度的改变。
大部分集群系统都有一个主控机,它能够对集群中的机器的运行状态进行监视,而且能够根据各机器的负载轻重进行任务的调度。
2. 评测标准
检验集群系统的主要指标是可靠性(reliability)、高可用性(availability)、可维护性(serviceablity)和其它相关特点和功能。
可靠性主要指集群中的软件、节点计算机和共享存储设备的可靠和稳定程度。
高可用性(High Availabity,HA)要求当硬件系统发生故障时,运行在该系统上的数据不会丢失,而且在尽可能短的时间内恢复应用系统的正常运行,能够满足上述要求的系统称为高可用性系统。
在美国D.H.Brown Association 公司的集群系统评测报告中,将集群系统的测试项目分为11个大项,即:
1.集群内备份与恢复:考察集群对故障和条件变化的检测和响应能力。
2.集群可配置性:考察集群硬件和软件配置的灵活性。
3.节点内故障恢复:考察独立节点硬件和软件故障条件下的恢复能力。
4.集群并行数据库可存取性:考察集群对并行数据库的支持程度和效率,即集群内各节点同时访问同一数据库的能力和效率。
5.集群内高可用性可管理能力:考察集群系统提供的集群管理工具和界面的易使用性和友好性。
6.集群单一系统映像:考察集群在分布式环境中对客户端提供的单一系统的形象。完美的情况就是为了管理和使用方便,集群提供分布式集群资源就像单机系统一样。
7.灾难恢复能力:考察集群在地理数据镜像、远程数据复制、远程自动故障处理等方面的能力,即集群在火灾、洪水和地震等条件下保持正常运行和自动故障恢复的能力。
8.硬件和软件RAID功能:考察集群对硬件和软件RAID(Redudant Array of Independent Disks)的支持程度,从而保证数据的安全性和可恢复性。
9.节点内故障预防:考察节点对故障的预警能力和节点内故障的易分辨性。
10.节点故障在线维护:考察节点在不停机条件下增加或更换部件的能力以及节点内软件的可管理性(如软件升级)。
11.节点维护特征:考察集群在重启动自动配置(在部分部件失效或增加冗余部件的情况下)、远程操作和远程故障通知等方面的能力。
基于Linux的集群系统(五)
关键技术分析之 进程的放置和迁移
通过对本系列前面四篇文章的学习,您对于集群系统应该已经有了一个整体的认识。从本篇开始作者将对集群系统进行更深入的探讨。本篇作为《关键技术分析》的第一篇将向我们讲述进程放置和迁移的一些关键技术。
1. 进程的放置
在集群系统中,进程的到达时间和新到达进程所需的资源量都是不可预测的,因此进程的放置和迁移是非常重要的问题。由于集群系统中的不可预测性,进程有时就会被放置在不合适的机器上,进程迁移就给了系统一个弥补这样的错误的机会。通过较好的算法将新创建的进程放置到合适的节点上执行,并且对某些进程进行迁移可以缩短任务的平均执行时间,因此从整体上提高了系统的性能。
进程的放置问题是非常复杂的,因为集群中的资源是异构的,如:内存、CPU、进程间通讯等等。衡量这些资源耗费的方法也是不同的:内存的单位是字节,CPU的单位是循环、通讯资源的单位是带宽。
进程的放置策略分为静态放置策略和动态放置策略。静态放置策略通过预先定义的规则对新创建的进程进行分配,它不使用运行时的信息。而动态放置策略则根据系统状态的变化将进程重新放置到最适宜的节点上。
常见的静态放置策略由三种:Round Robin(RR)、Best-Fit(BF)、Round Robin Next-Fit (NF)。
Round Robin将新创建的进程以轮转的形式放置到集群中的各节点上。这种方法的缺陷在于如果新创建的进程所需的内存量大于将要分配到其上的节点的可用内存大小,则会导致算法的失败。
一种改进的方法是使用Best-Fit方法,进程将被放置到具有最大可用内存的节点上。
Round Robin Next-fit以Round Robin的方式扫描各节点,并且将进程发送到第一个有足够大内存的节点上。它的缺点就是可能会导致负载不均衡地分配到各个节点。
三种进程放置策略的性能如图1-1所示。(进程的平均大小是16MB)
从该图可以看出,NF算法能够最充分地利用内存资源。当集群中的节点数增加时,BF算法和RR的算法的性能也随之有明显的下降,之所以产生这种情况是因为当节点数增加时,集群中的内存总量也随之成比例地增加,而且新增加的节点也会创建新的进程,这也就意味着大进程的数量也会随之增多,这些大进程对于BF算法和RR算法而言是很难放置的,因此会导致它们的性能的下降。
一种动态的进程放置策略叫做MS(Migrate the Smallest process),它以Round Robin的形式扫描所有的节点,并且将新进程放置到下一个节点上。与Round Robin不同的是,如果要放置的节点的内存不足以提供给新来的进程使用,则MS算法将迁移走一个进程。将要被迁移的进程是该节点上所有进程中最小的一个但是迁移走它刚好能满足新进程所需内存,而且也有其它的节点能够容纳这个将被迁移的节点,这种方法有较小的网络开销,如果不存在这样的节点,如其它的所有节点都没有足够大的内存空间,则算法失败。MS算法和NF算法的比较如下图所示。当进程的平均大小为1M时,两种算法都取得了将近100%的内存利用率,但是如图1-2所示当进程的平均大小为16M时,MS 算法比NF 算法高了20多个百分点。
以上各种算法都是集中式的进程放置策略,都需要使用全局信息来决定放置策略,不利于可扩展性,不能有效地在拥有多个节点的集群上执行。一种基于MS的分布式进程放置算法(Windowed MS)是这样实现的:它将迁移的进程放置到从信息窗口中选出的具有最大可用内存的节点上。所谓信息窗口指的是一个缓冲区,里面保存着其它节点的可用内存的信息。每隔一定的时间就会将其它各节点的内存信息收集到信息窗口中,并对信息窗口进行更新。
:
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.fengnet.com/pic/2002.11.27.14.22.30.fig1.gif');}" src="http://www.fengnet.com/pic/2002.11.27.14.22.30.fig1.gif" onload="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border=0>
图1-1 进程放置策略性能比较图
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.fengnet.com/pic/2002.11.27.14.22.58.fig2.gif');}" src="http://www.fengnet.com/pic/2002.11.27.14.22.58.fig2.gif" onload="if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border=0>
图1-2 进程放置策略性能比较图
2. 进程的迁移
早在20世纪80年代,人们就开始了进程迁移的研究。大多数的研究主要着眼于如何用更好的方法在机器之间传送进程的状态。同构的进程迁移指的是进程迁移的原始和目标机器的体系结构相同,而异构的进程迁移指的是不同体系结构的机器之间的进程迁移。同构的进程迁移系统的例子有:V Charllote 、DEMOS/MP、 Sprite、 Condor、 Accent ;异构的进程迁移系统有:Tui、Emerald、HMF(Heterogeneous Migration Facility )等。进程迁移主要用于以下几种情况下。
当失效的机器修复了错误,重新进入集群系统时,需要将某些该机器上原来运行的进程重新迁移回来。
在集群系统中进行负载共享。为了让一个进程使用尽可能多的CPU时间,需要将它迁移到能提供大部分指令和I/O操作的机器上执行。但是有时候负载共享也有缺陷,因为大部分的进程只需一少部分的CPU时间,考虑到进程迁移的开销,如果对那些简单的可以在本地运行的进程进行迁移是得不偿失的,但是对于那些需要大量的处理时间的程序如仿真程序,迁移进程是非常有效的。
提高通讯性能。如果一个进程需要与其它进程频繁地进行通讯,这时将这些进程放置得近一些就会减少通讯的开销。具体的迁移方法就是将一个进程迁移到其它进程所在的CPU上。
可用性。当网络上的某台机器失效时,通过进程迁移可以将进程迁移到其它机器上继续执行,这样就保证了系统在遇到灾难时的可用性。
重新配置。当对集群进行管理时,有时需要将服务从一个节点移到另一个节点,透明的进程迁移可以在不停机的情况下迁移服务。
使用集群中的某些机器的特殊能力。如果某个进程能够从集群中的某台特定机器上受益,它就应该在那台机器上执行。如进行数值计算的程序能够通过使用数学协处理器或超级计算机中的多个处理器来大大缩短程序执行时间。
尽管进程迁移已经在实验环境中成功地实现了,但是它还没有被广泛地接受。一个原因是占主流的平台如MSDOS、 Microsoft Windows以及许多种类的UNIX操作系统都没有对进程迁移的支持。另一个原因是因为进程迁移开销可能比不迁移进程时的开销还要大。但是当前,两种新的计算领域又促进了进程迁移的发展,一个是移动计算,另一个是广域计算。移动计算指的是那些便携式的小型计算机的计算问题。而广域计算是指广域网中的机器的计算问题。
进程迁移将一个正在执行的进程从一个节点迁移到通过网络连接的另一个节点上(也就是说,不使用本地共享内存机制)。进程所在的原始节点上的操作系统应该将进程的所有状态都包装起来,这样目的机就可以继续执行此进程。
要完成进程迁移需要迁移进程的状态,尤其是进程的地址空间,对其它进程的访问(如套接口、管道等),代码(可以组成地址空间的一部分)以及执行状态(寄存器、堆栈等)。除了这些,还需要将那些对原始的进程所有访问都重新链接到新的进程拷贝上,不然迁移就不是无缝的,就会导致错误。整个进程迁移操作必须是原子操作,这样才能避免进程的丢失或者是有两个拷贝。
为了进行进程迁移需要再进行以下的修改:
必须对文件系统进行一定的修改使每个机器看到相同的名字空间。
必须传送足够的状态从而确保正常的核心调用能够在远端机器上正常执行。
一些特殊的核心系统调用如gettimeofday 、getpgrp应该发回到原始节点执行。
下面通过一个异构进程迁移的例子来说明进程迁移的整个过程。图1-3说明了进程是如何在Tui进程迁移系统中从一个机器上迁移到另一个机器上的。
首先是对一个程序进行编译,针对Tui支持的四种体系结构,将程序分别编译四次。
程序在原始机上以普通方式执行。(如命令行方式)
当选定一个迁移的进程时,migrout程序首先为进程设置检查点,然后挂起进程,然后进行内存映像,接着扫描全局变量、堆栈和堆来定位所有的数据。再把所有的这些都转化为一种中介的格式传送给目标机。最后,杀死原始机器上的进程。
在目标机上,migrin程序取得中介值并创建新的进程,由于程序已经根据目标机的体系结构进行了编译,因此正文段的信息和数据报的类型信息都是可用的。然后通过重新创建全局变量、堆和堆栈,程序从检查点处继续执行。
经过统计,选择空闲主机并且开始一个新的进程需要0.1秒的时间,平均迁移时间是330毫秒。通过进程迁移可以将性能提高近5倍。
:
图1-3 进程迁移过程示意图
基于Linux的集群系统(六)
关键技术分析之 高可用性
本篇是《关键技术分析》的第二篇,将为您讲述集群系统高可用性,主要包括集群管理器和节点的高可用性。
计算机系统的可靠性用平均无故障时间(MTTF)来度量,即计算机系统平均能够正常运行多长时间,才发生一次故障。系统的可靠性越高,平均无故障时间越长。可维护性用平均维修时间(MTTR)来度量,即系统发生故障后维修和重新恢复正常运行平均花费的时间。系统的可维护性越好,平均维修时间越短。计算机系统的可用性定义为:MTTF/(MTTF+MTTR) * 100%。由此可见,计算机系统的可用性定义为系统保持正常运行时间的百分比。
计算机产业界通常用如下表所示的"9"的个数来划分计算机系统可用性的类型。
:
通过硬件冗余或软件的方法都可以从很大程度上提高系统的可用性。硬件冗余主要是通过在系统中维护多个冗余部件如硬盘、网线等来保证工作部件失效时可以继续使用冗余部件来提供服务;而软件的方法是通过软件对集群中的多台机器的运行状态进行监测,在某台机器失效时启动备用机器接管失效机器的工作来继续提供服务。
一般来说,需要保证集群管理器的高可用性和节点的高可用性。Eddie、Linux Virtual Server、Turbolinux、Piranha和Ultramonkey 都采用了类似于图1的高可用性解决方案。
:
集群管理器的高可用性
为了屏蔽集群管理器的失效,需要为它建立一个备份机。主管理器和备份管理器上都运行着heartbeat程序,通过传送诸如"我活着"这样的信息来监测对方的运行状况。当备份机不能在一定的时间内收到这样的信息时,它就激活fake程序,让备份管理器接管主管理器继续提供服务;当备份管理器又从主管理器收到"我活着"这样的信息时,它就使fake程序无效,从而释放IP地址,这样主管理器就开始再次进行集群管理的工作了。
节点的高可用性
节点的高可用性可以通过不断监视节点的状态以及节点上的应用程序的运行状态来实现,当发现节点已经失效时,可以重新配置系统并且将工作负载交给那些运行正常的节点来完成。如图1所示,系统通过在集群管理器上运行mon精灵程序来监视集群中的实际服务器上的服务程序的运行状况。例如使用fping.monitor 以一定的时间间隔来监视实际服务器是否还在正常运转;使用http.monitor 来监测http服务,使用ftp.monitor来监测ftp服务等等。如果发现某个实际服务器出了故障,或者是其上的服务已失败,则在集群管理器中删除有关这个实际服务器的所有规则。反之,如果不久以后发现系统已经重新能够提供服务,则增加相应的所有规则。通过这种方法,集群管理器可以自动屏蔽服务器和其上运行的服务程序的失效,并且当实际服务器正常运转时能将它们重新加入到集群系统中。
基于Linux的集群系统(七)
关键技术分析之文件系统
本篇是《关键技术分析》的第三篇,将为您讲述集群系统文件系统,主要包括Coda,Global,xFS,MOSIX文件系统。
集群计算的发展需要发展并升级文件系统,此文件系统不仅能够对多个文件提供并行的访问,而且能在对同一文件进行访问的进程间提供cache一致性。大多数传统的网络文件系统如NFS、AFS、Coda对于并行处理而言是远远不够的,因为它们都依赖中心文件服务器。但是,随着越来越多的客户的加入,服务器的cpu很快就成为了性能的瓶颈。为了解决这个问题,处理能力更强的服务器已经被制造了出来,而且文件系统的设计者们也试图将更多的工作交给客户来完成,但是即使是这样,服务器的速度仍然是文件系统可升级性的瓶颈。新一代的文件系统如Global File System(GFS) 、XFS和 Frangipani 比较适合于集群系统。因为这些系统都在集群系统中的机器上分配存储器、cache 和控制权,并且提供了并行文件访问和cache一致性的解决方法。
1. Coda文件系统
Coda文件系统(Coda File System)适用于分布式网络环境。它是在1987年在卡耐基梅隆大学以AFS2为原型开发出来的。Linux Virtual Server就采用了Coda文件系统。Coda提供了以下适用于网络文件系统的特性。
为移动的客户提供了断开操作。
它是一种自由软件。
通过客户访问的持续缓存提供了高可用性。
服务器复制功能。
提供了认证的安全模型、加密和访问控制。
部分网络失效后能够继续工作。
具有网络带宽适应性。
较好的可扩展性。
即使在网络失效时也为共享定义了良好的语法。
AFS和Coda文件系统都将所有的文件放于同一个目录下,如AFS 是/afs,Coda是 /coda,这意味着所有的客户都可以使用相同的配置,所有的用户看到的是相同的文件树。对于大的安装而言这是非常重要的。对于NFS文件系统而言,客户需要服务器的最新列表而在Coda中只需要找到根目录/coda。
当在客户端敲入"cat /coda/tmp/foo"这样的请求时,cat将调用系统调用向核心请求服务,核心首先找到对应的文件索引节点并返回与该文件相关的文件句柄。索引节点包含文件的一些相关信息,文件句柄用于打开文件。系统调用首先进入核心的虚拟文件系统(VFS),然后它将请求传送给核心中的Coda文件系统模块进行处理。Coda文件系统模块包含着从VFS来的最近的一些请求,然后它将此请求交给Coda缓冲管理器venus进行处理。Venus通过察看硬盘缓冲区、向服务器发请求等方式来定位文件的所在地。如果在硬盘缓冲区中没有找到匹配的文件,则通过远程系统调用向服务器发请求,并且将取到的文件放在cache中,这时,这个文件就是一个普通的文件了,因此可以通过本地文件系统对该文件进行读写的操作。如果在硬盘缓冲区找到了此文件,则可以直接使用这个文件。当对此文件进行了一定的修改并且关闭了以后,venus将把新文件传送给服务器从而来更新服务器上的文件。其它的操作如修改文件系统,创建新目录,删除文件,去除符号链接等都可以传送给服务器。
但是由于网络有时会出现问题,因此如何保证文件的连续性是一个非常重要的问题。当venus意识到服务器不可用时,它就将客户端对文件的更新存储在修改日志中,当服务器重新可用时,便根据修改日志对服务器上的相应的文件进行更新。
2. Global 文件系统
Global 文件系统(Global File System, GFS)允许多个Linux机器通过网络共享存储设备。每一台机器都可以将网络共享磁盘看作是本地磁盘,而且GFS自己也以本地文件系统的形式出现。如果某台机器对某个文件执行了些操作,则后来访问此文件的机器就会读到写以后的结果。GFS文件系统的使用示意图如图1所示。:[[The No.1
Picture.]]
3. xFS文件系统
xFS试图通过将服务器的功能如保持cache的一致性、定位数据和处理磁盘请求分布在各个客户上来提供对文件系统数据的低延迟、高带宽的访问。
为了保持cache一致性,xFS采用了如下的方法。它将客户方的所有的内存空间看为一个大的cache,这样就减少了客户方的数据缓存,利用了闲置机器的内存,这种合作型的缓存可以通过减少到达磁盘的请求量来降低读延迟。
为了将定位数据的功能分布到每个客户端,xFS让每个客户都必须对文件的一个子集对应的请求进行处理。文件数据在多个客户端加以分类从而提供更高的带宽,这些分类数据包括一些奇偶信息,通过这些信息可以在机器失效时恢复分类的数据报。这种方法可以保证没有任何节点会产生单点失效的情况。
4. MOSIX文件系统
MOSIX集群使用了自己的文件系统MFS文件系统。MFS将集群中的所有文件系统和目录都看作是一个文件系统,而且它提供了对所有节点上的所有文件系统的统一访问,它还通过只提供一个cache保证了cache的一致性。
MFS包含了许多位于不同节点上的文件子树,因此它就允许对多个文件进行并行操作和cache一致性。
在MOSIX集群中进行进程迁移时,如果此进程主要占用的是CPU资源,则迁移此进程对于提供系统性能是非常有效的,但是如果此进程需要进行大量的I/O操作,则迁移进程非常不利。这是因为每个I/O操作都需要与该进程原来所处的节点进行通讯。
因此MFS增加了对DFSA(Direct File System Acess)的支持。DFSA的目的就是让那些需要进行大量I/O操作的进程迁移到远端节点上,该远端节点拥有大多数I/O操作将会涉及到的文件,因此大多数的I/O操作都能在远端节点上完成,而且在远端节点上可以通过本地访问来访问数据。如果一个系统调用是节点无关的,此系统调用就会在远端节点上执行,否则就在本地执行。MFS比其它网络文件系统优越的地方就是它允许使用本地文件系统,这样就减少了进程和文件服务器之间的通讯开销。
: