背景:
需要使用2台tomcat做集群,如何保持在负载均衡时session不丢失。
环境:winxp+httpd-2.2.22-win32-x86-openssl-0.9.8t.zip+apache-tomcat-7.0.53+jdk8
思路:
方法1、使用session粘滞,就是A用户进来永远都是A tomcat对应,缺点:A一挂,session就丢失了
方法2、使用session复制,这样即使一台挂了,session也不会丢失。缺点:session同步,会耗费tomcat性能
这里着重讲一下方法2.
步骤:
1、winxp虚拟机一台(略);apache(负载均衡);tomcat 2台
2、apche配置
2.1、httpd.conf配置
2.1.1) httpd.conf,将以下模块注释去掉
LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_ajp_module modules/mod_proxy_ajp.soLoadModule proxy_balancer_module modules/mod_proxy_balancer.soLoadModule proxy_connect_module modules/mod_proxy_connect.soLoadModule proxy_ftp_module modules/mod_proxy_ftp.soLoadModule proxy_http_module modules/mod_proxy_http.soLoadModule proxy_scgi_module modules/mod_proxy_scgi.so
2.1.2)去掉Include conf/extra/httpd-vhosts.conf的注释
2.1.3)在最后添加如下代码
#分配请求ProxyRequests OffBalancerMember ajp://192.168.92.1:8009 loadfactor=1 route=tomcat1 BalancerMember ajp://192.168.92.1:8109 loadfactor=1 route=tomcat2
2.2、httpd-vhosts.conf配置
在最后一行添加如下代码
ServerAdmin webmaster@dummy-host2.localhost ServerName 127.0.0.1 ServerAlias localhost ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On ProxyPassReverse / balancer://cluster/ ErrorLog "logs/lbtest-error.log" CustomLog "logs/lbtest-access.log" common
3、配置tomcat.先配置tomcat1,tomcat2同(端口冲突记得改掉)。
tomcat1配置
3.1、将engine改成如下
3.2、配置集群
注意:cluster可以有更,这里已经够用。
3.3、tomcat2同
3.4、开启tomcat集群
在context.xml中,将context改成如下格式
4、编写代码
4.1、在webapps目录下新建test目录,新建WEB-INF文件夹,test.jsp
4.2、编写test.jsp
<%@ page contentType="text/html; charset=UTF-8" %><%@ page import="java.util.*" %>Tomcat Cluster Demo Server Info:<%out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"");%><% out.println(" ID " + session.getId()+""); String dataName = request.getParameter("dataName"); if (dataName != null && dataName.length() > 0) { String dataValue = request.getParameter("dataValue"); session.setAttribute(dataName, dataValue); System.out.println("application:" + application.getAttribute(dataName)); application.setAttribute(dataName, dataValue); } out.print("Session List"); Enumeratione = session.getAttributeNames(); while (e.hasMoreElements()) { String name = e.nextElement(); String value = session.getAttribute(name).toString(); out.println( name + " = " + value+" "); System.out.println( name + " = " + value); }%>
4.3、在WEB-INF目录下,新建web.xml,内容如下
test
5、启动2个tomcat,apache.
效果如下图所示