<script type="text/javascript"> google_ad_client = "pub-8800625213955058"; /* 336x280, 创建于 07-11-21 */ google_ad_slot = "0989131976"; google_ad_width = 336; google_ad_height = 280; // </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 用Java实现基于CORBA的自动负载均衡 陈亚奇 王红霞 2002-4-18 14:39:07 -------------------------------------------------------------------------------- 负载均衡 负载均衡是分布式计算中的一个重要内容,它的主要目标在于均衡所有结点上的负载,以使得所有结点上的负载基本相等,这种相等并非简单的任务数目相等,而是依据这些异构结点的性能分派的加权相等。 负载分配算法大体上可以分为静态、动态和自适应算法三类。静态负载分配算法根据已有的有关任务的信息,通过某个算法来确定任务的分配,它不使用系统状态信息来决定负载的分配,这对一些应用具有较高的效益。动态分配算法通过交换系统的状态信息决定系统负载的分配,具有超过静态算法的执行潜力。它能够适应系统负载变化情况,比静态算法更灵活、有效。由于它必须收集、储存并分析状态信息,因此动态算法会产生比静态算法更多的系统开销,但这种开销常常可以被抵消掉。自适应负载分配算法是一类特殊的动态算法,它们通过动态地改变其参数、策略来调节其活动以适应变化的系统状态。 动态负载分配算法按照集中程度可以分为集中式、完全分布式、层次性或它们中的一些结合算法。在动态集中式负载均衡系统中,全局负载信息收集在一个结点上,任何结点的负载变化信息都传给这个结点,负载均衡的所有决定由它做出。这种方式的好处在于能够以较少的开销收集全局信息,挑选出最佳结点执行任务,并且可以扩充到较大的网络计算系统。在完全分布式负载均衡系统中,每个结点保存相邻结点或系统中部分结点的负载信息,相互合作做出各自的负载分配。这种策略实现比较简单,并且经过一段时间后,可以选择到较合适的结点执行任务,缺点是不能获得最佳结点分配负载,很难扩展到成千上万个结点的网络计算系统。层次性方法是根据集中式、分散式方法的优缺点结合而成的一种负载均衡算法。它将系统分成层次性的子系统,在不同层次上特殊的结点作为负载均衡决策的控制结点,以分散其集中方式控制整个系统的负载均衡,它和网络拓扑结构有很强的相关性。 分布式计算 简单地说,分布式计算就是两个或多个软件互相共享信息,分散的计算资源通过分布式计算可以形成强大的计算能力。这些软件既可以在同一台机器上运行,也可以在通过网络连起来的几台不同的机器上运行。绝大多数分布式计算是基于客户机/服务器模型的。在客户机/服务器模型内,有两类主要的软件,客户机软件,它提出信息或服务的请求;服务器软件,则提供这种信息或服务。分布式计算具有共享稀有资源、在不同机器上平衡计算负载等优点。 目前比较流行的分布式计算方案为CORBA(Common Object Request Broker Architecture,通用对象请求代理体系结构)。CORBA由OMG(Object Management Group,对象管理组织)提出,已得到业界的广泛认可,获得了广泛的应用支持。本解决方案即采用了CORBA技术。 CORBA使用代理器ORB(Object Request Broker,对象请求代理)来处理系统中客户机与服务器之间的消息(称为请求)。ORB提供客户程序与服务程序之间的通信连接。当客户程序发出请求时,ORB查找对象的实现,将请求交给该对象(并在需要时激活对象),并将响应返回给客户程序。客户机无需知道服务器是哪个,身处何处,发送请求及返回结果的工作全部由ORB完成。ORB能选中一个最符合客户机请求的服务器,并把客户机所看到的接口从服务器的实现中分离出来,接口与实现分离的好处是可以采用灵活的、搭积木式的开发方法,实现对客户隐藏服务器的变化。只要接口及其行为没有变化,就可以构造一个新的服务器或修改已有的服务器而无需改变客户机。 实际问题 在油藏描述中有一类问题为地质统计分析,计算耗时很长(用工作站进行一次最简单的计算约耗时30分钟)。已有的计算程序是为单机而开发,生成的结果数据文件数据量很大(300002行,8Mb)。为了提高分析质量,现场多采用选用不同参数多次分析计算,然后对所有结果文件的对应位置数据取平均值的做法,非常费时费力。 为了解决这一难题,作者采用了基于CORBA的分布式计算技术。首先对原有非CORBA兼容程序进行封装,使其能被服务器对象的方法所调用,从外界看好象是服务器对象的方法一样;然后将计算程序—服务器程序对分别安装到网络中的几台工作站上,构成服务对象组;最后在网络中的一台微机上安装客户软件和ORB,即构成了一个完整的CORBA应用系统。在该系统中,操作者在客户程序中输入计算参数,通过ORB依次使其它工作站上的服务器程序启动计算软件进行分析计算,并将计算结果由服务器程序通过ORB回送给客户程序,由客户程序进行结果处理。 在上述过程中,最为关键的操作为ORB确定下一个请求时要启动的服务器,在各服务器节点间平衡负载,以减少任务响应时间,提高计算资源利用效率。这一工作需要用到CORBA的一个特性——自动负载均衡。 CORBA的ORB提供了基本的负载均衡功能,该功能的提供是基于动态集中式负载分配算法。服务器端建立服务器对象,然后向ORB注册,这样便形成了网络中所有可用的服务器对象列表。当ORB收到对某个服务器对象的引用请求后,就在自己维护的可用服务器对象列表中根据动态集中式负载分配算法找到可用对象,并将客户程序绑定到该对象的实例(在需要时将其激活)。 尽管CORBA提供了基本的负载均衡能力,但在某些特定的应用中仍显得性能不足。如前述的油藏描述问题,要求客户程序每变换一次参数,就新启动一个服务器进行分析,也即对每一个客户端请求实例,都必须有一个新的服务器对象来响应。而在CORBA中,对于客户端的同一个请求实例,都会固定地被绑定到同一个服务器对象。因此,需要对CORBA的基本负载均衡特性进行巧妙的应用以解决上述瓶颈问题。 方案一:采用多客户进程和多服务器进程(如10客户机和10服务器)的方式(见图1),使每个客户机都可以找到一个服务器进行计算。但这样带来的问题是,客户端为各个彼此间相互独立的进程,结果数据位于各进程的专有存储空间中,结果处理比较困难。 方案二:在客户端引入多线程技术,见图2。在客户机程序中建立线程组,组中的线程根据操作者进行计算的需要自动产生,并且都是同一个客户请求实例的副本。这样,每个副本实现了相同的请求实例却又相互独立,就可以激活不同的服务器完成相同功能的分析操作。由于线程共享内存单元,因此每个线程都可将计算结果存储在公用结果存储空间中,这就使得可以用客户端程序自动对计算结果进行平均处理。每当操作者修改了计算参数开始计算时,客户程序即向线程组中加入一个新的请求线程,通过ORB根据动态集中式负载分配算法找到一个空闲或负载最轻的服务器进行计算,并将返回的计算结果存入客户程序的公用结果存储区中。另外,在计算线程组之外还需要一个监控线程对计算线程组中各线程的状态进行轮询,以便当所有计算线程执行完毕并返回结果后触发结果处理操作。
经过方案二巧妙的技术处理,利用CORBA提供的基本负载均衡功能解决了特定应用的特殊要求所带来的瓶颈问题。 根据上面的思想,作者在某项目中应用了该技术。该分布式计算系统由一台微机和数台Sun工作站组成,CORBA客户端和ORB运行于微机上,在每个工作站上运行有计算程序—服务器程序对。整个处理过程耗时为第一个服务器启动到最后一个服务器启动的时间间隔加上单服务器执行时间。前者是调整参数时间,后者为真正的计算时间,且前者一般远小于后者。由此可以看出,应用该技术构建分布式计算系统,处理一个油藏描述问题所耗时间将约为原计算耗时的1/N(N为计算次数,整数),进行更复杂的处理时效率提高就尤为明显。
![](http://www.ccw.com.cn/htm/center/app/02_4_13.gif)