(Load Balance) 由于现有网络的各个核心部分随着业务量的提高,访问量和数据流量的快速增长,其处理能力和计算强度也相应地增大,使得单一的服务器设备根本无法承担。 在此情况下,如果扔掉现有设备去做大量的硬件升级,这样将造成现有资源的浪费,而且如果再面临下一次业务量的提升时,这又将导致再一次硬件升级的高额成本 投入,甚至性能再卓越的设备也不能满足当前业务量增长的需求。 针对此情况而衍生出来的一种廉价有效透明的方法以扩展现有网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性的技术就是负载均衡(Load Balance)。
<o:p> </o:p>
<o:p> </o:p>
1 环境说明<o:p></o:p>
1. 服务器有4台,一台内核的linux<st1:chsdate w:st="on" isrocdate="False" year="1899" day="30" islunardate="False" month="12">2.6.9</st1:chsdate>安装apache,三台安装Tomcat。<o:p></o:p>
2. apache<st1:chsdate w:st="on" isrocdate="False" year="1899" day="30" islunardate="False" month="12">2.2.4</st1:chsdate>、apache-tomcat-5.5.17、jdk-6u1-linux-i586-rpm.bin或者jdk1.5.6
ip配置,一台安装apache的ip为180.200.1.189,三台安装tomcat的服务器ip分别为180.200.1.111/136/42。当然需要修改成你自己的IP地址。<o:p></o:p>
3. 下载地址为<o:p></o:p>
下载tomcat and apache<o:p></o:p>
http://apache.org<o:p></o:p>
下载jdk<o:p></o:p>
http://java.sun.com <o:p></o:p>
2 Tomcat安装<o:p></o:p>
1. 在三台要安装tomcat的服务器上先安装jdk<o:p></o:p>
2. 配置jdk的安装路径,在环境变量path中加入jdk的bin路径,新建环境变量JAVA_HOME指向jdk的安装路径<o:p></o:p>
3. 在三台要安装tomcat的服务器上分别安装tomcat,调试三个tomcat到能够正常启动<o:p></o:p>
4. 分别测试每个tomcat的启动是否正常
http://180.200.0.42:8080<o:p></o:p>
http://180.200.0.136:8080<o:p></o:p>
http://180.200.0.111:8080<o:p></o:p>
<o:p> </o:p>
3 Apache安装<o:p></o:p>
解压httpd-<st1:chsdate w:st="on" isrocdate="False" year="1899" day="30" islunardate="False" month="12">2.2.4</st1:chsdate>.tar.gz
在那台要安装apache的服务器上安装apache2.2.4。在home下建立apache目录,把httpd-<st1:chsdate w:st="on" isrocdate="False" year="1899" day="30" islunardate="False" month="12">2.2.4</st1:chsdate>.tar.gz上传到该目录下<o:p></o:p>
[root@localhost apache]# tar xvzf httpd-<st1:chsdate w:st="on" isrocdate="False" year="1899" day="30" islunardate="False" month="12">2.2.4</st1:chsdate>.tar.gz<o:p></o:p>
[root@localhost apache]# cd httpd-<st1:chsdate w:st="on" isrocdate="False" year="1899" day="30" islunardate="False" month="12">2.2.4</st1:chsdate>
配置APACHE安装文件<o:p></o:p>
这里需要注意编译前一定要将proxy proxy_http proxy_ftp proxy_connect headers这些参数加进去,以便编译出下面的so文件<o:p></o:p>
mod_proxy.so
mod_proxy_connect.so
mod_proxy_http.so
mod_proxy_ftp.so
mod_proxy_ajp.so
mod_proxy_balancer.so<o:p></o:p>
<o:p> </o:p>
配置编译参数<o:p></o:p>
[root@localhost apache]#./configure --prefix=/usr/local/apache224 --enable-so --enable-mods-shared="proxy proxy_http proxy_ftp proxy_connect headers"<o:p></o:p>
<o:p> </o:p>
编译
[root@localhost apache]# make<o:p></o:p>
检查编译后的是否有编译出so文件<o:p></o:p>
[root@localhost apache]# cd /usr/local/apache224/modules<o:p></o:p>
[root@localhost modules]#]# ls<o:p></o:p>
httpd.exp mod_proxy_ajp.so mod_proxy_connect.so mod_proxy_http.so<o:p></o:p>
mod_headers.so mod_proxy_balancer.so mod_proxy_ftp.so mod_proxy.so<o:p></o:p>
<o:p> </o:p>
如果存在以上文件则说明编译成功<o:p></o:p>
安装<o:p></o:p>
[root@localhost apache]# make install<o:p></o:p>
<o:p> </o:p>
启动APACHE
[root@localhost apache]# /usr/local/apache224/bin/httpd -k start<o:p></o:p>
测试<o:p></o:p>
http://180.200.1.189/<o:p></o:p>
如果输出IT works那么就ok了<o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>
4 配置负载均衡<o:p></o:p>
4.1. Tomcat配置<o:p></o:p>
分别修改三个tomcat的配置文件conf/server.xml以便测试<o:p></o:p>
修改内容如下:
修改前
<engine name="Catalina" defaulthost="localhost"></engine>
修改后
<engine name="Standalone" defaulthost="localhost" jvmroute="worker1"></engine>
将其中的jvmRoute="jvm1"分别修改为jvmRoute="worker1"和jvmRoute=" worker2"和jvmRoute=" worker3"
然后重启三个tomcat,调试是否能够正常启动。<o:p></o:p>
http://180.200.0.42:8080<o:p></o:p>
http://180.200.0.136:8080<o:p></o:p>
http://180.200.0.111:8080<o:p></o:p>
<o:p></o:p>
4.2. Apache配置<o:p></o:p>
4.2.1. 启用代理<o:p></o:p>
<o:p> </o:p>
1. 配置代理模块<o:p></o:p>
<o:p> </o:p>
[root@localhost ~]#vi /usr/local/apache224/conf/httpd.conf<o:p></o:p>
查找代理是否打开<o:p></o:p>
/LoadModule proxy_module<o:p></o:p>
LoadModule proxy_module modules/mod_proxy.so<o:p></o:p>
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so<o:p></o:p>
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so<o:p></o:p>
如果被注释则需要打开注释,如果不存在则需要添加进去<o:p></o:p>
查找httpd-vhosts.conf<o:p></o:p>
/httpd-vhosts.conf<o:p></o:p>
# Include conf/extra/httpd-vhosts.conf<o:p></o:p>
打开注释<o:p></o:p>
保存退出<o:p></o:p>
:wq<o:p></o:p>
4.2.2. 配置代理主机<o:p></o:p>
[root@localhost ~]#vi /usr/local/apache224/conf/extra/httpd-vhosts.conf<o:p></o:p>
#注释掉以下所有行<o:p></o:p>
<virtualhost></virtualhost><o:p></o:p>
ServerAdmin webmaster@dummy-host.www.serviceapache.com<o:p></o:p>
DocumentRoot /www/docs/dummy-host.www.serviceapache.com<o:p></o:p>
ServerName dummy-host.www.serviceapache.com<o:p></o:p>
ServerAlias www.dummy-host.www.serviceapache.com<o:p></o:p>
ErrorLog logs/dummy-host.www.serviceapache.com-error_log<o:p></o:p>
CustomLog logs/dummy-host.www.serviceapache.com-access_log common<o:p></o:p>
<o:p></o:p>
<virtualhost></virtualhost><o:p></o:p>
ServerAdmin webmaster@dummy-host2.www.serviceapache.com<o:p></o:p>
DocumentRoot /www/docs/dummy-host2.www.serviceapache.com<o:p></o:p>
ServerName dummy-host2.www.serviceapache.com<o:p></o:p>
ErrorLog logs/dummy-host2.www.serviceapache.com-error_log<o:p></o:p>
CustomLog logs/dummy-host2.www.serviceapache.com-access_log common<o:p></o:p>
<o:p></o:p>
#添加以下信息<o:p></o:p>
<virtualhost></virtualhost><o:p></o:p>
ServerName localhost<o:p></o:p>
CustomLog logs/dmim_log combined<o:p></o:p>
<proxy localhost=""></proxy> <o:p></o:p>
BalancerMember ajp://180.200.1.111:9109<o:p></o:p>
BalancerMember ajp://180.200.0.42:8009<o:p></o:p>
BalancerMember ajp://180.200.0.136:9309<o:p></o:p>
BalancerMember ajp://180.200.1.189:8009<o:p></o:p>
<o:p></o:p>
<location></location><o:p></o:p>
ProxyPass balancer://localhost/<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
#保存退出<o:p></o:p>
:wq<o:p></o:p>
<o:p> </o:p>
5 部署<o:p></o:p>
5.1. 编写测试代码<o:p></o:p>
在三个tomcat的安装目录中的webapps建立相同的应用,我和应用目录名为apa,在三个应用目录中建立相同 WEB-INF目录和页面index.jsp,index.jsp的页面内容如下
Server Info:
<o:p></o:p> :
值 :
名称
5.2. 应用配置<o:p></o:p>
对于要进行负载均衡3个tomcat目录下的webapps中的应用中的WEB-INF中的web.xml文件要添加如下一句配置
<distributable></distributable><o:p></o:p>
例如:<o:p></o:p>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemalocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"></web-app>
<display-name></display-name>TomcatDemo
配置后
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemalocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"></web-app>
<display-name></display-name>TomcatDemo
<distributable></distributable>
<o:p></o:p>
5.3. 打包部署<o:p></o:p>
打包工程为apa.war部署到Tomcat/webapps/下<o:p></o:p>
<o:p> </o:p>
6 测试<o:p></o:p>
到此负载均衡已配置完成。测试负载均衡先测试apache, 能否正常访问,并查询其中的内容,有三个tomcat的相关配置信息和负载说明,<o:p></o:p>
重新启动:apache 3 个tomcat<o:p></o:p>
访问http://180.200.1.189/apa/index.jsp<o:p></o:p>
看是否能够运行能运行,则已建立负载均衡。<o:p></o:p>
如果运行则会在界面上显示:worker1或者worker2或者worker3<o:p></o:p>
如输出以下信息:<o:p></o:p>
Server Info: null : 80
180.200.1.111 : -1
ID 93BD00088DA<st1:chmetcnv w:st="on" tcsc="0" unitname="F" sourcevalue="36" numbertype="1" negative="False" hasspace="False">36F</st1:chmetcnv><st1:chmetcnv w:st="on" tcsc="0" unitname="a" sourcevalue="586566057" numbertype="1" negative="False" hasspace="False">586566057A</st1:chmetcnv>9BB7CCAB.worker1<o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>
7 备注<o:p></o:p>
1. 覆盖httpd服务<o:p></o:p>
确认linux以前安装的httpd(apache)不需要了,你可覆盖掉以前apache的httpd文件。
chkconfig --add httpd<o:p></o:p>
2. 加入系统启动队列<o:p></o:p>
使用chkconfig命令把apachectl命令加入到系统启动队列中:<o:p></o:p>
chkconfig --add httpd<o:p></o:p>
3. 查看apachectl的状态<o:p></o:p>
chkconfig --list httpd<o:p></o:p>
4. 常用命令作为参考<o:p></o:p>
/etc/rc.d/init.d/httpd restart<o:p></o:p>
/etc/rc.d/init.d/httpd start<o:p></o:p>
/etc/rc.d/init.d/httpd stop<o:p></o:p>
<o:p> </o:p>
5. 系统命令<o:p></o:p>
Service httpd restart<o:p></o:p>
Service httpd stop<o:p></o:p>
Service httpd start<o:p></o:p>
<o:p> </o:p>
6. 检查apache进程<o:p></o:p>
ps -ef|grep httpd<o:p></o:p>
<o:p></o:p>
7. 检查80端口是否在监听<o:p></o:p>
netstat -apn|grep '\<80\>'
<o:p> </o:p>
8. 列出启动错误日志<o:p></o:p>
service httpd -E /路径/文件名
<o:p> </o:p>
检查apache<st1:chsdate w:st="on" isrocdate="False" year="1899" day="30" islunardate="False" month="12">2.2.4</st1:chsdate>所有配置文件是否有错误<o:p></o:p>
# /usr/local/apache2.2/bin/apachectl –t<o:p></o:p>