基于redisson实现tomcat集群session共享

目录

1、环境

2、修改server.xml

3、修改context.xml

4、新增redisson配置文件

[5、下载并复制2个Jar包到Tomcat Lib目录中](#5、下载并复制2个Jar包到Tomcat Lib目录中)

[6、 安装redis](#6、 安装redis)

7、配置nginx负载均衡

8、配置测试页面

9、session共享测试验证


前言:

上篇中,Tomcat session复制及session共享技术-CSDN博客

这个方法是官方推荐的一个方法,但是也有一定局限性,下面是使用redisson实现session共享方法。

1、环境

该tomcat部署方法在这篇博文中,本实验环境步骤基于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关闭,时间同步。

2、修改server.xml

在server.xml中配置,所有tomcat实例都配置,注意修改实例的路径

bash 复制代码
vim /data/application/tomcat1/conf/server.xml +40
bash 复制代码
    <Resource name="bean/redisson"
          auth="Container"
          factory="org.redisson.JndiRedissonFactory"
          configPath="${catalina.base}/conf/redisson.yaml"
          closeMethod="shutdown"/>

添加位置可看图:

3、修改context.xml

所有tomcat实例都配置,注意修改实例的路径

bash 复制代码
vim /data/application/tomcat1/conf/context.xml
bash 复制代码
    <ResourceLink name="bean/redisson"
      global="bean/redisson"
      type="org.redisson.api.RedissonClient" />
    <Manager className="org.redisson.tomcat.JndiRedissonSessionManager"
      readMode="REDIS"
      jndiName="bean/redisson" />

位置如下图:

4、新增redisson配置文件

bash 复制代码
# 如果redis是单独安装的,将address地址修改为对应主机地址
vim /data/application/tomcat1/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"
bash 复制代码
#给两外两个tomcat实例拷贝过去
cp /data/application/tomcat1/conf/redisson.yaml /data/application/tomcat2/conf/redisson.yaml

cp /data/application/tomcat1/conf/redisson.yaml /data/application/tomcat3/conf/redisson.yaml

5、下载并复制2个Jar包到Tomcat Lib目录中

bash 复制代码
​cd /root/
wget https://repo1.maven.org/maven2/org/redisson/redisson-all/3.22.0/redisson-all-3.22.0.jar
wget https://repo1.maven.org/maven2/org/redisson/redisson-tomcat-8/3.22.0/redisson-tomcat-8-3.22.0.jar

​

拷贝到lib库中

bash 复制代码
cp /root/redisson-all-3.22.0.jar /data/application/tomcat1/lib
cp /root/redisson-all-3.22.0.jar /data/application/tomcat2/lib
cp /root/redisson-all-3.22.0.jar /data/application/tomcat3/lib

cp /root/redisson-tomcat-8-3.22.0.jar /data/application/tomcat1/lib
cp /root/redisson-tomcat-8-3.22.0.jar /data/application/tomcat2/lib
cp /root/redisson-tomcat-8-3.22.0.jar /data/application/tomcat3/lib

6、 安装redis

bash 复制代码
#下载redis
cd && wget http://download.redis.io/releases/redis-5.0.10.tar.gz

#解压
tar xzf redis-5.0.10.tar.gz -C /data/application/

cd /data/application/ && mv redis-5.0.10/ redis
bash 复制代码
#下载编译工具
cd redis/ && yum install -y gcc make

#编译   注:如果报错请将刚才解压的安装包删除掉,再次重新解压并进行make安装即可。
make
bash 复制代码
cp redis.conf redis.conf.bak

vim redis.conf 
bash 复制代码
#修改如下
bind 0.0.0.0                       #只监听内网IP,大约在69行
daemonize yes                   #开启后台模式将on改为yes,大约在136行
timeout 300                    #连接超时时间,大约在113行
port 6379                           #端口号,大约在96行
dir /data/application/redis/data  #本地数据库存放持久化数据的目录该目录-----需要存在,大约在263行
pidfile /var/run/redis_6379.pid   #定义pid文件,大约在158行
logfile "/var/log/redis.log"        #定义log文件,大约在171行
bash 复制代码
#创建存放数据的目录
mkdir /data/application/redis/data
bash 复制代码
#配置redis为systemctl启动
cd /lib/systemd/system

vim redis.service

添加下述内容

bash 复制代码
[Unit]
Description=Redis
After=network.target

[Service]
ExecStart=/data/application/redis/src/redis-server /data/application/redis/redis.conf  --daemonize no
ExecStop=/data/application/redis/src/redis-cli -h 127.0.0.1 -p 6379 shutdown

[Install]
WantedBy=multi-user.target
bash 复制代码
#启动redis
systemctl restart redis

7、配置nginx负载均衡

由于本实验是基于Tomcat多实例配置-CSDN博客

因此,nginx负载均衡是已经配置好了得,这里再打开验证一下

8、配置测试页面

所有tomcat实例都配置,注意修改实例的路径

bash 复制代码
vim /data/application/tomcat1/webapps/ROOT/session.jsp

#加入下述内容

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");%>

注意端口来区分不同实例

9、session共享测试验证

http://192.168.226.20/session.jsp

对比访问可以发现,即便后端服务器改变,session也不会再变化了。

基于Redis的Session共享解决了以下几个主要问题:

  1. 横向扩展和负载均衡:在传统的Web应用中,为了处理大量请求和保证高可用性,通常会使用多台服务器来横向扩展应用。然而,会话(Session)状态通常保存在单个服务器的内存中,这就导致了当请求被负载均衡到不同服务器时,会话状态无法被共享,用户需要重新登录或者状态丢失。使用Redis作为会话存储后,不同服务器上的应用实例可以通过Redis共享同一份会话数据,从而实现了跨服务器的会话共享,保证了用户的无缝访问体验。

  2. 内存利用率提升:传统的会话管理方式是将会话状态存储在每个应用服务器的内存中。随着应用服务器数量的增加,会话状态的内存占用也会成倍增加,而且每个服务器的内存使用不均可能导致资源浪费。将会话状态存储在Redis等专门的内存数据库中,可以有效地减少每个应用服务器的内存压力,提高内存利用率。

  3. 会话持久化和可靠性:Redis支持将数据持久化到磁盘,可以配置成持久化到磁盘的数据库中,从而保证会话数据的可靠性。即使应用服务器重启或者故障,用户的会话状态也可以得到恢复,不会丢失,提升了应用的可靠性和容错性。

  4. 分布式应用的统一管理:对于分布式、微服务架构的应用来说,使用统一的会话存储可以简化管理和维护工作。开发人员无需在多个服务或多个服务器上分别管理会话状态,统一的存储和管理会话状态可以降低复杂度,提高开发和维护效率。

综上所述,基于Redis的Session共享通过提供可靠的分布式存储解决方案,解决了传统会话管理中的单点故障、内存浪费和管理复杂度等问题,是构建高性能、可伸缩性和可靠性Web应用的重要手段之一。

相关推荐
Code apprenticeship2 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站2 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
装不满的克莱因瓶2 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
黄名富5 小时前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
G_whang6 小时前
centos7下docker 容器实现redis主从同步
redis·docker·容器
.生产的驴6 小时前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven
我叫啥都行10 小时前
计算机基础复习12.22
java·jvm·redis·后端·mysql
阿乾之铭10 小时前
Redis四种模式在Spring Boot框架下的配置
redis
on the way 12312 小时前
Redisson锁简单使用
redis
科马13 小时前
【Redis】缓存
数据库·redis·spring·缓存