Tomcat Session( 複製 綁定 redis memcached)

實驗的前面步驟css

[root@localhost ~]# cat /etc/hosts
192.168.200.111 nginx
192.168.200.112 node1
192.168.200.113 node2
[root@localhost ~]# iptables -F
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0html

Nginx 服務器配置:
配置主機名:
[root@localhost ~]# hostname nginx
[root@localhost ~]# bashjava

[root@nginx ~]# yum -y install pcre-devel zlib-devel openssl-devel
[root@nginx ~]# useradd -s /sbin/nologin -M nginx
[root@nginx ~]# tar xf nginx-1.15.9.tar.gz -C /usr/src/
[root@nginx ~]# cd /usr/src/nginx-1.15.9/
[root@nginx ~]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module && make && make installnode

--prefix=/usr/local/nginx #指定安裝目錄
--user=nginx --group=nginx #指定運行的用戶和組
--with-file-aio #啓用文件修改支持
--with-http_stub_status_module #啓用狀態統計
--with-http_ssl_module #啓用ssl模塊
--with-http_flv_module #啓用flv模塊,提供尋求內存使用基於時間的偏移量文件
--with-http_gzip_static_module #啓用gzip靜態壓縮
nginx

 

建立軟鏈接
[root@nginx ~]# ln -s /usr/local/nginx/sbin/nginx /sbin/web

在nginx主配置文件加上內容
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
34 upstream tomcat_pool {
35 server 192.168.200.112:8080 weight=1 max_fails=1 fail_timeout=10s;
36 server 192.168.200.113:8080 weight=1 max_fails=1 fail_timeout=10s;
37 }
38
39 server {
40 listen 80;
41 server_name localhost;
42 charset utf-8;
43
44 location / {
45 root html;
46 index index.html index.htm;
47 proxy_pass http://tomcat_pool;
48 }
[root@nginx ~]# nginxredis

 

配置主機名:
[root@localhost ~]# hostname node1 另一臺機器配置爲node2
[root@localhost ~]# bash
安裝配置Tomcat
解壓apache-tomcat-7.0.54.tar.gz 包
[root@tomcat1 ~]# tar xf apache-tomcat-7.0.54.tar.gz 算法

解壓後生成apache-tomcat-7.0.54文件夾,將該文件夾移動到/usr/local下,並更名爲tomcat
[root@tomcat1 ~]# mv apache-tomcat-7.0.54 /usr/local/tomcatapache

啓動Tomcat
[root@tomcat1 ~]# /usr/local/tomcat/bin/startup.sh vim

Tomcat 默認運行在8080端口
[root@tomcat1 ~]# netstat -anpt |grep :8080
tcp 0 0 :::8080 :::* LISTEN 3318/java
瀏覽器訪問測試 http://192.168.200.112:8080
瀏覽器訪問測試 http://192.168.200.113:8080

創建session.jsp的測試頁面
[root@node1 ~]# vim /usr/local/tomcat/webapps/ROOT/session.jsp
Session ID:<%= session.getId() %><BR>
SessionPort:<%= request.getServerPort() %>
<% out.println("This tomcat server 192.168.200.112");%>

[root@node2 ~]# vim /usr/local/tomcat/webapps/ROOT/session.jsp
Session ID:<%= session.getId() %><BR>
SessionPort:<%= request.getServerPort() %>
<% out.println("This tomcat server 192.168.200.113");%>
從新啓動Tomcat
[root@node1 ~]# /usr/local/tomcat8/bin/shutdown.sh
[root@node1 ~]# /usr/local/tomcat8/bin/startup.sh


解決方案一:Session綁定
Session綁定能夠利用負載均衡的源地址Hash(ip_hash)算法實現。負載均衡服務器老是未來源於同一個IP的請求分發到同一臺服務器上,也能夠根據Cookie信息將同一個用戶的請求老是分發到同一臺服務器上。固然這時負載均衡服務器必須工做在HTTP協議層上。這樣整個會話期間,用戶全部的請求都在同一臺服務器上處理,即Session綁定在某臺特定服務器上,保證Session總能在這臺服務器上獲取。這種方法又被稱爲會話黏滯。如圖所示。配置全部機器:
Session綁定:
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
34 upstream tomcat_pool {
35 ip_hash;
36 server 192.168.200.112:8080 weight=1 max_fails=1 fail_timeout=10s;
37 server 192.168.200.113:8080 weight=1 max_fails=1 fail_timeout=10s;
38 }
[root@nginx ~]# killall -HUP nginx

用戶訪問測試只被分配到一臺機器上
瀏覽器訪問測試 http://192.168.200.111/session.jsp
Session ID:8A414FF6B996C21DA32C01CFB9F99588
SessionPort:80 This tomcat server 192.168.200.113
方法二,
Session複製:
Tomcat支持Session集羣,可在各Tomcat服務器間複製所有session信息,當後端一臺Tomcat服務器宕機後,Nginx從新調度用戶請求分配到另一臺服務器,客戶端可從另外一臺Tomcat服務上獲取用戶的session信息。

Session集羣可在Tomcat服務器規模(通常10臺如下)不大時使用,不然會致使Session複製時性能代價太高;

Session複製:
Tomcat支持Session集羣,可在各Tomcat服務器間複製所有session信息,當後端一臺Tomcat服務器宕機後,Nginx從新調度用戶請求分配到另一臺服務器,客戶端可從另外一臺Tomcat服務上獲取用戶的session信息。

Session集羣可在Tomcat服務器規模(通常10臺如下)不大時使用,不然會致使Session複製時性能代價太高;


[root@node1 tomcat]# vim /usr/local/tomcat/conf/server.xml
將Engine這一行修改成:
<!--<Engine name="Catalina" defaultHost="localhost">-->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1"> #tomcat2 配置爲jvmRoute="node2"

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> #去掉註釋

[root@node1 ~]# tail -2 /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml
<distributable/> #添加內容
</web-app>
從新啓動Tomcat
[root@node1 ~]# /usr/local/tomcat8/bin/shutdown.sh
[root@node1 ~]# /usr/local/tomcat8/bin/startup.sh
測試 ip和名字變,id不變  去掉nginx主配置文件裏的ip_hash
http://192.168.200.111/session.jsp
Session ID:ECF41BB90A2CC778062173689D58FB61.node2
SessionPort:80 This tomcat server 192.168.200.113

方法三:
Session服務器之Memcached
兩臺tomcat上安裝Memcached
[root@node1 ~]# yum -y install libevent memcached

[root@node1 ~]# memcached -u root -m 512M -n 10 -f 2 -d -vvv -c 512

選項:
-h #查看幫助信息
-p #指定memcached監聽的端口號默認11211
-l #memcached服務器的ip地址
-u #memcached程序運行時使用的用戶身份必須是root用戶
-m #指定使用本機的多少物理內存存數據默認64M
-c #memcached服務的最大連接數
-vvv #顯示詳細信息
-n #chunk size 的最小空間是多少單位字節
-f #chunk size大小增加的倍數默認 1.25倍
-d #在後臺啓動


(檢測memecached是否存活,memcacehd 端口爲11211)
[root@node1 ~]# netstat -antp| grep :11211
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 73902/memcached
tcp6 0 0 :::11211 :::* LISTEN 73902/Memcached

測試memcached 可否存取數據
[root@node1 ~]# yum -y install telnet
[root@node1 ~]# telnet 192.168.200.112 11211
set username 0 0 8
zhangsan
STORED
get username
VALUE username 0 8
zhangsan
END
quit
Connection closed by foreign host.

最後執行讓Tomcat-1 Tomcat-2 經過(msm)鏈接到Memcached
將session包中的「*.jar複製到/usr/local/tomcat/lib/ 下面 jar包本身上傳
[root@node1 ~]# cp session/* /usr/local/tomcat/lib/

編輯tomcat 配置文件鏈接指定的 memcached服務器,兩臺tomcat配置同樣
[root@node1 ~]# vim /usr/local/tomcat/conf/context.xml
<Context>
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="memA:192.168.200.112:11211 memB:192.168.200.113:11211"
requestUrilgnorePattern=".*\(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
[root@node1 ~]# /usr/local/tomcat/bin/shutdown.sh
[root@node1 ~]# /usr/local/tomcat/bin/startup.sh

測試:
http://192.168.200.111/session.jsp
Session ID:C717C17EA67E75683637E2026592A7D9-memB
SessionPort:80 This tomcat server 192.168.200.113

循環刪除
ls session/ | while read line ; do rm -rf /usr/local/tomcat8/lib/$line; done

方法四:
Session服務器之Redis
Redis與Memcached的區別
內存利用率:使用簡單的key-value(鍵值對)存儲的話,Memcached的內存利用率更高,而若是Redis採用hash結構來作key-value存儲,因爲其組合式的壓縮,其內存利用率會高於Memcached。
性能對比:因爲Redis只使用單核,而Memcached可使用多核,因此平均每個核上Redis在存儲小數據時比Memcached性能更高。而在100k以上的數據中,Memcached性能要高於Redis,雖然Redis最近也在存儲大數據的性能上進行優化,可是比起Memcached,仍是稍有遜色。
Redis支持數據的持久化,能夠將內存中的數據保持在磁盤中,重啓的時候能夠再次加載進行使用
Redis支持數據的備份,即master-slave模式的數據備份。
Redis不只僅支持簡單的key-Value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。


安裝部署redis
[root@node1 ~]# tar xf redis-3.2.5.tar.gz -C /usr/src/
[root@node1 ~]# cd /usr/src/redis-3.2.5/
[root@node1 redis-3.2.5]# make

這裏若是報錯:tclsh8.5: not found 發現少了tcl 報錯,則安裝tcl
wget http://downloads.sourceforge.net/tcl/tcl8.5.9-src.tar.gz
cd /tcl8.5.9-src/unix
./configure
make && make install

接着make就沒報錯了
[root@node1 redis-3.2.5]# mkdir -p /usr/local/redis/{bin,etc,var}
[root@node1 redis-3.2.5]# cd src/
src目錄下這些文件做用以下
redis-server:Redis服務器的daemon啓動程序
redis-cli:Redis命令行操做工具.你也能夠用telnet根據其純文本協議來操做
redis-benchmark:Redis性能測試工具,測試Redis在你的系統及你的配置下的讀寫性能
redis-stat:Redis狀態檢測工具,能夠檢測Redis當前狀態參數及延遲情況
[root@node1 src]# cp redis-benchmark redis-check-aof redis-cli redis-server /usr/local/redis/bin/
[root@node1 redis-3.2.5]# cp redis.conf /usr/local/redis/etc
[root@node1 redis-3.2.5]# vim /usr/local/redis/etc/redis.conf //修改配置文件
daemonize no 改成 daemonize yes //是否把redis-server啓動在後臺,默認是「否」。若改爲yes,會生成一個pid文件
bind 127.0.0.1 改成 bind 0.0.0.0 //任意主機均可訪問
其餘的看須要修改
關閉redis:
[root@node1 redis-3.2.5]# killall -9 redis-server
啓動redis:
[root@node1 redis-3.2.5]# /usr/local/redis/bin/redis-searver /usr/local/redis/etc/redis.conf
查看是否啓動:
[root@node1 redis-3.2.5]# netstat -anpt |grep redis
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 77526/redis-server

 

監控能夠不作:

監控redis共享session:
[root@node1 redis-3.2.5]# /usr/local/redis/bin/redis-cli -p 6379 monitor
1555299973.187326 [0 192.168.200.113:44980] "EXPIRE" "29C6E0F087C504F4C90BBEAE924F20DD" "1800"
1555299973.440488 [0 192.168.200.112:64702] "GET" "29C6E0F087C504F4C90BBEAE924F20DD"
1555299973.441966 [0 192.168.200.112:64702] "EXPIRE" "29C6E0F087C504F4C90BBEAE924F20DD" "1800"
1555299976.826974 [0 192.168.200.112:64702] "PING"

 

mkdir建立一個文件,cp哪一個文件就能夠了

將tomcat須要調用redis的jar包放入tomcat/lib
[root@node1 redis-3.2.5]# cp tomcat-redis-session-manage-tomcat7.jar tomcat-juli.jar commons-logging-1.1.3.jar commons-pool2-2.2.jar jedis-2.5.2.jar /usr/local/tomcat/lib
修改context.xml文件以支持調用redis
[root@node1 redis-3.2.5]# vim /usr/local/tomcat/conf/context.xml
在Context段中加入如下內容
<Context>
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="192.168.200.112" //redis的IP地址
port="6379" //redis的端口
database="0"
maxInactiveInterval="60" />
</Context>
[root@node1 ~]# /usr/local/tomcat/bin/shutdown.sh
[root@node1 ~]# /usr/local/tomcat/bin/startup.sh

[root@node1 redis-session]# netstat -anpt | grep :6379
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 77526/redis-server
tcp 0 0 192.168.200.112:6379 192.168.200.113:44980 ESTABLISHED 77526/redis-server
tcp 0 0 192.168.200.112:6379 192.168.200.112:64702 ESTABLISHED 77526/redis-server
tcp 0 0 127.0.0.1:6379 127.0.0.1:14038 ESTABLISHED 77526/redis-server
tcp 0 0 127.0.0.1:14038 127.0.0.1:6379 ESTABLISHED 77537/redis-cli
tcp6 0 0 192.168.200.112:64702 192.168.200.112:6379 ESTABLISHED 77664/java

[root@node2 ~]# netstat -anpt | grep :6379tcp6 0 0 192.168.200.113:44982 192.168.200.112:6379 ESTABLISHED 73229/java

相關文章
相關標籤/搜索