目录
[session 复制](#session 复制)
[5、 在web.xml中添加标签](#5、 在web.xml中添加标签)
前言:
为什么要做session复制或共享
Session共享是指在多个服务器之间共享用户会话数据的能力,这对于构建高可用性和可伸缩性的Web应用程序至关重要。
实现Session复制或Session共享的目的是为了在多个Tomcat实例之间实现Session的无缝转移和共享,以提供更高的可伸缩性、负载均衡和容错性。以下是一些原因:
-
高可用性和容错性:通过复制或共享Session,当一个Tomcat实例发生故障或停机时,其他实例可以接管并继续处理用户请求,而不会丢失Session数据。这确保了应用程序的高可用性和容错性。
-
负载均衡:当有多个Tomcat实例运行时,Session复制或共享可以实现负载均衡。用户的请求可以分散到不同的实例上,提高系统的整体性能和吞吐量。
-
无状态化应用设计:通过将Session数据从应用服务器中移出,可以使应用程序变得更加无状态化。这意味着每个请求可以独立处理,不依赖于特定的服务器状态,从而提高应用程序的可扩展性。
-
保持用户会话状态:通过Session复制或共享,用户的会话状态可以在多个请求之间得到保持。这对于需要跨页面或多个请求保持用户身份、购物车信息、用户首选项等状态非常重要。
session 复制
1、环境
本实验环境步骤基于Tomcat多实例配置-CSDN博客
服务 | ip | 系统 |
---|---|---|
nginx | 192.168.226.20 | rocky_linux9.4 |
tomcat1 | 192.168.226.20:8080 | rocky_linux9.4 |
tomcat2 | 192.168.226.20:8081 | rocky_linux9.4 |
tomcat3 | 192.168.226.20:8082 | rocky_linux9.4 |
确保防火墙、selinux关闭,时间同步。
3、添加session测试页面
所有tomcat实例都配置
注意修改实例的路径
bash
vim /data/application/tomcat1/webapps/ROOT/session.jsp
#下面添加的内容,其中的IP和端口注意修改为对应实例的主机和端口,用来区分打开的是谁,可看图
bash
Session_ID: <%= session.getId() %><BR>
Session_Port: <%= request.getServerPort() %><BR>
Session_URL: <%= request.getRequestURL() %><BR>
<% out.println("This tomcat server 192.168.226.20:8080");%>
修改成功后如图
当向后端的三个服务器转发请求 ,由于session没有保持同步或者共享,因此数据会变,例如在商城页面用户登录后,由于跳转页面结果还得再次登录,这样的情况是影响使用的,因此才要做session共享,保持这个用户状态和信息。
4、修改配置
在server.xml中配置,所有tomcat实例都配置,注意修改实例的路径
bash
vim /data/application/tomcat1/conf/server.xml +141
#在配置文件中找到Engine name行,在标签内添加jvmRoute,并在下方添加内容 -->
bash
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
下面是图中在指定位置要粘贴进去的
bash
<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>
改完第一个实例,记得把其他tomcat也要改
5、 在web.xml中添加标签
所有tomcat实例都配置
注意修改实例的路径
bash
vim /data/application/tomcat1/webapps/ROOT/WEB-INF/web.xml
#<display-name>Welcome to Tomcat</display-name> #再此行下面添加下一行的内容,本行不用加进去
<distributable/>
重启tomcat
#使用这个命令是因为定义过脚本,可用较少命令实现重启
参考Tomcat多实例配置-CSDN博客中的脚本
bash
tomcat restart
6、访问测试
http://192.168.226.20/session.jsp
多次刷新,就是想虽然切换了不同后端服务器,但是session就不会改变了。
7、个人看法
官方文档: https://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html
官方建议,不超过四个节点可以使用这个方法,因为他是all-to-all的模式,频繁的广播session信息会造成负载过高