基于redis实现tomcat的session会话保持

在实际生产中,我们经常部署应用服务,在部署的过程中,要让用户无感知你的应用升级,这种方式可以通过负载均衡方式来实现灰度部署,如前些文章的Nginx方式来实现,通过负载均衡Nginx,更新某一台tomcat服务,再通知负载均衡Nginx,把Tomcat节点重新加载上去。依次这么做,把集群中的所有Tomcat都替换一次即可,就可以实现服务的灰度部署。

如何让用户无感知?就是要实现用户的会话是可以共享的,基于session共享的方式有如下几种:

1,使用数据库来存储session
2,使用cookie来存储session
3,使用redis来存储session
4,使用tomcat的session复制
5,使用mamcached来存储session

我们这里主讲解redis的方式来实现Tomcat的session共享。

我们的例子使用了一台Nginx做负载均衡,后端挂接了两台Tomcat,且每台Tomcat的Session会话都保存到Redis数据库中。其中,Nginx配置为non-sticky运行模式,也即每一个请求都可以被分配到集群中的任何节点。当要上线新代码时,只需简单地取下Tomcat实例,此时所有的访问用户会被路由到活动的Tomcat实例中去,而且由于会话数据都是保存在redis数据库中,所以活跃用户并不会受影响。当Tomcat更新完毕,又可以把此节点加入到Nginx中。

架构图如下:
基于redis实现tomcat的session会话保持_第1张图片
主机规划

主机名 IP地址 服务
lb01-5 10.0.0.5,172.16.1.5 nginx-1.14
web01-7 172.16.1.7 Tomcat-9.0
web02-8 172.16.1.8 Tomcat-9.0
db01-51 172.16.1.51 Redis-3.2

在两台web上安装tomcat

//安装java环境
[root@web01-7 local]# yum -y install java
//下载tomcat安装包
[root@web01-7 local]# wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-9/v9.0.12/bin/apache-tomcat-9.0.12.tar.gz
[root@web01-7 local]# tar xf apache-tomcat-9.0.12.tar.gz
[root@web02-8 local]# mv apache-tomcat-9.0.12 tomcat
[root@web01-7 local]# echo "export CATALINA_HOME=/usr/local/tomcat" >> /etc/profile
[root@web01-7 local]# source /etc/profile
[root@web01-7 local]# sed -i '/Host name=/c   

搭建redis
安装redis,编写配置文件

[root@db01-51 ~]# cat /usr/local/redis/conf.d/master.conf 
bind 172.16.1.51 127.0.0.1
protected-mode yes
daemonize yes
dir /redis_data
dbfilename dump.rdb
save 900 1
save 300 10
save 60 10000
requirepass 123123
[root@db01-51 ~]# redis-server /usr/local/redis/conf.d/master.conf 
[root@db01-51 ~]# netstat -ntalp | grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      1173/redis-server 1 
tcp        0      0 172.16.1.51:6379        0.0.0.0:*               LISTEN      1173/redis-server 1

基础环境搭建完成之后我们开始正常的进行session会话保持
1,通过TomcatClusterRedisSessionManager,这种方式支持redis3.0的集群方式

下载TomcatRedisSessionManager-2.0.zip包,https://github.com/ran-jit/tomcat-cluster-redis-session-manager,放到$TOMCAT_HOMA/lib下,并解压

[root@web01-7 local]# cd tomcat/lib/
[root@web01-7 lib]# wget https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/download/2.0.4/tomcat-cluster-redis-session-manager.zip
[root@web01-7 lib]# unzip tomcat-cluster-redis-session-manager.zip 
Archive:  tomcat-cluster-redis-session-manager.zip
   creating: tomcat-cluster-redis-session-manager/conf/
  inflating: tomcat-cluster-redis-session-manager/conf/redis-data-cache.properties  
   creating: tomcat-cluster-redis-session-manager/lib/
  inflating: tomcat-cluster-redis-session-manager/lib/commons-logging-1.2.jar  
  inflating: tomcat-cluster-redis-session-manager/lib/commons-pool2-2.4.2.jar  
  inflating: tomcat-cluster-redis-session-manager/lib/jedis-2.9.0.jar  
  inflating: tomcat-cluster-redis-session-manager/lib/tomcat-cluster-redis-session-manager-2.0.4.jar  
  inflating: tomcat-cluster-redis-session-manager/readMe.txt 

拷贝解压文件中lib文件到$TOMCAT_HOMA/lib下

[root@web01-7 lib]# cp tomcat-cluster-redis-session-manager/lib/* ./

拷贝redis-data-cache.properties到$TOMCAT_HOMA/conf文件下

[root@web01-7 lib]# cp tomcat-cluster-redis-session-manager/conf/redis-data-cache.properties ../conf/

[root@web01-7 lib]# cat ../conf/redis-data-cache.properties     
//远端redis数据库的地址和端口
redis.hosts=172.16.1.51:6379
//远端redis数据库的连接密码
#- redis password (for stand-alone mode)
redis.password=123123
//是否支持集群,默认的是关闭
#- set true to enable redis cluster mode
redis.cluster.enabled=false
//连接redis的那个库
#- redis database (default 0)
#redis.database=0
//连接超时时间
#- redis connection timeout (default 2000)
#redis.timeout=2000

在$TOMCAT_HOMA/conf/context.xml文件中增加以下两行

//在这个标签里面配置

配置会话到期时间在$TOMCAT_HOMA/conf/web.xml


60

启动tomcat服务

[root@web01-7 lib]# /usr/local/tomcat/bin/startup.sh 

然后web01和web07配置是一模一样

在$TOMCAT_HOMA/webapps/ROOT里面编写一个配置文件tt.jsp文件

[root@web01-7 ROOT]# cat /usr/local/tomcat/webapps/ROOT/tt.jsp 

<%
//HttpSession session = request.getSession(true);
System.out.println(session.getCreationTime());
out.println("
SESSION ID:" + session.getId() + "
"); out.println("Session created time is :" + session.getCreationTime() + "
"); %>

测试,我们每次强刷他的sessionID都是一致的,所以我们认为他的session会话保持已经完成,你们也可以选择换个客户端的IP地址来测试
基于redis实现tomcat的session会话保持_第2张图片