須要使用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.
效果以下圖所示