apahce+tomcat集群

来源:互联网 发布:奇兵网络小程序 编辑:程序博客网 时间:2024/06/05 07:33

近来的几天都在做tomcat集群,将自己学到的写下来吧。

首先需要的工具有,apahce+tomcat+mod_jk.so;

Apache

Apache是http服务器,我们利用其对Tomcat进行负载均衡。目前最新版本为2.2.17,下载地址为http://httpd.apache.org/download.cgi#apache22。

下载安装好!

Tomcat

我使用的是tomcat7,经我测试,虽能够负载均衡,但不能进行session复制,不知其他方式配置的集群是否可以。

Tomcat就不用怎么介绍了。既然在本地需要多个节点,那么需要下载ZIP版本的Tomcat。

JK

JK是Tomcat提供给http服务器的插件(个人理解的),下载地址为http://mirror.bjtu.edu.cn/apache/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.31/。如下图:

配置过程

下面就直接写过程了,我也是网络上学习的,只是总结下过程并且利用最新的Apache和Tomcat测试了下,还是与网络上有些不同的。

修改Apache配置

1、修改httpd.conf

我的Apache安装在D:\Program Files\Apache Software Foundation\Apache2.2,找到conf目录下的httpd.conf,在文件的最后一行添加

include "D:\Program Files\Apache Software Foundation\Apache2.2\conf\mod_jk.conf"

2、新建mod_jk.conf文件,内容如下:

LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so

JkWorkersFile conf/workers.properties

#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器名

JkMount /*.jsp controller

3、将下载的JK插件mod_jk-1.2.31-httpd-2.2.3.so复制到Apache安装目录的modules目录下。

4、新建并编辑workers.properties文件,内容如下:

#server

worker.list = controller

#========tomcat1========

worker.tomcat1.port=11009

worker.tomcat1.host=localhost

worker.tomcat1.type=ajp13

worker.tomcat1.lbfactor = 1

#========tomcat2========

worker.tomcat2.port=12009

worker.tomcat2.host=localhost

worker.tomcat2.type=ajp13

worker.tomcat2.lbfactor = 1

#========tomcat3========

worker.tomcat3.port=13009

worker.tomcat3.host=192.168.0.80   //输入远程电脑的IP

worker.tomcat3.type=ajp13

worker.tomcat3.lbfactor = 1

#========controller,负载均衡控制器========

worker.controller.type=lb

worker.controller.balanced_workers=tomcat1,tomcat2,tomcat3

worker.controller.sticky_session=false

worker.controller.sticky_session_force=1

#worker.controller.sticky_session=1

这里可以配置任意多个Tomcat,此处配置了3个Tomat服务器,2个本地,1个远程,所以为了它们都能够顺利启动起来,本地的服务器端口都是不同的,如果Tomcat不再同一机器上,没必要改端口的。

配置Tomcat

配置3个Tomcat服务器,将Tomcat解压后复制3份,我将每个文件夹分别命名为Tomcat1,Tomcat2和Tomcat3,修改每一份的server.xml配置,将Tomcat1中修改部分如下图:

Tomcat2中以上部分的server.xml为:

Tomcat3中以上部分的server.xml为:

因为Tomat3在远程服务器,所以没必要改端口的,而我先进行的本地集群测试后将Tomcat3复制到远程服务器,所以这3个Tomcat端口都不同。

AJP13的connector的poat和jvmRoute名称和workers.properties中配置对应。

由于截图面积有限,还需要保证本地2个本地Tomcat配置server的port,connector为http1.1的port都不相同。

 

还有就是在<Engine>下添加如下代码:

 

 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" 

 channelSendOptions="8"> 

 

 <Manager className="org.apache.catalina.ha.session.DeltaManager" 

 expireSessionsOnShutdown="false" 

 notifyListenersOnReplication="true"/> 

 

 <Channel className="org.apache.catalina.tribes.group.GroupChannel"> 

 <Membership className="org.apache.catalina.tribes.membership.McastService" 

 address="228.0.0.4" 

 port="45564" 

 frequency="500" 

 dropTime="3000"/> 

 <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" 

 address="auto" 

 port="4000"    //此处多个tomcat时,个不一样

 autoBind="100" 

 selectorTimeout="5000" 

 maxThreads="6"/> 

 

 <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"> 

 <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/> 

 </Sender> 

 <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/> 

 <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/> 

 </Channel> 

 

 <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" 

filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>

 <Valve className="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"/> 

 

 <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/> 

 <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/> 

 </Cluster> 

然后创建测试项目,命名为test2.jsp:

 <%@ page contentType="text/html; charset=GBK" %> 

 <%@ page import="java.util.*" %> 

 <html><head><title>Cluster Test</title></head> 

 <body> 

 <% 

 //HttpSession session = request.getSession(true); 

 System.out.println(session.getId()); 

 out.println("<br> SESSION ID:" + session.getId()+"<br>"); 

 // 如果有新的请求,则添加session属性 

 String name = request.getParameter("name"); 

 if (name != null && name.length() > 0) { 

 String value = request.getParameter("value"); 

 session.setAttribute(name, value); 

 

 out.print("<b>Session List:</b>"); 

 Enumeration<String> names = session.getAttributeNames(); 

 while (names.hasMoreElements()) { 

 String sname = names.nextElement(); 

 String value = session.getAttribute(sname).toString(); 

 out.println( sname + " = " + value+"<br>"); 

 System.out.println( sname + " = " + value); 

 

 %> 

 <form action="testCluster.jsp" method="post"> 

 名称:<input type=text size=20 name="name"> 

 <br> 

 值:<input type=text size=20 name="value"> 

 <br> 

 <input type=submit value="提交"> 

 </form> 

 </body> 

 </html> 

 

上面的测试页面就不解释了,很好理解。

Session测试

将项目部署到3个服务器,然后分别启动Apache和3个Tocmat服务器,这些Tomcat启动顺序随意,然后打开http://localhost/test/test2.jsp,结果如下图:

F5刷新页面,分别出现:

多次刷新页面的sessionID看是同一个ID,说明session是复制成功了。那么session中的存储的东西呢,在输入框中分别输入1、1,2、2,3、3后,显示结果如下图:

以上的测试说明,集群中的session已经共享,每个集群对于同一访问均有相同的session,而且session中存储的变量也复制了。

原创粉丝点击