百度知道中关于负载均衡的定义:负载均衡的意思就是有几台服务器或者几个服务,通过设备或者软件,将外部来的连接均匀的分配到这几个服务器或者服务上面,使服务器的负载平均,使外部访问基本达到快速。
负载均衡又分为硬负载和软负载,硬负载通过特定的负载均衡器硬件来设置;软负载又分为应用负载、NDS负载、反向代理负载等。Apache2.2中自带的proxy_mod模块实现了反向代理负载。
简单模拟一下负载均衡:
一台Win2003服务器,IP为172.29.128.1,上面安装了Apache2.2,两个Tomcat5.5,用Apache作负载均衡器,实现Tomcat服务器的负载均衡。
Apache2.2
|
|
/ /
/ /
Tomcat1 Tomcat2
为了使两个tomcat可以在一台机器上工作,需要对端口做一些修改:
1) 打开tomcat1的server.xml,将<Engine name="Catalina" defaultHost="localhost">改为
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">;
2) 打开tomcat2的server.xml,将<Engine name="Catalina" defaultHost="localhost">改为
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">;
3) tomcat2中的<Server port="8005" shutdown="SHUTDOWN">改为<Server port="9005" shutdown="SHUTDOWN">;
4) tomcat2中的<Connector port="8080" maxHttpHeaderSize…改为<Connector port="9080"…;redirectPort="8443"改为redirectPort="9443";
5) tomcat2中的<Connector port="8080" maxHttpHeaderSize…改为<Connector port="9080" maxHttpHeaderSize…;redirectPort="8443"改为redirectPort="9443";
6) tomcat2中的<Connector port="8009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />改为<Connector port="9009" enableLookups="false" redirectPort="9443" protocol="AJP/1.3" />。
将准备好的测试应用部署在两个tomcat的webapps下,我很无耻的抄袭了这个测试应用TomcatDemo:
TomcatDemo/ WEB-INF/web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
<display-name>TomcatDemo</display-name>
</web-app>
TomcatDemo/index.jsp:
<%@ page contentType="text/html; charset=GBK" %> <%@ page import="java.util.*" %> <html><head><title>Cluster App Test</title></head> <body> Server Info: <% out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%> <% String jsessionid = session.getId(); out.println("<br> ID " + jsessionid+"<br>"); // 如果有新的 Session 属性设置 String dataName = request.getParameter("dataName"); if (dataName != null && dataName.length() > 0) { String dataValue = request.getParameter("dataValue"); session.setAttribute(dataName, dataValue); } out.print("<b>Session 列表</b>"); Enumeration e = session.getAttributeNames(); while (e.hasMoreElements()) { String name = (String)e.nextElement(); String value = session.getAttribute(name).toString(); out.println( name + " = " + value+"<br>"); System.out.println( name + " = " + value); } out.println("Tomcat1"); %> <form action="/TomcatDemo/index.jsp" method="POST"> 名称:<input type=text size=20 name="dataName"> <br> 值:<input type=text size=20 name="dataValue"> <br> <input type=submit> </form> </body>
把tomcat2中index.jsp的out.println("Tomcat1")改为out.println("Tomcat2")。
配置Apache2.2:
1) 打开httpd.conf,引入
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
2) 加入
ProxyRequests Off
ProxyPass /TomcatDemo balancer://localhost/
<Proxy balancer://localhost/>
BalancerMember ajp://localhost:8009/TomcatDemo route=tomcat1 loadfactor=50
BalancerMember ajp://localhost:9009/TomcatDemo route=tomcat2 loadfactor=50
</Proxy>
其中8009和9009是tomcat AJP协议的端口。
以上配置完成,先启动两个tomcat,运行测试成功后启动apache;在浏览器中输入http://localhost/TomcatDemo即可看到测试页面,每次刷新均访问了不同的tomcat服务器,如果其中一个宕机,则仅访问正常的那个。
但是事情并没有这么简单,每次提交后,先前保存的会话内容都会丢失,这显然不是我们想要的结果。
提到负载均衡就应当说说集群,把上面的架构加入集群就可以实现tomcat中的会话复制:
Apache2.2
|
|
Cluster
/ /
/ /
Tomcat1 Tomcat2
Tomcat官方文档上有关于tomat5.5集群配置的详细说明:http://tomcat.apache.org/tomcat-5.5-doc/cluster-howto.html。简单的配置就是将连个tomcat的Cluster放开,将tomcat2的tcpListenPort="4001"改为tcpListenPort="9001"。注意两个tomcat的Membership配置一定要相同,而且mcastAddr必须是多播地址。然后在TomcatDemo/ WEB-INF/web.xml中加入<distributable/>以上配置完成,启动tomcat1成功后再启动tomcat2(1.TomcatA starts up 2.TomcatB starts up (Wait that TomcatA start is complete) ),而后启动apache,运行测试,可以看到这次提交后集群间复制了会话。
再次对架构做个小小的诠释:
Apache2.2(balance)
/ /
/ /
Apache2.2(balance) Apache2.2(balance)
| |
| |
Cluster1 Cluster2
/ / / /
/ / / /
Tomcat1 Tomcat2 Tomcat3 Tomcat4
在另一台win2003服务器(IP为172.29.128.2)上部署应用,所有步骤和配置文件与第一台win2003一致即可;为了便于直观查看,仅需要把index.jsp的out.print(“Tomcat1”)改为out.print(“Tomcat3”)和out.print(“Tomcat4”)。
在第三台win2003服务器(IP为172.29.128.3)上安装Apache2.2:
1) 打开httpd.conf,引入
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
2) 加入
ProxyRequests Off
ProxyPass /TomcatDemo balancer://localhost/ stickysession=jsessionid nofailover=On
<Proxy balancer://localhost/>
BalancerMember http://172.29.128.1:80/TomcatDemo loadfactor=50
BalancerMember http://172.29.128.2:80/TomcatDemo loadfactor=50
</Proxy>
配置完成,启动172.29.128.3的apache,在浏览器中输入http://localhost/TomcatDemo,提交请求后可看到session保存了所有信息。