apache Web服务器集群负载均衡技术 (转)
Internet的快速增长,特别是电子商务应用的发展,使Web应用成为目前最重要最广泛的应用,Web服务器动态内容越来越流行。目前,网上信息交换量几乎呈指数增长,需要更高性能的Web服务器提供更多用户的Web服务,因此,Web服务器面临着访问量急剧增加的压力,对其处理能力和响应能力等带来更高的要求,如果Web服务器无法满足大量Web访问服务,将无法为用户提供稳定、良好的网络应用服务。
由于客观存在的服务器物理内存、CPU处理速度和操作系统等方面的影响因素,当大量突发的数据到达时,Web服务器无法完全及时处理所有的请求,造成应答滞后、请求丢失等,严重的导致一些数据包因延时而重发,使传输线路和服务器的负担再次增加。传统的方法是提高Web服务器的CPU处理速度和增加内存容量等硬件办法但无论如何增加Web服务器硬件性能,均无法满足日益增加的对用户的访问服务能力。
面对日渐增加的Web访问服务要求,必须对Web服务器按一定策略进行负载分配。利用负载均衡[1]的技术,按照一定策略将Web访问服务分配到几台服务器上,负载处理对用户透明,整体上对外如同一台Web服务器为用户提供Web服务。
2Web负载均衡结构
2.1负载均衡
负载是一个抽象的概念,是表示系统繁忙程度,系统在一段时间空闲,该系统负载轻,系统在一段时间空忙,该系统负载重,影响系统负载的各种因数较多如果存在很多的数据包同时通过网络连向一台Web服务器,也就是网络的速度比网络所连接的设备速度快的情况下,系统负载不断增加,直到最大。
目前提高Web服务器性能,使其具有较强负载能力,主要有两种处理思想[2]:
1)单机思想
不断升级服务器硬件性能,每当负载增加,服务器随之升级。这随之将带来一些问题,首先,服务器向高档升级,花费资金较多;其次,升级频繁,机器切换造成服务中断,可能会导致整个服务中断;最后,每种架构的服务器升级总有一个极限限制。
2)多机思想
使用多台服务器提供服务,通过一定机制使它们共同分担系统负载,对单一的服务器没有太高的性能要求,系统负载增加,可以多增加服务器来分担。对用户而言,整个系统仿佛是一台单一的逻辑服务器,这样的系统能够提供较强的可扩展性和较好的吞吐性能。
为了适应当前急剧增长的Web访问,有别于传统的单机思想,解决单机思想带来的一系列问题,本文提出了一种基于权值的策略分配负载。
2.2负载均衡实现设备[2]
目前实现负载均衡需要两类的设备:服务器和分配器。
1)服务器(Server)
为用户提供真正的服务,也就是指给用户提供负载均衡服务的计算机设备,有关该设备的一些性能数据是负载均衡的主要依据之一。
2)分配器(Dispatcher)
由用户浏览器、Web服务器组成两层结构Web系统[2],如图1所示,实际是基于客户端的负载均衡。
图1
负责给用户服务分配服务器,分配器的主要功能是根据客户和服务器的各种情况(这些情况要能反映服务器的负载状况或性能状况)通过一定的算法进行调动和分配工作,从而提高由服务器整体构成的网站的稳定性、响应能力。它主要是集中所有的HTTP请求,然后分配到多台Web服务器上处理,来提高系统的处理效率。
2.3负载均衡系统结构
2.3.1两层结构的负载均衡系统
在服务器上运行一个特定的程序,该程序相当一个客户端,它定期的收集服务器相关性能参数,如CPU、I/O、内存等动态信息,根据某种策略,确定提供最佳服务的服务器,将应用请求转发给它。如果采集负载信息程序发现服务器失败,则找其它服务器作为服务选择。这是一种动态负载均衡技术,但是每台服务器上必须安装特定的客户端程序,同时,为保证应用程序的透明性,需要对每个应用进行修改,能够将访问请求通过该客户端程序转发到其它服务器上,重定向方式进行,修改每一个应用程序,工作量十分大。
2.3.2三层结构的负载均衡系统
由用户浏览器、负载均衡和Web服务器组成三层结构Web系统[2],如图2所示。实际是基于服务器的负载均衡。
图2
如果将基于客户端的负载均衡中客户端的负载均衡部分移植到一个中间平台,形成一个应用服务器,构成请求、负载均衡和服务器的三层结构,客户端应用不需要做特殊修改,透明的中间层将请求均衡的分布到不同的服务器。
据服务器直接连到Internet与否有两种多Web服务器结构:隔离式(Separation)和非隔离式(Unseparation)。隔离式是服务器不直接连到Internet,如图3所示,非隔离式是服务器直接连到Internet,如图4所示。
图3
图4
隔离式中只有负载均衡器对外有一个IP地址,所有的请求由负载均衡器分配到不同的WebServer,所有WebServer的返回结果也经过负载均衡器传回给用户。非隔离式中每一台WebServer都有一个IP地址,用户请求经过负载均衡器分配到WebServer,而请求的应答不经过负载均衡器,直接传回用户。为了减轻均衡器的负载,本文中采用了三层结构中的隔离方式。
2.4负载均衡实现的方法
Web负载均衡常见算法有[3]:循环调度算法(Round-RobinScheduling)、加权循环调度算法(WeightedRound-RobinScheduling)、最小连接调度算法(Least-ConnectionScheduling)、目标地址散列调度算法(DestinationHashingScheduling)、源地址散列调度算法(SourceHashingScheduling)。
本文采用基于权值的调度算法,也就是说权值大的服务器优先得到调度,本文在实现时是基于静态的权值,就是在开始的时候给每一个服务器配置一个默认的权值。当然也可以根据实际运行情况再对每一个服务器的权值进行调整。但是这需要实时的搜集每一个服务器的信息,如服务器的内存实用情况,响应速度等一些信息。
3Web服务器集群环境配置与测试[4][6][9]
3.1搭建环境
3.1.1软硬件环境的搭建
(1)服务器有4台,一台安装apache,三台安装tomcat。
(2)服务器的操作系统都是WindowsXP。
(3)其中安装apache的服务器充当负载均衡器,其它三台是给用户真正服务的服务器。
(4)IP配置,一台安装apache的IP为219.218.22.130,三台安装tomcat的服务器IP分别为219.218.22.131/132/133。
3.1.2软件的安装与配置
1)安装tomcat的服务器的配置
(1)在三台安装tomcat的服务器上安装jdk。
(2)配置jdk的安装路径,在环境变量path中加入jdk的bin路径,新建环境变量JAVA_HOME指向jdk的安装路径。
(3)在三台要安装tomcat的服务器上分别安装tomcat,调试三个tomcat到能够正常启动。
(4)tomcat的默认WEB服务端口是8080,默认的模式是单独服务,我配置的三个tomcat的Web服务端口修改为7080/8888/9999。
修改位置为tomcat的安装目录下的conf/server.xml在文件中找到下面的语句:
<Connectorport="8080"maxHttpHeaderSize="8192"maxThreads="150"minSpareThreads="25"maxSpareThreads="75"enableLookups="false"redirectPort="8443"acceptCount="100”connectionTimeout="20000"disableUploadTimeout="true"/>
只需改动Port=”8080”为上面提到的端口号就行,对安装tomcat的三个服务器这个文件做改动。
2)负载均衡服务器配置1
(1)在那台要安装apache的服务器上安装apache,我的安装路径为默认C:\ProgramFiles\ApacheGroup\Apache2。
(2)安装后测试apache能否正常启动,调试到能够正常启动http://219.218.22.130。
(3)下载jk2.0.4后解压缩文件。
(4)将解压缩后的目录中的modules目录中的mod_jk2.so文件复制到apache的安装目录下的modules目录中。
(5)修改apache的安装目录中的conf目录的配置文件httpd.conf,在文件中LoadModule模块配置信息的最后加上一句LoadModulejk2_modules/mod_jk2.so。
(6)分别修改三个tomcat的配置文件conf/server.xml在文件中找到下面的语句<Enginename=”Standalone”defaultHost=”localhost”jvmRoute=”jvm1”>只需改动jvmRoute的值,在这里分别改为tomcat1,tomcat2和tomcat3。
3)均衡服务器的配置2
在apache的安装目录中的conf目录下创建文件workers2.propertie,写入文件内容如下:
#finethecommunicationchannel
[channel.socket:219.218.22.130:8009]
Info=Ajp13forwardingoversocket
#配置第一个服务器
tomcatId=tomcat1#要和tomcat的配置文件server.xml中的jvmRoute="tomcat1"名称一致debug=0lb_factor=1#负载平衡因子,数字越大请求被分配的几率越高。类似地再配置其它的服务器。最后加上这样的句子info=Statusworker,displaysruntimeinformation[uri:/jkstatus.jsp]info=Displaystatusinformationandcheckstheconfigfileforchanges.Group=status:[uri:/*]
info=MapthewholeWebappdebug=0
4)安装tomcat的服务器配置2
在三个tomcat的安装目录中的webapps建立相同的应用,我和应用目录名为GroupTest,在三个应用目录中建立相同WEB-INF目录和页面index.jsp,index.jsp的页面的主要内容是打印出为客户服务的服务器的IP地址和端口号,当然还有其它一些内容,最主要的是这些内容,这样当我们在测试的时候也方便地知道为其提供服务的服务到底是哪一个服务器,这个信息是非常重要的,这样我们能看出当大量用户访问的时候我们能知道负载分配的情况。
5)集群配置
分别修改三个tomcat的配置文件conf/server.xml找到以下面语句开始的地方:
<!--<Clusterclassname="org.apache.c
atalina.cluster.tcp.SimpleTcpCluster”
<ClusterListenerclassName="org.apache.catalina.cluster.session.ClusterSessionListener"/></Cluster>-->将最上,最下面的一行都改为<!--modifybywhh-->就可以了。
然后再在Conf目录下建立jk2.properties文件,写入下面一行,其中端口为相应的channelSocket.port=8009
6)集群应用配置
对于要进行负载和集群的tomcat目录下的webapps中的应用中的WEB-INF中的web.xml文件要添加如下一句配置<distribut
able/>到此为止配置完成剩下的就是测试
3.2环境的测试
(1)首选分别测试每个tomcat的启动是否正常。
http://219.218.22.131:7080
http://219.218.22.132:8888
http://219.218.22.133:9999
(2)其次测试一下负载均衡服务器http://219.218.22.130/jkstatus.jsp再访问一下http://219.218.22.130/GroupTest/index.jsp以上测试成功,这说明负载均衡配置已经成功。
3.3集群系统负载均衡测试
利用多个客户端访问页面index.jsp[5][7][8],能够在客户端的浏览器中看到为其提供服务的服务器的IP地址和端口,以及其它一些信息。这说明,在并发请求的情况下,集群能够将请求进行分发,达到了负载平衡的目的。下面是本实验测试的一些数据,详细内容如表格所示:
客户端
数量服务器A,B,C
权值服务器A,B,C
处理请求数量
30.5,0.8,0.31,2,0
40.5,0.8,0.31,2,1
70.5,0.8,0.32,3,2
120.5,0.8,0.34,6,2
190.5,0.8,0.36,9,4
3.4集群系统负载均衡测试分析
由上面的表格可知,当增加客户端的访问数量的时候我们可以发现设置权值在的服务器处理的请求个数多,这说明这个负载均衡系统达到了我们的预定目标,这样的系统也适用于集群中的服务器处理能力不一致的情况。此系统具有良好的适应能力,非常好地解决了在单机思想下无法解决的系统瓶颈问题。
3.5本系统的不足之处
本系统在除了有单机思想不能比拟的优点之处,也有自己的不足之处,比如本系统不能根据每个服务器的实际运行情况动态地调整集群中的每一个服务器权值,因此当有大量的用户同时访问时并不能真正的做到绝对的负载均衡,只能相对比较均匀地将负载分配到集群中的每一个服务器中去。所以本系统也有待于进一步优化,比如实时地搜集每一服务器的信息,做到动态地调整每一个服务器的权值,有关系统的进一步优化问题,将做进一步的研究。
4结束语
本文提出了一种基于三层结构的Web服务器集群负载均衡的设计方案,通过对系统进行测试,本系统能够达到负载均衡的目的,实现了本系统设计的初衷,能够适应目前Internet的发展需求。