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信息会造成负载过高
相关推荐
次次皮2 天前
Linux 下通过 XShell 手动更新 Tomcat 应用并重启
前端·tomcat·jar
Listen·Rain3 天前
用AI开发出一个AI
java·人工智能·spring boot·tomcat·intellij-idea·mybatis·visual studio
Full Stack Developme4 天前
SpringBoot 内嵌 Tomcat 的启动流程
spring boot·后端·tomcat
Full Stack Developme4 天前
Tomcat 如何处理HTTP请求
java·http·tomcat
Full Stack Developme5 天前
Tomcat 设计原理
java·tomcat
Full Stack Developme5 天前
Tomcat NIO连接器内部如何实现零拷贝 Session管理如何实现集群同步
java·tomcat·nio
BullSmall5 天前
Tomcat 部署 Jenkins → Docker Jenkins 完整迁移方案
docker·tomcat·jenkins
baozhengw6 天前
信创改造-SpringBootJar包改为WAR包部署Tomcat
java·tomcat
Java面试题总结11 天前
mybatis插件
java·tomcat·mybatis
左左右右左右摇晃12 天前
手写Tomcat原理整理
java·开发语言·笔记·tomcat