常見的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!