使用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!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章