tomcat 集羣及會話保持實驗示例

Tomcat 集羣分類:

tomcat實現session集羣的幾種方式:

(1) nginx + tomcat cluster

(2) httpd + tomcat cluster #基於http協議

     httpd: mod_proxy, mod_proxy_http, mod_proxy_balancer

     tomcat cluster:http connector

(3) httpd + tomcat cluster #基於ajp協議

     httpd: mod_proxy, mod_proxy_ajp, mod_proxy_balancer

     tomcat cluster:ajp connector

(4) httpd + tomcat cluster

      httpd: mod_jk  #不常用,本文不做接受

      tomcat cluster:ajp connector


實驗準備:

三臺主機:1臺nginx或者httpd做反向調度,兩臺tomcat做後端服務器(tomcatA,tomcatB)

時間同步

主機名解析

tomcat主機安裝:

yum install tomcat tomcat-lib tomcat-admin-webapps tomcat-docs-webapp tomcat-webapps

1. nginx + tomcat cluster

1.1 部署nginx反向代理

vim  /etc/nginx/nginx.conf

upstream  tomsrvs {         #http段

       server 172.18.43.72:8080;

       server 172.18.43.73:8080;


       location / {                #默認http-->server段:

               proxy_pass http://tomsrvs;                                                                                                                                                  

       }

1.2 部署tomcat後端服務器

mkdir -pv /var/lib/tomcat/webapps/test/{classes,lib,WEB-INF,META-INF}

創建文件vim  /var/lib/tomcat/webapps/test/index.jsp

tomcatA測試頁:

<%@ page language="java" %>

<html>

     <head><title>TomcatA</title></head>

           <body>

                 <h1><font color="red">TomcatA.magedu.com</font></h1>

                 <table align="centre" border="1">

                        <tr>

                            <td>Session ID</td>

                        <% session.setAttribute("magedu.com","magedu.com"); %>

                              <td><%= session.getId() %></td>

                        </tr>

                        <tr>

                             <td>Created on</td>

                             <td><%= session.getCreationTime() %></td>


                        </tr>

                 </table>

           </body>

</html>

tomcatB測試頁:

<%@ page language="java" %>

<html>

     <head><title>TomcatB</title></head>

           <body>

                 <h1><font color="blue">TomcatB.magedu.com</font></h1>

                 <table align="centre" border="1">

                        <tr>

                            <td>Session ID</td>

                        <% session.setAttribute("magedu.com","magedu.com"); %>

                              <td><%= session.getId() %></td>

                        </tr>

                        <tr>

                             <td>Created on</td>

                             <td><%= session.getCreationTime() %></td>


                        </tr>

                 </table>

           </body>

</html>

測試結果(已完成nginx反代):

d33d2c5bc1d0cedb34f46a3450f03516.png


2. httpd + tomcat cluster (http協議)

httpd服務器部署反向代理虛擬服務器vim /etc/httpd/conf.d/tom-http.conf

<proxy balancer://tcsrvs>

    BalancerMember http://172.18.43.72:8080  loadfactor=1 #定義權重

    BalancerMember http://172.18.43.73:8080  loadfactor=3

    ProxySet lbmethod=byrequests        #設定調度算法

</Proxy>

<VirtualHost *:80>

    ServerName lb.magedu.com

    ProxyVia On

    ProxyRequests Off   #關閉正向代理

    ProxyPreserveHost On

    <Proxy *>

          Require all granted

    </Proxy>

    ProxyPass / balancer://tcsrvs/   #把所有請求映射到tcsrvs

    ProxyPa***everse / balancer://tcsrvs/

    <Location />

          Require all granted

    </Location>

</VirtualHost>

測試略

附httpd反代相關設置:

http集羣調度算法:
     byrequests:輪詢(默認)
     bybusyness:加權輪詢
     bytraffic:基於流量調度
定義後端調度主機狀態status:
     D:相當於down不接受請求
     I:強行設置爲健康
     H:熱備,相當於backup
     E:錯誤
     N:不接受新請求

3. httpd + tomcat cluster (ajp協議)

httpd服務器部署反向代理虛擬服務器vim /etc/httpd/conf.d/tom-ajp.conf

<proxy balancer://tcsrvs>

    BalancerMember ajp://172.18.43.72:8009  

    BalancerMember ajp://172.18.43.73:8009  

    ProxySet lbmethod=byrequests        

</Proxy>

<VirtualHost *:80>

    ServerName lb.magedu.com

    ProxyVia On

    ProxyRequests Off  

    ProxyPreserveHost On

    <Proxy *>

          Require all granted

    </Proxy>

    ProxyPass / balancer://tcsrvs/  

    ProxyPa***everse / balancer://tcsrvs/

    <Location />

          Require all granted

    </Location>

</VirtualHost>


4. 關於httpd內置集羣代理管理頁面的配置

在如上設置中加入如下代碼:

<Location /balancer-manager>

          SetHandler balancer-manager    #啓用內建處理器

          ProxyPass !      #訪問這個URL時不向後端代理

          Require all granted     #真正使用時管理頁面不應都可訪問

</Location>

訪問URL進行訪問效果如圖:

20b3397bedf04aca0a4b3d0480f8f939.png

可在此頁面進行管理調度算法,後端主機狀態權重等。


實現Tomcat會話保持的三種方式:


1.基於http模塊route標籤實現會話粘性

1.1 http服務器與上面相比添加內容如下:


Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED #新

<proxy balancer://tcsrvs>

    BalancerMember ajp://172.18.43.72:8009 route=TomcatA  #新加

    BalancerMember ajp://172.18.43.73:8009 route=TomvatB #新加

    ProxySet lbmethod=byrequests

    ProxySet stickysession=ROUTEID #新加

1.2 修改兩臺後端tomcat主機

在Engine標籤裏面(在105行附近)加入jvmRoute="Tomcat*"

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">  #主機A

<Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB">  #主機B

測試實現會話粘性

2. Tomcat 會話複製集羣


2.1 httpd主機註釋或刪除上例中添加部分

2.2 編輯兩臺後端tomcat主機server.xml配置文件

確保server.xml配置文件Engine的jvmRoute屬性配置正確(如上例TomcatA,TomcatB),將下列配置放置於<engine>或<host>中,注意各節點配置不同

<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.0.250.43"  #tomcat主機同步多播地址,適當修改

              port="45564"

              frequency="500"  #每隔多久發一次信息(毫秒)

              dropTime="3000"/>  #超時多久判定爲故障

          <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

            address="172.18.43.72"   #填寫本tomcat主機ip地址

            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>

2.3 添加<distributable/>元素

拷貝tomcat自帶模板到test的WEB-INF下面:

cp /etc/tomcat/web.xml /var/lib/tomcat/webapps/test/WEB-INF/web.xml

編輯WEB-INF/web.xml,添加<distributable/>元素

vim web.xml

在任意非註釋區域添加:<distributable/>

2.4 抓包測試,可看到兩臺主機互相通信實現會話複製

71810ae515c68513791a1f36507a3071.png

瀏覽器測試已實現會話粘性

3. session會話保持之session服務器(memcached)


3.1  memcached介紹

      Memcached 是一款高效高性能的旁掛式數據緩存系統,設計簡單,程序短小。即只將數據存貯至內存中,而不寫入至硬盤,成爲緩存系統, memcached 存儲的是 kv 類型數據.所有的緩存都是 kv 類型的數據,並且 memcached 中緩存的數據可以被修改,因爲 memcached 的緩存數據存在於內存中所以,服務器宕機,數據丟失,所以只能作爲緩存使用,而不能當做存儲使用.

      memcached 支持互不通信的集羣,作爲旁掛式緩存系統。需要程序主動與 memcached 進行交互通信。並且memcached 一般用於存儲 session。即作爲 session 服務器使用。

採用了惰性管理,即該清理掉的數據被標記爲不可用,然後在新數據到達時,進行覆蓋。

3.2 實驗環境

構建一臺httpd反向代理,兩臺後端tomcat服務器(兼memcached)。操作方法見上例 [集羣之 3 httpd + tomcat cluster (ajp協議)]

主體架構:Clients–>172.18.43.71(httpd)–>(tomcatA, tomcatB)–> (n1<–> n2)

efafbb49622df53576520d35afd4c7fe.png

3.3.配置tomcat

memcache不支持流式數據存儲,需藉助memcached-session-manager轉化信息。

memcached-session-manager項目地址:

http://code.google.com/p/memcached-session-manager/

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

下載如下jar文件至各tomcat節點的tomcat安裝目錄下的lib目錄中,其中的${version}要換成你所需要的版本號,tc${6,7,8}要換成與tomcat版本相同的版本號。

實驗所用包一覽:

memcached-session-manager-${version}.jar
memcached-session-manager-tc${6,7,8}-${version}.jar
spymemcached-${version}.jar
msm-javolution-serializer-${version}.jar
javolution-${version}.jar

分別在兩個tomcat上的某host上定義一個用於測試的context容器,並在其中創建一個會話管理器,如下所示:

<Context path="/test" docBase="test" reloadable="true">

              <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

                memcachedNodes="n1:172.18.43.72:11211,n2:172.18.43.73:11211"

                failoverNodes="n2"

                requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

                transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"

              />

             </Context>

重啓tomcat,memcache服務

3.4 測試

在瀏覽器中訪問http://172.18.43.71/test/index.jsp,不斷刷新,結果如下所示,其session ID在負載均衡環境中保持不變。

6aee496313cddfea8d2c77218a675d2b.gif

從測試結果可以看出,現在啓用會話共享服務的memcache節點爲n1,此時將n1節點的memcache關閉;

刷新頁面:

2d22d5720fae571d4db2c9a879359575.gif

此時,其session ID在負載均衡環境中保持不變,只是提供memcache服務的節點轉爲n2;

實現了基於memcache的會話保持集羣;


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