出处:https://cloud.tencent.com/developer/article/1402997
基于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中。
架构图如下:
主机规划
主机名 |
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 <Host name="jpress.sentinel.org" appBase="webapps"' /usr/local/tomcat/conf/server.xml [root@web01-7 local]# /usr/local/tomcat/bin/startup.sh
搭建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文件中增加以下两行
//在这个<Context>标签里面配置
<Valve className="tomcat.request.session.redis.SessionHandlerValve" /> <Manager className="tomcat.request.session.redis.SessionManager" />
配置会话到期时间在$TOMCAT_HOMA/conf/web.xml
<session-config>
<session-timeout>60</session-timeout>
</session-config>
启动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 <body> <% //HttpSession session = request.getSession(true); System.out.println(session.getCreationTime()); out.println("<br> SESSION ID:" + session.getId() + "<br>"); out.println("Session created time is :" + session.getCreationTime() + "<br>"); %> </body>
测试,我们每次强刷他的sessionID都是一致的,所以我们认为他的session会话保持已经完成,你们也可以选择换个客户端的IP地址来测试