一贷帮、前言
tomcat集群會話保持方式大體可以分為三種:
1透乾、session sticky:利用前端調(diào)度器的負(fù)載均衡算法(如:ip_hash)實(shí)現(xiàn)session sticky,將來自同一個源Ip的會話負(fù)載到同一個后端服務(wù)器上虚缎。但是此方法的缺點(diǎn)在于章钾,有可能會導(dǎo)致某個后端服務(wù)器負(fù)載過高,而其他后端服務(wù)器負(fù)載很低的情況出現(xiàn)艺演,
2却紧、session cluster:通過定義tomcat集群節(jié)點(diǎn),將會話共享同步到所有tomcat節(jié)點(diǎn)胎撤,使用一個連接會話不管調(diào)度到哪個后端服務(wù)器都能找到其對應(yīng)的會話記錄晓殊。但是此方法在于不適用于大規(guī)模的集群,因?yàn)楫?dāng)集群規(guī)模很大的時候伤提, 需要同步的session信息將是巨量巫俺。此時session的復(fù)制同步有可能會成為影響系統(tǒng)性能的瓶頸。
3肿男、session server:通過會話服務(wù)器來保存session介汹。tomcat可以結(jié)合memcache,將session保存到memcache服務(wù)器上舶沛,然后后端服務(wù)器通過在memcache服務(wù)器上讀取session信息來實(shí)現(xiàn)會話保持嘹承。
二、Session Sticky配置示例
Session Sticky的配置原理為在前端director上應(yīng)用相應(yīng)的調(diào)度算法來實(shí)現(xiàn)會話保持如庭,如使用Nginx調(diào)度時叹卷,設(shè)置使用ip_hash算法進(jìn)行調(diào)度。
1柱彻、配置TomcatA服務(wù)器
#自行下載jdk和tomcat的源碼包并防止在/usr/local/src目錄下
#編譯安裝jdk
[root@tomcatA ~]# cd /usr/local/src/
[root@tomcatA src]# tar xf jdk-10.0.1_linux-x64_bin.tar.gz
[root@tomcatA src]# ln -sv /usr/local/src/jdk-10.0.1 /usr/local/jdk
‘/usr/local/jdk’ -> ‘/usr/local/src/jdk-10.0.1’
[root@tomcatA src]# vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
[root@tomcatA src]# source /etc/profile.d/jdk.sh
[root@tomcatA src]# java -version
java version "10.0.1" 2018-04-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)
#編譯安裝tomcat
[root@tomcatA src]# tar xf apache-tomcat-7.0.88.tar.gz
[root@tomcatA src]# ln -sv /usr/local/src/apache-tomcat-7.0.88 /usr/local/tomcat
‘/usr/local/tomcat’ -> ‘/usr/local/src/apache-tomcat-7.0.88’
[root@tomcatA src]# vim /etc/profile.d/tomcat.sh
export TOMCAT_HOME=/usr/local/tomcat
export PATH=$TOMCAT_HOME/bin:$PATH
[root@tomcatA src]# source /etc/profile.d/tomcat.sh
#添加tomcat測試頁面
[root@tomcatA src]# mkdir -pv /usr/local/tomcat/webapps/test/{WEB-INF,META-INF,classes,lib}
mkdir: created directory ‘/usr/local/tomcat/webapps/test’
mkdir: created directory ‘/usr/local/tomcat/webapps/test/WEB-INF’
mkdir: created directory ‘/usr/local/tomcat/webapps/test/META-INF’
mkdir: created directory ‘/usr/local/tomcat/webapps/test/classes’
mkdir: created directory ‘/usr/local/tomcat/webapps/test/lib’
[root@tomcatA src]# vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA.example.com</h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("example.com","example.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html
#啟動tomcat服務(wù)
[root@tomcatA src]# /usr/local/tomcat/bin/catalina.sh start
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@tomcatA src]# systemctl stop firewalld
[root@tomcatA src]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@tomcatA src]# setenforce 0
2豪娜、配置TomcatB服務(wù)器
TomcatB服務(wù)器配置大體與TomcatA服務(wù)器差不多,只需修改index.jsp的內(nèi)容為如下哟楷,其余的配置參考TomcatA的配置即可瘤载。
[root@tomcatB src]# vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" %>
<html>
<head><title>TomcatB</title></head>
<body>
<h1><font color="green">TomcatB.example.com</h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("example.com","example.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html
3、配置Nginx調(diào)度器
#安裝Nginx服務(wù)
[root@director ~]# yum install -y epel-release
[root@director ~]# yum install -y nginx
#修改nginx服務(wù)的配置文件
[root@director ~]# vim /etc/nginx/nginx.conf
include /etc/nginx/conf.d/*.conf;
upstream tomcatsrvs { #配置tomcat server的upstream服務(wù)器組并設(shè)置調(diào)度算法為ip_hash
server 192.168.0.83:8080;
server 192.168.0.84:8080;
ip_hash;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
location / {
proxy_pass http://tomcatsrvs; #將連接會話反代到tomcat server
index index.jsp;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
#啟動nginx服務(wù)
[root@director ~]# systemctl start nginx
[root@director ~]# systemctl stop firewalld
[root@director ~]# systemctl disable firewalld
[root@director ~]# setenforce 0
4卖擅、配置結(jié)果
此時使用同一個IP多次訪問http://192.168.0.81/test/ director會把連接會話調(diào)度到同一個服務(wù)器上去處理鸣奔,從而實(shí)現(xiàn)會話的保持綁定墨技。
三、Session Cluster配置示例
Session Sticky固然可以實(shí)現(xiàn)會話的保持綁定挎狸,但是當(dāng)容易導(dǎo)致后端服務(wù)器負(fù)載不均衡的情況出現(xiàn)扣汪。此時在服務(wù)器規(guī)模不大的情況下,可以使用Session Cluster來實(shí)現(xiàn)會話的保持锨匆。在Session Sticky配置的拓?fù)洵h(huán)境下崭别,我們來配置實(shí)現(xiàn)Session Cluster。
1恐锣、修改Nginx 調(diào)度器
#注釋掉ip_hash算法茅主,使用默認(rèn)的輪詢算法進(jìn)行負(fù)載均衡
[root@director ~]# vim /etc/nginx/nginx.conf
upstream tomcatsrvs {
server 192.168.0.83:8080;
server 192.168.0.84:8080;
# ip_hash;
}
#重載nginx服務(wù)
[root@director ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@director ~]# nginx -s reload
2、修改Tomcat A配置
#在server.xml的<Host> 到</Host>之間添加下述配置
[root@tomcatA src]# vim /usr/local/tomcat/conf/server.xml
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.10.0.4" #此處配置為集群的同步廣播地址土榴,集群內(nèi)的主機(jī)需一致
port="45564"
frequency="500"
dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto" #注意此選項(xiàng)默認(rèn)是auto,可配置為每個節(jié)點(diǎn)自己的ip地址诀姚,用于接收session心跳信息。
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
#配置test頁面的web.xml
[root@tomcatA src]# cp /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml /usr/local/tomcat/webapps/test/WEB-INF/web.xml
[root@tomcatA src]# vim /usr/local/tomcat/webapps/test/WEB-INF/web.xml
# 在 <web-app> 中添加
<distributable/>
#重啟tomcat服務(wù)
[root@tomcatA src]# catalina.sh stop
[root@tomcatA src]# catalina.sh start
按照同樣的步驟配置TomcatB服務(wù)器玷禽。
3赫段、配置結(jié)果
配置重啟后,在/usr/local/tomcat/logs/目錄中相應(yīng)的catalina日志中可看到下述的同步心跳信息的日志矢赁。
此時使用同一個IP多次訪問http://192.168.0.81/test/ 其sessionid均不會改變糯笙,因此后端的tomcat服務(wù)器會通過session cluster 同步相應(yīng)的session,以確保不管前端調(diào)度器把會話調(diào)度到哪個后端服務(wù)器撩银,均能匹配到同一個session會話炬丸。
四、Session Server配置示例
使用Session Server memcached來使得tomcat保持會話需要借助tomcat的msm模塊蜒蕾,并下載相應(yīng)的jar包(javolution稠炬、memcached-session-manager-tc7、spymemcached咪啡、memcached-session-manager首启、msm-javolution-serializer,注意相關(guān)包需要與tomcat版本相一致)撤摸,然后放置在/usr/local/tomcat/lib目錄下毅桃,以支持msm功能,相關(guān)的包均可以百度谷歌下載到准夷。
在之前的拓?fù)涞幕A(chǔ)上钥飞,增加兩個memcached服務(wù)器作為Session Server。
1衫嵌、配置memcached服務(wù)器
#分別在兩個memcached服務(wù)器上安裝memcached服務(wù)
[root@memcachedA ~]# yum install -y memcached
#啟動memcached服務(wù)
[root@memcachedA ~]# systemctl start memcached
#觀察看到11211端口啟用的話读宙,說明memcached服務(wù)啟動正常
[root@memcachedA ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:11211 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::11211 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
2、修改配置tomcatA
#確保下載了指定的jar包
[root@tomcatA ~]# cd /usr/local/tomcat/lib/
[root@tomcatA lib]# ll
total 8116
.....
-rw-r--r--. 1 root root 395195 Jun 18 21:30 javolution-5.5.1.jar
.....
-rw-r--r--. 1 root root 167266 Jun 18 21:30 memcached-session-manager-2.3.0.jar
-rw-r--r--. 1 root root 11704 Jun 18 21:30 memcached-session-manager-tc7-2.3.0.
-rw-r--r--. 1 root root 70012 Jun 18 21:30 msm-javolution-serializer-2.1.1.jar
....
-rw-r--r--. 1 root root 407912 Jun 18 21:30 spymemcached-2.7.3.jar
....
#把此前在 /usr/local/tomcat/conf/server.xml 的<Host> </Host>中添加的內(nèi)容修改為下述內(nèi)容
[root@tomcatA ~]# vim /usr/local/tomcat/conf/server.xml
<Context path="/test" docBase="/usr/local/tomcat/webapps/test" reloadable="true">
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.0.87:11211,n2:192.168.0.89:11211" #指定session server
failoverNodes="n2" #把n2作為failover節(jié)點(diǎn)楔绞,優(yōu)先使用n1作為session server
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
/>
</Context>
#重啟tomcat服務(wù)
[root@tomcatA ~]# catalina.sh stop
[root@tomcatA ~]# catalina.sh start
3结闸、修改配置tomcatB
#確保下載了指定的jar包
[root@tomcatB ~]# cd /usr/local/tomcat/lib/
[root@tomcatB lib]# ll
total 8116
.....
-rw-r--r--. 1 root root 395195 Jun 18 21:30 javolution-5.5.1.jar
.....
-rw-r--r--. 1 root root 167266 Jun 18 21:30 memcached-session-manager-2.3.0.jar
-rw-r--r--. 1 root root 11704 Jun 18 21:30 memcached-session-manager-tc7-2.3.0.
-rw-r--r--. 1 root root 70012 Jun 18 21:30 msm-javolution-serializer-2.1.1.jar
....
-rw-r--r--. 1 root root 407912 Jun 18 21:30 spymemcached-2.7.3.jar
....
#把此前在 /usr/local/tomcat/conf/server.xml 的<Host> </Host>中添加的內(nèi)容修改為下述內(nèi)容
[root@tomcatB ~]# vim /usr/local/tomcat/conf/server.xml
<Context path="/test" docBase="/usr/local/tomcat/webapps/test" reloadable="true">
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.0.87:11211,n2:192.168.0.89:11211" #指定session server
failoverNodes="n1" #把n1作為failover節(jié)點(diǎn)唇兑,優(yōu)先使用n2作為session server
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
/>
</Context>
#重啟tomcat服務(wù)
[root@tomcatB ~]# catalina.sh stop
[root@tomcatB ~]# catalina.sh start
4、配置結(jié)果
配置完成后桦锄,此時同一個Ip多次訪問http://192.168.0.81/test 會能正常輪詢到后端兩個服務(wù)器扎附,并且其sessionid不變。這是因?yàn)閠omcat server把session保存至了memcached服務(wù)器中结耀,并從中讀取相關(guān)的記錄來匹配會話留夜。
https://github.com/magro/memcached-session-manager
- 文/潘曉璐 我一進(jìn)店門蜂厅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匪凡,“玉大人,你說我怎么就攤上這事掘猿〔∮危” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵稠通,是天一觀的道長衬衬。 經(jīng)常有香客問我,道長改橘,這世上最難降的妖魔是什么滋尉? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮飞主,結(jié)果婚禮上狮惜,老公的妹妹穿的比我還像新娘。我一直安慰自己碌识,他們只是感情好碾篡,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著筏餐,像睡著了一般开泽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上魁瞪,一...
- 文/蒼蘭香墨 我猛地睜開眼滩租,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了利朵?” 一聲冷哼從身側(cè)響起律想,我...
- 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绍弟,沒想到半個月后技即,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡樟遣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年而叼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豹悬。...
- 正文 年R本政府宣布伤柄,位于F島的核電站绊困,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏适刀。R本人自食惡果不足惜考抄,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔗彤。 院中可真熱鬧川梅,春花似錦、人聲如沸然遏。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽待侵。三九已至丢早,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怨酝。 一陣腳步聲響...
- 正文 我出身青樓赡艰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親斤葱。 傳聞我的和親對象是個殘疾皇子慷垮,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 轉(zhuǎn)自陳明乾的博客,可能有一定更新揍堕。 轉(zhuǎn)原文聲明:原創(chuàng)作品料身,允許轉(zhuǎn)載,轉(zhuǎn)載時請務(wù)必以超鏈接形式標(biāo)明文章 原始出處 衩茸、...
- tomcat的會話保持方式有三種:1芹血、session sticky:會話粘滯,通過同一個客戶端的相關(guān)請求分發(fā)到同一...
- 官網(wǎng)配置:http://tomcat.apache.org/tomcat-6.0-doc/cluster-howt...
- 會話保持Tomcat ClusterTomcat實(shí)現(xiàn)會話粘滯Tomcat實(shí)現(xiàn)會話集群Tomcat實(shí)現(xiàn)會話服務(wù)器 一...
- 文/柯臨 一、對存錢的不同態(tài)度 我一直對兩種人存在特殊偏愛:一是經(jīng)濟(jì)獨(dú)立抖部,二是能把小日子捯飭的活色生香。 時間久了...