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信息会造成负载过高
相关推荐
sunon_13 小时前
linux中 nginx+tomcat 部署方式 tomcat挂掉设置自动启动
linux·nginx·tomcat
王二空间15 小时前
高并发环境下哪些方式可以优化Tomcat性能
java·tomcat
你可以自己看15 小时前
深入解析Tomcat:Java Web服务器(下)
java·前端·tomcat
V+zmm101341 天前
springboot+vue企业客户信息反馈平台 LW+ PPT+源码+讲解
java·数据库·spring boot·tomcat·vue·intellij idea
蜗牛学苑_武汉1 天前
Mybatis入门の基础操作
java·tomcat·mybatis
理论界的实战派1 天前
linux centos tomcat 不安全的HTTP请求方法
linux·centos·tomcat
宁波阿成2 天前
tomcat8.5在windows下运行出现日志中文乱码
windows·tomcat·vue3
ebg_coder2 天前
多个tomcat同时使用 不设置CATALINA_HOME环境变量
java·tomcat
拖把湛屎,戳谁谁死3 天前
SpringMVC的基本使用
java·spring·tomcat
咖啡煮码3 天前
深入剖析Tomcat(十二) 详解StandardContext
java·spring boot·tomcat