Tomcat服务器集群搭建(二)--Tomcat Session Replication Cluster

Tomcat Session Replication Cluster:
在这里插入图片描述

一、 编辑server.xml,配置启用集群,将下列配置放置于 <engine> 或 <host> 中。具体信息参考https://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html

注意:每台tomcat主机都要添加;Receiver的地址记得修改,绑定的地址为auto时,会自动解析本地主机名,并解析得出的IP地址作为使用的地址,因此,确保/etc/hosts中的地址与名称正确

        <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="192.168.239.128"
                      port="4000"
                      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.MessageDispatchInterceptor"/>
          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <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.ClusterSessionListener"/>
        </Cluster>

二、 配置webapps

编辑WEB-INF/web.xml,添加元素;如果指定目录下没有web.xml文件可以从/usr/local/tomcat/conf/复制过去

注意:每个tomcat主机都有添加

[root@centos7 WEB-INF]# cp /usr/local/tomcat/conf/web.xml  /usr/local/tomcat/webapps/test/WEB-INF
[root@centos7 WEB-INF]#vim web.xml
<web-app>
....
<distributable/>
</web-app>

三、配置测试页面

tomcatA主机

[root@centos7 webapps]# pwd
/usr/local/tomcat/webapps
[root@centos7 webapps]# tree test/
test/
├── classes
├── index.jsp
├── lib
└── WEB-INF

3 directories, 1 file
[root@centos7 webapps]# cat  test/index.jsp 
<%@ page language="java" %>
<html>
	<head><title>TomcatA</title></head>
	<body>
		<h1><font color="red">TomcatA.CWJ.com</font></h1>
		<table align="centre" border="1">
			<tr>
				<td>Session ID</td>
				<% session.setAttribute("CWJ.com","CWJ.com"); %>
				<td><%= session.getId() %></td>
			</tr>
			<tr>
				<td>Created on</td>
				<td><%= session.getCreationTime() %></td>
			</tr>
		</table>
	</body>
</html>

tomcatB主机

[root@centos7 test]# pwd
/usr/local/tomcat/webapps/test
[root@centos7 test]# tree .
.
├── classes
├── index.jsp
├── lib
└── WEB-INF

3 directories, 1 file
[root@centos7 test]# cat index.jsp 
<%@ page language="java" %>
<html>
	<head><title>TomcatB</title></head>
	<body>
		<h1><font color="blue">TomcatB.magedu.com</font></h1>
		<table align="centre" border="1">
			<tr>
				<td>Session ID</td>
				<% session.setAttribute("magedu.com","magedu.com"); %>
				<td><%= session.getId() %></td>
			</tr>
			<tr>
				<td>Created on</td>
				<td><%= session.getCreationTime() %></td>
			</tr>
		</table>
	</body>
</html>

四、重启服务

tomcatA主机

[root@centos7 WEB-INF]# su - tomcat -c "catalina.sh stop"
[root@centos7 WEB-INF]# su - tomcat -c "catalina.sh start"

查看日志信息

[root@centos7 logs]# tail -f catalina.out 

09-Jan-2020 22:46:27.973 信息 [testhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/data/webapps/classes] has finished in [10] ms
09-Jan-2020 22:46:27.974 信息 [testhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [/data/webapps/lib]
09-Jan-2020 22:46:27.982 信息 [testhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/data/webapps/lib] has finished in [9] ms
09-Jan-2020 22:46:27.982 信息 [testhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [/data/webapps/ROOT]
09-Jan-2020 22:46:27.993 信息 [testhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/data/webapps/ROOT] has finished in [11] ms
09-Jan-2020 22:46:27.997 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-nio-8080"]
09-Jan-2020 22:46:28.004 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["ajp-nio-8009"]
09-Jan-2020 22:46:28.008 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in 2840 ms
09-Jan-2020 22:47:21.241 信息 [Membership-MemberDisappeared.] org.apache.catalina.ha.tcp.SimpleTcpCluster.memberDisappeared 收到成员消失:[org.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 239, 130}:4000,{192, 168, 239, 130},4000, alive=6135856, securePort=-1, UDP Port=-1, id={10 -31 -60 86 55 54 64 -55 -72 -38 -43 11 51 -120 -35 61 }, payload={}, command={66 65 66 89 45 65 76 69 88 ...(9)}, domain={}]]
09-Jan-2020 22:47:28.237 信息 [Membership-MemberAdded.] org.apache.catalina.ha.tcp.SimpleTcpCluster.memberAdded Replication member added:[org.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 239, 130}:4000,{192, 168, 239, 130},4000, alive=1019, securePort=-1, UDP Port=-1, id={23 -122 44 40 -80 -48 65 -93 -91 -60 12 -111 30 -121 -103 -28 }, payload={}, command={}, domain={}]]

tomcatB主机

[root@centos7 WEB-INF]# su - tomcat -c "catalina.sh stop"
[root@centos7 WEB-INF]# su - tomcat -c "catalina.sh start"

查看日志信息

09-Jan-2020 22:47:29.567 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/apache-tomcat-8.5.49/webapps/ROOT] has finished in [273] ms
09-Jan-2020 22:47:29.567 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [/usr/local/apache-tomcat-8.5.49/webapps/docs]
09-Jan-2020 22:47:29.584 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/apache-tomcat-8.5.49/webapps/docs] has finished in [17] ms
09-Jan-2020 22:47:29.584 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [/usr/local/apache-tomcat-8.5.49/webapps/examples]
09-Jan-2020 22:47:29.794 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/apache-tomcat-8.5.49/webapps/examples] has finished in [210] ms
09-Jan-2020 22:47:29.794 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [/usr/local/apache-tomcat-8.5.49/webapps/host-manager]
09-Jan-2020 22:47:29.817 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/apache-tomcat-8.5.49/webapps/host-manager] has finished in [23] ms
09-Jan-2020 22:47:29.818 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [/usr/local/apache-tomcat-8.5.49/webapps/manager]
09-Jan-2020 22:47:29.841 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/apache-tomcat-8.5.49/webapps/manager] has finished in [23] ms
09-Jan-2020 22:47:29.842 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [/usr/local/apache-tomcat-8.5.49/webapps/test]
09-Jan-2020 22:47:29.868 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/apache-tomcat-8.5.49/webapps/test] has finished in [26] ms
09-Jan-2020 22:47:29.874 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-nio-8080"]
09-Jan-2020 22:47:29.882 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["ajp-nio-8009"]
09-Jan-2020 22:47:29.884 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in 2749 ms

可以看到服务之间已经收到了多播信息,可以正常复制session了。

一直以来,我误解认为启动了n个tomcat,则Session需要同步复制到n个Tomcat中存在,因此在启动了6个以上的Tomcat,性能会大大下降。 而实际情况下,采取ApacheTomcat进行负载均衡集群的时候,是可以不用将Session复制到所有的节点里, 比如有六个Tomcat实例 Tomcat1,Tomcat2,Tomcat3,Tomcat4,Tomcat5,Tomcat6 是可以配置成 三组互相复制Session的群组, 比如Tomcat1和Tomcat2互相同步Session, 比如Tomcat3和Tomcat4互相同步Session, 比如Tomcat5和Tomcat6互相同步Session. 再在Apache的mod_jk模块里,对每个worker配置上redirect和activation属性。 将Tomcat1,Tomcat3,Tomcat5做为对外正常提供服务器Tomcat, Tomcat2,Tomcat4,Tomcat6作为分别对应的灾难恢复的备份Tomcat. 即比如Tomcat1当机之后,Apache会自动将发给Tomcat1的请求转发到Tomcat2上, 而Tomcat2因为同步了Tomcat1的Session信息,因此从用户的角度,是感觉不出任何差异的。 单纯的Tomcat测试如下: Tomcat配置: Tomcat1. port=”15080″, jvmRoute=”tomcat1″, <Membership className=”org.apache.catalina.tribes.membership.McastService” address=”228.0.0.5″ port=”45564″ frequency=”500″ dropTime=”3000″/> Tomcat2. port=”16080″, jvmRoute=”tomcat2″, <Membership className=”org.apache.catalina.tribes.membership.McastService” address=”228.0.0.5″ port=”45564″ frequency=”500″ dropTime=”3000″/> Tomcat3. port=”17080″, jvmRoute=”tomcat3″, <Membership className=”org.apache.catalina.tribes.membership.McastService” address=”228.0.0.6″ port=”45564″ frequency=”500″ dropTime=”3000″/> Tomcat4. port=”18080″, jvmRoute=”tomcat4″, <Membership className=”org.apache.catalina.tribes.membership.McastService” address=”228.0.0.6″ port=”45564″ frequency=”500″ dropTime=”3000″/> Tomcat5. port=”19080″, jvmRoute=”tomcat5″, <Membership className=”org.apache.catalina.tribes.membership.McastService” address=”228.0.0.7″ port=”45564″ frequency=”500″ dropTime=”3000″/> Tomcat6. port=”20080″, jvmRoute=”tomcat6″, <Membership className=”org.apache.catalina.tribes.membership.McastService” address=”228.0.0.7″ port=”45564″ frequency=”500″ dropTime=”3000″/> 所有的Tomcat webapp的web.xml加上<distributable /> (例如D:\Java\Tomcat2\webapps\examples\WEB-INF\web.xml ,) 测试页面为: 第一组: http://localhost:15080/examples/servlets/servlet/SessionExample http://localhost:16080/examples/servlets/servlet/SessionExample 第组: http://localhost:17080/examples/servlets/servlet/SessionExample http://localhost:18080/examples/servlets/servlet/SessionExample 第三组: http://localhost:19080/examples/servlets/servlet/SessionExample http://localhost:20080/examples/servlets/servlet/SessionExample 在每一组中,打开其中任何一个链接,然后设置属性值, 都可以在访问另外一个链接的时候得到。对应的sessionid的后缀会变成对应Tomcat的jvmRoute. (以上测试的tomcat均在同一台服务器上) 接下来再配置Apache的mod_jk. workers.properties的内容节选如下: (重点是redirect和activation两个属性) worker.tomcat1.port=15009 worker.tomcat1.host=127.0.0.1 worker.tomcat1.type=ajp13 worker.tomcat1.lbfactor=1 worker.tomcat1.redirect=tomcat2 worker.tomcat2.port=16009 worker.tomcat2.host=10.108.20.126 worker.tomcat2.type=ajp13 worker.tomcat2.lbfactor=1 worker.tomcat2.redirect=tomcat1 worker.tomcat2.activation=disabled 详细参考: http://tomcat.apache.org/connectors-doc/generic_howto/loadbalancers.html 备注:Tomcat6已经没有使用JGroups来实现集群复制, 而是使用Apache Tribes 来实现该效果的。 Apache Tribes的介绍在: http://tomcat.apache.org/tomcat-6.0-doc/tribes/introduction.html 为了简便配置,因此只使用一份Tomcat,使用不同的cofig来启动,配置好的文件在: http://618119.com/docs/Tomcat/TomcatCluster.zip 下载解压到Tomcat(例如D:\Java\apache-tomcat-6.0.14)目录里,运行对应的bat文件即可: start15080.bat start16080.bat start17080.bat start18080.bat start19080.bat start20080.bat
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值