Tomcat session复制及session共享技术

目录

[session 复制](#session 复制)

1、环境

3、添加session测试页面

4、修改配置

[5、 在web.xml中添加标签](#5、 在web.xml中添加标签)

6、访问测试

7、个人看法


前言:

为什么要做session复制或共享

Session共享是指在多个服务器之间共享用户会话数据的能力,这对于构建高可用性和可伸缩性的Web应用程序至关重要。

实现Session复制或Session共享的目的是为了在多个Tomcat实例之间实现Session的无缝转移和共享,以提供更高的可伸缩性、负载均衡和容错性。以下是一些原因:

  1. 高可用性和容错性:通过复制或共享Session,当一个Tomcat实例发生故障或停机时,其他实例可以接管并继续处理用户请求,而不会丢失Session数据。这确保了应用程序的高可用性和容错性。

  2. 负载均衡:当有多个Tomcat实例运行时,Session复制或共享可以实现负载均衡。用户的请求可以分散到不同的实例上,提高系统的整体性能和吞吐量。

  3. 无状态化应用设计:通过将Session数据从应用服务器中移出,可以使应用程序变得更加无状态化。这意味着每个请求可以独立处理,不依赖于特定的服务器状态,从而提高应用程序的可扩展性。

  4. 保持用户会话状态:通过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信息会造成负载过高
相关推荐
无巧不成书02181 天前
Apache Tomcat 9 下载全指南(Windows,Linux,macOS):版本选型、国内镜像、SHA-512 与 PGP 完整性校验
windows·tomcat·apache
Dream-Y.ocean2 天前
鸿蒙平台 Apache Tomcat 管理控制台适配实战:基于 Electron 壳方案的真实 HTTP 服务器实现
tomcat·apache·harmonyos
无巧不成书02182 天前
Tomcat 下载后使用全指南:解压、环境配置、启动验证与常见问题排查
java·tomcat
宁之明起(B服)3 天前
vulhub靶场(tomcat三件套:PUT写马、Ghostcat与manager弱口令)
java·tomcat
程序员良辰7 天前
Eclipse Memory Analyzer(MAT)入门教程:从生成 Heap Dump 到定位 Java 内存问题
java·ide·eclipse·tomcat·idea
SQL-First布道者8 天前
我为什么把 MyBatis 从项目中删了?
java·spring·tomcat·mybatis·mybatis plus·spring jdbc
evans在进步8 天前
Tomcat 整体架构与启动流程:从 Server 到 Servlet 加载
servlet·架构·tomcat
计算机学姐9 天前
基于SpringBoot的高校爱心慈善管理系统
java·vue.js·spring boot·后端·spring·tomcat·mybatis
evans在进步9 天前
Tomcat NIO 工作原理详解:从 Acceptor、Poller 到容器处理链
java·tomcat·nio
NeverFear79210 天前
【黑马点评】短信登录
java·redis·tomcat·intellij-idea