须要使用2台tomcat作集群,如何保持在负载均衡时session不丢失。html
环境:winxp+httpd-2.2.22-win32-x86-openssl-0.9.8t.zip+apache-tomcat-7.0.53+jdk8java
方法一、使用session粘滞,就是A用户进来永远都是A tomcat对应,缺点:A一挂,session就丢失了web
方法二、使用session复制,这样即便一台挂了,session也不会丢失。缺点:session同步,会耗费tomcat性能apache
这里着重讲一下方法2.tomcat
一、winxp虚拟机一台(略);apache(负载均衡);tomcat 2台session
二、apche配置app
2.一、httpd.conf配置负载均衡
2.1.1) httpd.conf,将如下模块注释去掉webapp
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 LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
2.1.2)去掉Include conf/extra/httpd-vhosts.conf的注释jvm
2.1.3)在最后添加以下代码
#分配请求 ProxyRequests Off <proxy balancer://cluster> BalancerMember ajp://192.168.92.1:8009 loadfactor=1 route=tomcat1 BalancerMember ajp://192.168.92.1:8109 loadfactor=1 route=tomcat2 </proxy>
2.二、httpd-vhosts.conf配置
在最后一行添加以下代码
<VirtualHost *:80> 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 </VirtualHost>
三、配置tomcat.先配置tomcat1,tomcat2同(端口冲突记得改掉)。
tomcat1配置
3.一、将engine改为以下
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
3.二、配置集群
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8"/>
注意:cluster能够有更复杂的配置,这里已经够用。
3.三、tomcat2同
3.四、开启tomcat集群
在context.xml中,将context改为以下格式
<Context distributed="true">
四、编写代码
4.一、在webapps目录下新建test目录,新建WEB-INF文件夹,test.jsp
4.二、编写test.jsp
<%@ page contentType="text/html; charset=UTF-8" %> <%@ page import="java.util.*" %> <html><head><title>Tomcat Cluster Demo</title></head> <body> Server Info: <% out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%> <% out.println("<br> ID " + session.getId()+"<br>"); 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("<b>Session List</b>"); Enumeration<String> e = session.getAttributeNames(); while (e.hasMoreElements()) { String name = e.nextElement(); String value = session.getAttribute(name).toString(); out.println( name + " = " + value+"<br>"); System.out.println( name + " = " + value); } %> <form action="test.jsp" method="POST"> Name:<input type=text size=20 name="dataName"> <br> Value:<input type=text size=20 name="dataValue"> <br> <input type=submit> </form> </body> </html>
4.三、在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>test</display-name> <distributable/> </web-app>
五、启动2个tomcat,apache.
效果以下图所示