1. 部署准备(MG1332004)
Apache 服务器 下载地址:http://httpd.apache.org/download.cgi 版本2.4
Tomcat 下载地址:http://tomcat.apache.org/版本7.0
tomcat-connectors-1.2.37-windows-i386-httpd-2.4.x下载地址:http://tomcat.apache.org/dev/dist/tomcat-connectors
2. 安装过程
(1) 在主机上要安装jdk;
(2) 配置jdk的安装路径,在环境变量path中加入jdk的bin路径;
(3) 在主机上安装Apache2.4服务器;
(4) 在主机上安装三个tomcat,调试三个tomcat分别能够正常启动;
(5) tomcat的默认WEB服务端口是8080,默认的模式是单独服务,我的三个tomcat的WEB服务端口修改为8888/8889/8890;
端口修改通过修改位置为tomcat的安装目录下的conf/server.xml
修改前的配置为:
<Connector port="8080"protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
修改后的配置为:
<Connector port="8888"protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
依次修改每个tomcat的监听端口(8888/8889/8890)
因为我是一台电脑上配置,所以最后还要修改第二、三个tomcat服务器的配置端口。如果在三台电脑上就不用修改端口了。
<Serverport="8005" shutdown="SHUTDOWN">将关闭端口改为8006
<Serverport="8005" shutdown="SHUTDOWN">将关闭端口改为8007
(6) 分别测试每个tomcat的启动是否正常
http://localhost:8888;http:// localhost: 8889;http:// localhost: 8890
3. 负载均衡配置
(1) 安装完后,apache,tomcat服务器后,在我的电脑目录结构如下:
C:\ProgramFiles\Apache Software Foundation\Apache24
C:\ProgramFiles\Apache Software Foundation\apache-tomcat-7.0.52 – 1
C:\ProgramFiles\Apache Software Foundation\apache-tomcat-7.0.52 – 2
C:\ProgramFiles\Apache Software Foundation\apache-tomcat-7.0.52 - 3
(2) 将下载过来的tomcat-connectors-1.2.37-windows-i386-httpd-2.4.x解压取出mod_jk.so,复制放到Apache服务器里面的\Apache24\modules目录下。
(3) 然后在\Apache24\conf\目录下面找到httpd.conf文件。修改文件的最后一行在最后面加上一句。
include" C:\Program Files\Apache Software Foundation\Apache24\conf\mod_jk.conf"
(4) 在C:\ProgramFiles\Apache Software Foundation\Apache24\conf目录下面新建mod_jk.conf文件。文件内容如下:
#加载mod_jkModule
LoadModulejk_module modules/mod_jk.so
#指定workers.properties文件路径
JkWorkersFileconf/workers.properties
#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器
JkMount/*.* controller
(5) 在http.conf同目录下新建 workers.properties文件,内容如下:
#server 列表
worker.list= controller, apache-tomcat-7.0.52 – 1, apache-tomcat-7.0.52 – 2, apache-tomcat-7.0.52– 3
#========tomcat-1========
worker. apache-tomcat-7.0.52–1.port=8009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker. apache-tomcat-7.0.52–1.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker. apache-tomcat-7.0.52–1.type=ajp13
worker. apache-tomcat-7.0.52–1.lbfactor= 1 #server的加权比重,值越高,分得的请求越多
#========tomcat-2========
worker. apache-tomcat-7.0.52–2.port=9009 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker. apache-tomcat-7.0.52–2.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker. apache-tomcat-7.0.52–2.type=ajp13
worker. apache-tomcat-7.0.52–2.lbfactor= 1 #server的加权比重,值越高,分得的请求越多
#========tomcat-3========
worker. apache-tomcat-7.0.52–3.port=9010 #ajp13 端口号,在tomcat下server.xml配置,默认8009
worker. apache-tomcat-7.0.52–3.host=localhost #tomcat的主机地址,如不为本机,请填写ip地址
worker. apache-tomcat-7.0.52–3.type=ajp13
worker. apache-tomcat-7.0.52–3.lbfactor= 1 #server的加权比重,值越高,分得的请求越多
#========controller,负载均衡控制器========
worker.controller.type=lb
worker.controller.balanced_workers=apache-tomcat-7.0.52-1,apache-tomcat-7.0.52-2, apache-tomcat-7.0.52-3
#指定分担请求的tomcat
worker.controller.sticky_session=1
(6) 因为我是一台电脑上配置,所以最后还要修改tomcat服务器的配置端口。如果在两台电脑上就不用修改端口了。
<!--Define an AJP 1.3 Connector on port 8009 -->
<Connectorport="9009" protocol="AJP/1.3"redirectPort="8443" />将ajp1.3端口改为9009
<Connectorport="9010" protocol="AJP/1.3"redirectPort="8443" />将ajp1.3端口改为9010
至此负载均衡的配置完成。直接将手上的项目拷贝到两个tomcat目录下。即可进行负载均衡测试。打开多个浏览器窗口,观察三个tomcat后面的输出。
4. 实现session复制
(1) 在tomcat-1里面的server.xml增加
<Enginename="Catalina" defaultHost="localhost" jvmRoute="apache-tomcat-7.0.52-1">
Tomcat-2里面增加:
<Enginename="Catalina" defaultHost="localhost" jvmRoute="apache-tomcat-7.0.52-2">
tomcat-3里面增加:
<Enginename="Catalina" defaultHost="localhost" jvmRoute="apache-tomcat-7.0.52-3">
这些元素在tomcat里面被注释掉了,找到注释的部分位置,加在那个位置即可。
(2) 在三个tomcat的sever.xml 做cluster的配置
<ClusterclassName="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<ManagerclassName="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<MembershipclassName="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>
<ReceiverclassName="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<SenderclassName="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<TransportclassName="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<InterceptorclassName="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<ValveclassName="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<ValveclassName="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListenerclassName="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListenerclassName="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
因为是在同一台电脑上,所以在将不同tomcat的端口做些修改;
<ReceiverclassName="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4002"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
(3) 最后要tomcat支持session复制,必须在web.xml里面加上一个标签:<distributable/>在你工程的web.xml最后面加上这一句即可。最后运行你的tomcat,。用户登陆进系统后,查看tomcat运行的日志。看它运行在那个tomcat下,然后此时关闭这个tomcat。然后会发现另外一个tomcat此时会将关闭的那个tomcat的session复制过来,实现了失败托管。你再继续运行系统,发现不用退出系统,也能够继续运行该系统,此时跳转到另外一个tomcat上了。这样虽然在服务器端宕机了,但是对客户来说却是透明的。
5. 测试
(1) 在三个tomcat的安装目录中的webapps建立相同的应用,我和应用目录名为TestDemo,在三个应用目录中建立相同 WEB-INF目录和页面index.jsp, index.jsp的页面内容如下:
<%@ page contentType="text/html;charset=GBK" %>
<%@ page import="java.util.*"%>
<html><head><title>ClusterApp Test</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);
}
out.print("<b>Session List</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);
}
%>
<form action="index.jsp" method="POST">
Key:<inputtype=text size=20 name="dataName">
<br>
Value:<inputtype=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>
(2) 在WEB-INF\web.xml里面加上一个标签:<distributable/>;
(3) 重启apache服务器和三个tomcat服务器
访问:
http://localhost:8888/TestDemo/index.jsp,
http://localhost:8889/TestDemo/index.jsp,
http://localhost:8890/TestDemo/index.jsp
测试结果: