Tomcat 9.X(9.0.74)集群实现Session共享(基于redisson)

简介: 本文主要介绍了tomcat集群环境下基于redis+Redisson实现session共享,分享给大家,供广大从业者学习和参考。
+关注继续查看

Tomcat集群session共享问题

j集群环境下多台Tomcat之间并不共享session存储空间,当请求切换到不同tomcat服务时导致session数据丢失的问题。

思路分析:

每个tomcat中都有一份属于自己的session,假设用户第一次访问第一台tomcat,并且把自己的信息存放到第一台服务器的session中,但是第二次这个用户访问到了第二台tomcat,那么在第二台服务器上,肯定没有第一台服务器存放的session,所以此时 整个登录拦截功能就会出现问题,我们能如何解决这个问题呢?

常见Session共享方案分析

Session共享方案应满足:数据共享、内存存储、key/Value结构

一 使用nginx的ip_hash

使用ip绑定ip_hash算法时,用户的请求都会绑在同一个节点服务器上,这样的设置会导致一台或多台服务器过载无法提供服务,而后端正常的服务器无法提供服务,当绑定的服务器挂了,用户只能重启浏览器后才能重新访问,这样用户体验度极差,除了特殊需要,不建议使用这种机制实现session共享

二 基于服务端的session共享

session.png

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

tomcat8的session共享实现基于redis实现

tomcat8集群的session持久化实现

4 基于Redisson的redis解决方案

4.1 环境准备

IP软件软件版本
127.0.0.1Nginxnginx-1.24.0
127.0.0.1:8080Tomcatapache-tomcat-9.0.74-1
127.0.0.1:8081Tomcatapache-tomcat-9.0.74-2
127.0.0.1:6379RedisRedis-x64-5.0.14.1

HJ.png

4.2 nginx+tomcat+redis部署过程

4.2.1 Redis安装部署

1 下载安装

redis.png

1)访问https://github.com/tporadowski/redis/releases地址,下载Redis-x64-5.0.14.1.zip

2)解压Redis-x64-5.0.14.1.zip文件,点击执行redis-server.exe,如图:

redis-1.png

redis-2.png

注意:如需设置访问密码,请编辑redis.windows.conf文件。如图:

redis-3.png

4.2.2 Tomcat安装部署

下载安装

tomcat-1.png

1)访问https://tomcat.apache.org/download-90.cgi地址,下载apache-tomcat-9.0.74.zip文件

2)解压apache-tomcat-9.0.74.zip文件,如图:

tomcat-2.png

3)Tomcat端口修改

apache-tomcat-9.0.74-1端口保持原值不变,修改apache-tomcat-9.0.74-2的端口,如下图:

apache-tomcat-9.0.74-2/conf/server.xml

tomcat-3.pngtomcat-4.png

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都是不一样的):

tomcat-5.pngtomcat-6.png

4.2.3 Nginx安装部署

下载安装

nginx-1.png

1)访问http://nginx.org/en/download.html链接,下载nginx-1.24.0.zip文件

2)解压nginx-1.24.0.zip文件,如图

nginx-2.png

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;
}

nginx-3.png

4)测试验证,访问:http://127.0.0.1 发现每次的sessionId都是不一样的

4.2.4 配置tomcat session共享
4.2.4.1、Add session manager

1)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>

tomcat-7.png

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" />

tomcat-8.png

3)新增redisson配置文件 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: 5000
threads: 16
nettyThreads: 32
codec: !<org.redisson.codec.MarshallingCodec> {}
transportMode: "NIO"

tomcat-9.png

4.2.4.2 下载并复制2个Jar包到Tomcat 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

tomcat-10.png

4.2.5 session共享测试验证

重启tomcat,访问:http://127.0.0.1/ 发现每次的sessionId都是一样的

tomcat-11.pngtomcat-12.png

参考资料:

https://github.com/redisson/redisson/tree/master/redisson-tomcat

https://github.com/redisson/redisson/wiki/2.-Configuration

Tomcat+redis+Redisson实现session共享http://chanpinxue.cn/archives/5694.htmlhttps://blog.csdn.net/chenyang_wei/article/details/127846656

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
域名解析 运维 负载均衡
【运维知识进阶篇】Tomcat集群实战之部署zrlog博客(Tomcat服务安装+静态资源挂载NFS+Nginx负载均衡+HTTPS证书+Redis会话保持)
【运维知识进阶篇】Tomcat集群实战之部署zrlog博客(Tomcat服务安装+静态资源挂载NFS+Nginx负载均衡+HTTPS证书+Redis会话保持)
151 1
|
4月前
|
负载均衡 Java 应用服务中间件
tomcat集群下的session共享和负载均衡(memcache实现)
tomcat集群下的session共享和负载均衡(memcache实现)
|
4月前
|
负载均衡 NoSQL Java
tomcat集群下的session共享和负载均衡(redis实现)
tomcat集群下的session共享和负载均衡(redis实现)
129 0
|
4月前
|
NoSQL Java 应用服务中间件
tomcat集群使用redis实现session共享
tomcat集群使用redis实现session共享
115 0
|
10月前
|
缓存 负载均衡 网络协议
tomcat + nginx 的 负载均衡和动静分离集群
tomcat + nginx 的 负载均衡和动静分离集群
117 0
|
应用服务中间件 nginx
Nginx & Tomcat - 集群简介
Nginx & Tomcat - 集群简介
71 0
Nginx & Tomcat - 集群简介
|
运维 Oracle 关系型数据库
Tomcat集群session复制与Oracle的坑。。
问题描述 公司某个系统使用了tomcat自带的集群session复制功能,然后后报了一个oracle驱动包里面的连接不能被序列化的异常。
128 0
|
负载均衡 网络协议 Java
基于Docker部署 Tomcat集群、 Nginx负载均衡
当作一百世一样。这里的道理很明白:我思故我在,既然我存在,就不能装作不存在。无论如何,我要为自己负起责任。——王小波《三十而立》
305 0
基于Docker部署 Tomcat集群、 Nginx负载均衡
|
负载均衡 应用服务中间件 nginx
2、Tomcat集群实战,并用Nginx实现负载均衡(win环境)
1、Tomcat的配置 1、系统环境变量配置: 首先要实现Tomcat的集群就得拥有多个tomcat,所以我在本地电脑下载了两个Tomcat,我这里使用的是Tomcat7,当然,配置与Tomcat的版本没多大关系~ image.
1039 0
|
监控 应用服务中间件 时序数据库
Grafana+Telegraf+Influxdb监控Tomcat集群方案
前言 前一段时间自家养的几只猫经常出问题,由于没有有效的监控预警手段,以至于问题出现或者许久一段时间才会被通知到。凌晨一点这个锅可谁都不想背,为此基于目前的情况搭建了以下这么一套监控预警系统。 相关软件 Nginx:代理访问 Grafana Grafana: 可视化面板(Dashboard),有.
4617 0
相关产品
云迁移中心
推荐文章
更多