tomcat集群的會話保持及相關(guān)示例

一贷帮、前言

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配置示例

配置拓?fù)?/div>

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 sticky結(jié)果演示

三、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 cluster測試訪問1

session cluster測試訪問2

四、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。


部署拓?fù)鋱D

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)的記錄來匹配會話留夜。

配置結(jié)果1

配置結(jié)果2

https://github.com/magro/memcached-session-manager

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市图甜,隨后出現(xiàn)的幾起案子香伴,更是在濱河造成了極大的恐慌,老刑警劉巖具则,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異具帮,居然都是意外死亡博肋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門蜂厅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匪凡,“玉大人,你說我怎么就攤上這事掘猿〔∮危” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵稠通,是天一觀的道長衬衬。 經(jīng)常有香客問我,道長改橘,這世上最難降的妖魔是什么滋尉? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮飞主,結(jié)果婚禮上狮惜,老公的妹妹穿的比我還像新娘。我一直安慰自己碌识,他們只是感情好碾篡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著筏餐,像睡著了一般开泽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上魁瞪,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天眼姐,我揣著相機(jī)與錄音诅迷,去河邊找鬼。 笑死众旗,一個胖子當(dāng)著我的面吹牛罢杉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贡歧,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼滩租,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了利朵?” 一聲冷哼從身側(cè)響起律想,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绍弟,沒想到半個月后技即,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡樟遣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年而叼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豹悬。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡葵陵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瞻佛,到底是詐尸還是另有隱情脱篙,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布伤柄,位于F島的核電站绊困,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏适刀。R本人自食惡果不足惜考抄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔗彤。 院中可真熱鬧川梅,春花似錦、人聲如沸然遏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽待侵。三九已至丢早,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怨酝。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工傀缩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人农猬。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓赡艰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親斤葱。 傳聞我的和親對象是個殘疾皇子慷垮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容