Tomcat Session Replication Cluster
方法一:
实验环境:
R1和R2做两台tomcat和一台httpd调度器
R1:192.168.243.8 tomcatA
R2:192.168.243.9 tomcatB
httpd:192.168.243.7
时间要同步 防火墙关闭
(1) 配置启用集群,将下列配置放置于
<engine>
<script type="math/tex" id="MathJax-Element-1">
</script>或
<host>
<script type="math/tex" id="MathJax-Element-2">
</script>中;
参考官网文档 http://192.168.243.7/docs/cluster-howto.html
[root@R1 ~]#vim /etc/tomcat/server.xml
<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.41.41"
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.243.8"
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.MessageDispatch15Interceptor"/>
</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.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
注意:CentOS 7上的tomcat自带的文档中的配置示例有语法错误;
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
R2配置和R1中一样,只是把ip改为本机Ip192.168.243.9 两台tomcat的广播地址也需相同
同时我们在R1和R2两台tomcat服务器上分别添加自定义标签jvmRoute=”TomcatA”和”TomcatB”
105 <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">
105 <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB">
注意,当我们配置完配置文件,可能出现重启tomcat服务发现无法启动,ss -ntl 查看8080和,8005,8009端口没有打开。
检查当天对应日志报错 /var/log/tomcat/catalina.2017-11-07.log
网上搜查报错信息解决办法需要 尝试设置一下组播的路由:
route add -net 224.0.0.0 netmask 224.0.0.0 dev ens33
(2) 配置webapps
编辑WEB-INF/web.xml,添加元素;
[root@R1 tomcat]# cp /etc/tomcat/web.xml /usr/share/tomcat/webapps/myapp/WEB-INF/
[root@R1 ~]#cd /usr/share/tomcat/webapps/myapp/WEB-INF/
[root@R1 WEB-INF]#vim web.xml
根据官网文档要求加上Make sure your web.xml has the <distributable/> <script type="math/tex" id="MathJax-Element-3"> </script> element
同时我们也需要在R2上同样加添 <distributable/> <script type="math/tex" id="MathJax-Element-4"> </script>
[root@R2 ~]#vim /usr/share/tomcat/webapps/myapp/WEB-INF/web.xml
(3)配置调度器httpd 配置文件
[root@centos7 ~]#vim /etc/httpd/conf.d/ajp-tomcat.conf
测试
http://192.168.243.7/myapp/
session ID 必须一样,保持同一个会话
[root@centos7 ~]#for i in {1..10};do curl -s http://192.168.243.7/myapp/ | grep -i tomcat; done
Memecached作为高速运行的分布式缓存服务器,有以下特性
● 协议简单
● 基于 libevent 的事件处理
● 内置内存存储方式
● memcached 不互相通信的分布式
Memcached也有的缺陷
● 由于数据均存储于内存中,一旦服务器宕机,所有缓存将全部丢失,对于强依赖缓存的应用将是致命性的缺陷
● 由于Memcached是旁挂式缓存服务器,不会主动去缓存数据,它所谓的分布式和智能性一半依赖于客户端(调用memcached的API开发程序),一半依赖于服务端
● 支持缓存的数据类型单一,只支持字节性数据,其它数据类型必须能够序列化方可缓存。
方法二
实现会话保持之tomcat-session-memcached
前提:
centos7.3虚拟机
两个tomcat节点:192.168.243.8(tomcatA.magedu.com)
192.168.243.9(tomcatB.magedu.com)
两个memcached节点:192.168.243.10,192.168.243.11
一个负载均衡节点:192.168.243.7
时间同步,iptables清空关闭
一、在两台memcache服务器上安装memcached并启动,检查其服务端口11211是否打开
二、下载如下jar文件至各tomcat节点的tomcat安装目录下的lib目录中,其中的
version要换成你所需要的版本号,tc
{6,7,8}要换成与tomcat版本相同的版本号。
下载地址
https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
tomcat节点的tomcat安装目录下的lib目录 /usr/share/tomcat/lib
三、分别在两个tomcat上的配置文件/etc/tomcat/server.xml某host上定义一个用于测试的context容器,并创建一个会话管理器,如下所示:
四、分别在两台tomcat添加测试界面
[root@R1 myapp]#vim /usr/share/tomcat/webapps/myapp/index.jsp
tomcatA
tomcatB
五、在192.168.243.7上配置反向代理的负载均衡内容,类似如下所示:
[root@centos7 ~]#vim /etc/httpd/conf.d/ajp-tomcat.conf
测试:
在谷歌或者火狐浏览器中