zoukankan      html  css  js  c++  java
  • 使用Tomcat基于redis的session共享机制集群部署

    常见的session集群方案:session复制和session共享

    Session复制:指session信息会在集群节点之间复制,每个节点服务上都会有相同的session信息;主要是实现后端多个节点的冗余功能。但是node之间通信频繁,响应速度有影响,多并发,高频发操作的情况下,性能存在严重问题;

    Session共享:通俗来说就是一个浏览器对应多个web服务时,服务端的session数据需要共享

    【集群环境】

    因为是在个人虚机模拟,资源有限,故tomcat和redis环境复用(Ps:软件环境需要的话,可以找到博客左边的联系方式)

    软件环境:jdk1.8.0、redis-5.0.3.tar.gz、apache-tomcat-8.0.50.tar.gz、redisson-tomcat-8-3.12.1.jar、redisson-all-3.12.1.jar

    Nginx代理端:192.168.109.100 

    Tomcat_node1/redis服务: 192.168.109.101  

    Tomcat_node2 :192.168.109.102 

    【集群部署】

     部署redis环境

    #tar xvf redis-5.0.3.tar.gz

    #cd redis-5.0.3

    #make

    #cp redis.conf /etc/

    #cd src

    #cp redis-cli redis-server redis-sentinel /usr/sbin/

    打开redis配置文件/etc/redis.conf,修改两个配置项的值为如下内容:

    #vim /etc/redis.conf

    bind 0.0.0.0
    daemonize yes

    最后,启动redis服务即可

    #/usr/sbin/redis-server /etc/redis.conf

    【部署tomcat环境】

    首先部署jdk环境

    #mkdir /usr/java

    #tar zxvf jdk1.8.0_131.tar.gz -C /usr/java/

    #vim /erc/profile

    export JAVA_HOME=/usr/java/jdk1.8.0_131
    export PATH=$PATH:$JAVA_HOME/bin
    export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH

    #source  /etc/profile

    #tar zxvf apache-tomcat-8.0.50.tar.gz -C /usr/local/
    #mv /usr/local/apache-tomcat-8.0.50/ /usr/local/tomcat8

    目前为止tomcat部署完毕,接下来整合tomcat与redis实现session共享

    此时需要部署jar包环境,可以从https://github.com/redisson/redisson/tree/master/redisson-tomcat此链接下载对应的版本。

    下载完毕之后将两个jar包解压到/usr/local/tomcat8/lib/目录下面

    #mv redis-sson-al-3.12.1.jar  redisson-tomcat-8-3.12.1.jar  /usr/local/tomcat8/lib

    #jar redis-sson-al-3.12.1.jar

    #jar redisson-tomcat-8-3.12.1.jar

    增加RedissonSessionManager配置

    # vim /usr/local/tomcat8/conf/context.xml

    <Manager className="org.redisson.tomcat.RedissonSessionManager"
        configPath="${catalina.base}/conf/redisson.json" readMode="REDIS" updateMode="DEFAULT"/>

     

     #vim  /usr/local/tomcat8/conf/redisson.json

    {
       "singleServerConfig":{
          "idleConnectionTimeout":10000,
          "connectTimeout":10000,
          "timeout":3000,
          "retryAttempts":3,
          "retryInterval":1500,
          "password":null,
          "subscriptionsPerConnection":5,
          "clientName":null,
          "address": "redis://127.0.0.1:6379",     #这里的IP地址如果是将redis和tomcat放在一起就写127.0.0.1,如果是分离部署的话,就写redis所在的主机IP
          "subscriptionConnectionMinimumIdleSize":1,
          "subscriptionConnectionPoolSize":50,
          "connectionMinimumIdleSize":32,
          "connectionPoolSize":64,
          "database":0,
          "dnsMonitoringInterval":5000
       },
       "threads":0,
       "nettyThreads":0,
       "codec":{
          "class":"org.redisson.codec.FstCodec"
       },
       "transportMode":"NIO"
    } 

    最后一步就是写一个用于访问tomcat的测试页面

    #vim /usr/local/tomcat8/webapps/ROOT/testsession.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
            String path = request.getContextPath();
            String basePath = request.getScheme() + "://"
                            + request.getServerName() + ":" + request.getServerPort()
                            + path + "/";
    %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
            <head>
                    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                    <title>Welcome to visit tomcat1</title>
            </head>
    
            <body>
            <center><h1>Welcome to visit tomcat1</h1></center>
            <center>
                    <h3>sessionId:</h3><%=session.getId()%>
                    <h3>session创建时间:</h3><%=session.getCreationTime()%>
            <center>
            </body>
    </html>

     重启tomcat服务让配置生效即可

    # /usr/local/tomcat8/bin/startup.sh

    【测试】

    在这里我们可以看到tomcat测试页面可以正常访问,登录redis客户端,我们发现,redis已经生成了session信息;

    http://192.168.109.101:8080/testsession.jsp

     配置第二个tomcat实例的话,按照上述操作步骤即可,需要注意的是tomcat测试页面要保证与109.101不冲突即可

    另外这里的redisson.json配置指定109.101上即可,因为之前将redis部署在了109.101上,此时的109.102不需要在安装redis,直接指定redis的IP即可

    [root@hostname-109102 lib]# cat  /usr/local/tomcat8/conf/redisson.json
    {
       "singleServerConfig":{
          "idleConnectionTimeout":10000,
          "connectTimeout":10000,
          "timeout":3000,
          "retryAttempts":3,
          "retryInterval":1500,
          "password":null,
          "subscriptionsPerConnection":5,
          "clientName":null,
          "address": "redis://192.168.109.101:6379",
          "subscriptionConnectionMinimumIdleSize":1,
          "subscriptionConnectionPoolSize":50,
          "connectionMinimumIdleSize":32,
          "connectionPoolSize":64,
          "database":0,
          "dnsMonitoringInterval":5000
       },
       "threads":0,
       "nettyThreads":0,
       "codec":{
          "class":"org.redisson.codec.FstCodec"
       },
       "transportMode":"NIO"
    }

     【Nginx】

     #tar zxvf nginx-1.14.2.tar.gz -C /usr/src/

    # cd /usr/src/nginx-1.14.2/

    #./configure

    --user=www
    --group=www
    --prefix=/usr/local/nginx
    --sbin-path=/usr/local/nginx/sbin/nginx
    --conf-path=/usr/local/nginx/conf/nginx.conf
    --error-log-path=/usr/local/nginx/logs/error.log
    --http-log-path=/usr/local/nginx/logs/access.log
    --pid-path=/var/run/nginx.pid
    --lock-path=/var/lock/subsys/nginx
    --with-http_stub_status_module
    --with-http_ssl_module
    --with-http_gzip_static_module
    --with-pcre
    # make
    # make install

    # ln -s /usr/local/nginx/sbin/nginx  /usr/local/sbin/

    # vim /usr/local/nginx/conf/nginx.conf

    user  www;
    worker_processes  8;
    events {
        worker_connections  65536;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
       upstream tomcat {
         server 192.168.109.101:8080 weight=1;
         server 192.168.109.102:8080 weight=1;
        }
    
        server {
            listen       80;
            server_name  localhost;
    
            location / {
                proxy_pass http://tomcat;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
            location ~ .php$ {
                root           html;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;
                include        fastcgi_params;
            }
    
        }
    }

     nginx  -s reload   #重启nginx

    Nginx配置完毕之后,通过访问192.168.109.100nginx代理端即可均衡后端两台tomcat,不停的刷新会轮训切换两个tomcat页面,但是session值并没有发生改变,而且都相同。这说明两个tomcat实例都共享了redis里面存储的session信息

    也就实现了Nginx+Tomcat+redis的session共享功能;

     

    END!

  • 相关阅读:
    趣谈多线程
    使用application manifest file
    参加一个.NET培训后的若干笔记
    遍历sql server数据库的简单方法
    为什么对继承的方法签名检查这么严格?
    Serialize Dictionary to xml using DataContractSerializer
    如何在sql中查询xml字符串
    从PowerDesigner概念设计模型(CDM)中的3种实体关系说起
    using "code coverage coloring" to help debuging
    日常工作中用到过的PowerShell指令
  • 原文地址:https://www.cnblogs.com/bixiaoyu/p/12283838.html
Copyright © 2011-2022 走看看