zoukankan      html  css  js  c++  java
  • 基于redis实现tomcat的session会话保持 (转)

    出处: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地址来测试
  • 相关阅读:
    export环境变量 & bash shell使用命令和环境变量
    crontab定时任务
    sh脚本
    Linux的用户及权限相关
    HTTP基础
    群晖Synology
    Cntlm
    oracle存储过程
    ORACLE 增加两列字段
    excel 公式 insert 语句
  • 原文地址:https://www.cnblogs.com/guanbin-529/p/13022850.html
Copyright © 2011-2022 走看看