百度知道中关于负载均衡的定义:负载均衡的意思就是有几台服务器或者几个服务,通过设备或者软件,将外部来的连接均匀的分配到这几个服务器或者服务上面,使服务器的负载平均,使外部访问基本达到快速。
负载均衡又分为硬负载和软负载,硬负载通过特定的负载均衡器硬件来设置;软负载又分为应用负载、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,将
2) 打开tomcat2的server.xml,将
3) tomcat2中的
4) tomcat2中的
5) tomcat2中的
6) tomcat2中的
将准备好的测试应用部署在两个tomcat的webapps下,我很无耻的抄袭了这个测试应用TomcatDemo:
TomcatDemo/ WEB-INF/web.xml:
TomcatDemo/index.jsp:
<%@ page contentType="text/html; charset=GBK" %> <%@ page import="java.util.*" %>
");%> <% String jsessionid = session.getId(); out.println("
ID " + jsessionid+"
"); // 如果有新的 Session 属性设置 String dataName = request.getParameter("dataName"); if (dataName != null && dataName.length() > 0) { String dataValue = request.getParameter("dataValue"); session.setAttribute(dataName, dataValue); } out.print("Session 列表"); Enumeration e = session.getAttributeNames(); while (e.hasMoreElements()) { String name = (String)e.nextElement(); String value = session.getAttribute(name).toString(); out.println( name + " = " + value+"
"); System.out.println( name + " = " + value); } out.println("Tomcat1"); %>
把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/
BalancerMember ajp://localhost:8009/TomcatDemo route=tomcat1 loadfactor=50
BalancerMember ajp://localhost:9009/TomcatDemo route=tomcat2 loadfactor=50
其中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中加入
再次对架构做个小小的诠释:
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
BalancerMember http://172.29.128.1:80/TomcatDemo loadfactor=50
BalancerMember http://172.29.128.2:80/TomcatDemo loadfactor=50
配置完成,启动172.29.128.3的apache,在浏览器中输入http://localhost/TomcatDemo,提交请求后可看到session保存了所有信息。