tomcat集群session共享问题
j集群环境中多个tomcat之间不共享session存储空间,当请求切换到不同的tomcat服务时,session数据丢失。
思路分析:
每个tomcat都有自己的session,假设用户第一次访问第一个tomcat,并将自己的信息存储在第一个服务器的sesion中,但第二次用户访问第二个tomcat,所以在第二个服务器中,当然没有第一个服务器存储session,所以此时 整个登录拦截功能会出现问题,如何解决这个问题?
常见的Session共享方案分析Session共享方案应满足:数据共享、内存存储、key/Value结构
一 使用nginxip_hash当使用ip绑定ip_hash算法时,用户的请求将绑定在同一节点服务器上。这样的设置会导致一个或多个服务器过载,无法提供服务,而正常的后端服务器无法提供服务。当绑定服务器挂断时,用户只能在重新访问之前重新启动浏览器,因此用户体验非常差。除特殊需要外,不建议使用此机制实现session共享
二 基于服务端的session共享1 基于Tomcat提供的session复制这个方案意味着每个tomcat都有不同的session,但是每当任何服务器的session修改时,都会同步给其他tomcat服务器的session,这样session就可以共享了。但是这个方案有以下问题:
1、集群中的每个服务器都有一个完整的session数据,浪费内存空间(tomcat多的时候)。
2、当tomcat较多时,session在复制到集群中的其他机器时可能会延迟(占用内网宽带)。用户在复制过程中访问,仍然无法登录
2 基于memcached/file的实现本处介绍不多,感兴趣的同学可以自己查资料。
3 基于jcoleman的redis解决方案该方案仅支持tomcat6和7。如果您想支持tomcat8或9,您需要修改代码,然后打包和部署,这是非常麻烦的。不建议使用。所以这里不再重复了。附上参考资料,以便自己理解和学习
参考资料:
tomcat-redis-session-manager
基于redis实现tomcat8的session共享
tomcat8集群的session持久化实现
4 基于Redison的redis解决方案4.1 环境准备IP
软件
软件版本
127.0.0.1
Nginx
nginx-1.24.0
127.0.0.1:8080
Tomcat
apache-tomcat-9.0.74-1
127.0.0.1:8081
Tomcat
apache-tomcat-9.0.74-2
127.0.0.1:6379
Redis
Redis-x64-5.0.14.1
4.2 nginx+tomcat+redis部署过程4.2.1 安装部署Redis1 下载安装
1)访问https://github.com/tporadowski/redis/releases地址,下载redisx64-5.0.14.1.zip
2.解压Redis-x64-5..14.1.zip文件,点击执行redis-server.exe,如图:
注:如需设置访问密码,请编辑redis.windows.conf文件如图:
4.2.2 tomcat安装部署部署下载安装
1)访问https://tomcat.apache.org/download-90.cgi地址,下载apache-tomcat-9.0.74.zip文件
2)解压apache-tomcat-9.0.74.如图所示,zip文件:
3)修改Tomcat端口
apache-tomcat-9.0.74-1端口保持原值不变,修改apache-tomcat-9.0.74-2端口,如下图所示:
apache-tomcat-9.0.74-2/conf/server.xml
4)修改 TOMCAT_BASE/webapps/ROOT/index.jsp,添加:
<table align="center" border="1"> <tr> <td>cluster-desc</td> <!-- 分别修改描述 --> <td>This is the first tomcat</td> <td>This is the second tomcat</td> </tr> <tr> <td>SessionID</td> <td><%= request.getSession().getId() %></td> </tr> <tr> <td>SessionCreatedTime</td> <td><%= request.getSession().getCreationTime() %></td> </tr> <tr> <td>ServerName</td> <td><%=request.getServerName()%></td> </tr> <tr> <td>SessionPort</td> <td><%=request.getServerPort()%></td> </tr></table>
5)apache-tomcat-9.0.74-1、apache-tomcat-9.0.74-1访问验证
分别访问http://127.0.0.1:8080/,http://127.0.0.1:8081/ 链接,如下图所示(sessionID不同):
4.2.3 安装部署Nginx下载安装
1)访问http://nginx.org/en/download.下载nginx-1.24.0html链接.zip文件
2.解压nginx-1.24..zip文件,如图所示
3)nginx负载均衡配置
nginx-1.24.0/conf/nginx.conf
upstream ha-balance { server 127.0.0.1:8080 weight=1; server 127.0.0.1:8081 weight=1;}location = / { proxy_pass http://ha-balance;}
4)测试验证,访问:http://127.0.0.1 每次发现sessionid都不一样。
4.2.4 配置tomcat session共享4.2.2.4.1、Add session manager1)Add shared redisson instance produced by JndiRedissonFactory
into tomcat/conf/server.xml
in GlobalNamingResources
tag area:
<GlobalNamingResources> <Resource name="bean/redisson" auth="Container" factory="org.redisson.JndiRedissonFactory" configPath="${catalina.base}/conf/redisson.yaml" closeMethod="shutdown"/> </GlobalNamingResources>
2)Add JndiRedissonSessionManager
with resource link to redisson instance into tomcat/conf/context.xml
<ResourceLink name="bean/redisson" global="bean/redisson" type="org.redisson.api.RedissonClient" /><Manager className="org.redisson.tomcat.JndiRedissonSessionManager" readMode="REDIS" jndiName="bean/redisson" />
3)新增redison配置文件 tomcat/conf/redisson.yaml
可参考更多配置
singleServerConfig: idleConnectionTimeout: 10000 connectTimeout: 10000 timeout: 3000 retryAttempts: 3 retryInterval: 1500 password: null subscriptionsPerConnection: 5 clientName: null address: "redis://127.0.0.1:6379" subscriptionConnectionMinimumIdleSize: 1 subscriptionConnectionPoolSize: 50 connectionMinimumIdleSize: 24 connectionPoolSize: 64 database: 0 dnsMonitoringInterval: 5000threads.: Threads16netty: 32codec: !<org.redisson.codec.MarshallingCodec> {}transportMode: "NIO"
4.2.4.2 将两个Jar包下载并复制到Tomcatat中 Lib目录下
redisson-all-3.21.0.jar
Tomcat 7.x - redisson-tomcat-7-3.21.0.jar
Tomcat 8.x - redisson-tomcat-8-3.21.0.jar
Tomcat 9.x - redisson-tomcat-9-3.21.0.jar
Tomcat 10.x - redisson-tomcat-10-3.21.0.jar
4.2.5 session共享测试验证重启tomcat,访问:https://www.tulingxueyuan.cn/d/file/p/20230611/wlw3hfdadop 每次发现sessionid都是一样的
参考资料:
https://github.com/redisson/redisson/tree/master/redisson-tomcat
https://github.com/redisson/redisson/wiki/2.-Configuration
Tomcat+redis+session实现session共享httppredison://chanpinxue.cn/archives/5694.htmlhttps://blog.csdn.net/chenyang_wei/article/details/127846656