@[TOC](Tomcat Session复制集群 小节4)
Tomcat Session集群
参考:tomcat.apache.org/tomcat-8.5-…
<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"
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>
配置说明
- Cluster 集群配置
- Manager 会话管理器配置
- Channel 信道配置
- Membership 成员判断。使用说明多播地址、端口多少、间隔时长ms、超时时长ms。同一个多播地址和端口认为同属一个组,使用时修改这个多播地址,以防冲突。
- Receiver 接收器,多线程接收多个其他节点的心跳、会话信息。默认会从4000到4100依次尝试可用端口。
address="auto", auto可能绑定到127.0.0.1上,所以一定要改为可以用的IP上去
- Sender多线程发送器,内部使用了tcp连接池。
- Interceptor拦截器
- Valve
- ReplicationValve检测哪些请求需要检测Session,Session数据是否有了变化,需要启动复制过程.
- ClusterListener
- ClusterSessionListener集群session侦听器
使用<c1uster className=" org.apache.catalina.ha.tcp.simpleTcpCluster" />
添加到<Engine>所有虚拟主机都可以启用Session复制
添加到<Host>,该虚拟主机可以启用Session复制
最后,在应用程序内部启用了才可以使用
前提:
- 时间同步,确保NTP或Chrony服务正常运行。# systemctl status chronyd
- 防火墙规则。# systemctl stop firewalld
| IP | 主机名 | 服务 | |
|---|---|---|---|
| 37.13 | t0 | 调度器 | Nginx、HTTPD |
| 37.14 | t1 | tomcat1 | JDK8、Tomcat8 |
| 37.15 | t2 | tomcat2 | JDK8、Tomcat8 |
本次把多播复制的配置放到缺省虚拟主机里面,即Host之下。
特别注意修改Receiver的address属性为一个本机可对外的IP地址。
t1的server.xml中,如下
]# vim conf/server.xml
...
<Host name="t1.123.com" appBase="/data/webapps" autoDeploy="true">
其他省略
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.37.14"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
...
]# pwd
/usr/local/tomcat
]# bin/shutdown.sh
]# bin/startup.sh
t2的server.xml中,如下
]# vim conf/server.xml
...
<Host name="t2.123.com" appBase="/data/webapps" autoDeploy="true">
其他省略
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.37.15"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
...
]# pwd
/usr/local/tomcat
]# bin/shutdown.sh
]# bin/startup.sh
#Tomcat重启后,ss命令能看到tomcat监听在4000端口上
]# ss -ntlp|grep 4000
LISTEN 0 50 ::ffff:192.168.37.14:4000 :::*
nginx
~]# cat /etc/httpd/conf.d/httpd-tomcat.conf
<VirtualHost *:80>
ServerName node1.123.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
ProxyPass / balancer://lbtomcats/
ProxyPassReverse / balancer://lbtomcats/
</VirtualHost>
<Proxy balancer://lbtomcats>
BalancerMember ajp://t1.123.com:8009 loadfactor=1 route=Tomcat1
BalancerMember ajp://t2.123.com:8009 loadfactor=2 route=Tomcat2
#ProxySet stickysession=ROUTEID <--
</Proxy>
]# systemctl reload httpd
尝试使用刚才配置过得负载均衡(移除Session黏性),测试发现Session还是变来变去。
t1和t2
在应用增加WEB-INF,从全局复制一个web.xml过来
]# mkdir -pv /data/webapps/ROOT/WEB-INF
]# pwd
/usr/local/tomcat
]# cp conf/web.xml /data/webapps/ROOT/WEB-INF/
]# vim /data/webapps/ROOT/WEB-INF/web.xml
<distributable/> <--直接在倒数第二行添加此行即可
</web-app>
]# bin/shutdown.sh
]# bin/startup.sh
通过负载均衡调度到不同节点,返回的SessionID不变了。