tomcat會話管理集羣建設方案

標題索引
css


  • 追朔緣由html

  • 方案構建java

  • 方案評估nginx


追朔緣由git

    網站集羣會話管理毋庸置疑,互聯網上方案層出不窮,構建穩定、高效、適應業務系統的方案需根據本身的業務發展自行設計,根據以往經驗tomcat構建會話管理時,每每異常莫名奇妙問題恆生,所以自測方案迫在眉睫。
github

方案構建web

    1.會話管理apache

    一般採用Cookie技術或Session技術,以下爲倆者方案詳解,Cookie技術具體原理及過程以下所示:vim

be8487×××aab56388e3183755895cbd.png

圖1-1 Cookie會話管理技術流程圖centos

    如上所示Cookie技術是調用Serlet接口中的Set-Cookie方法,能夠將會話、網購產品等非重要數據保存Cookie中並經過response報文返回瀏覽器,瀏覽器緩存Cookie,瀏覽器再次訪問Serlet接口時攜帶以前分配的Cookie,從而攜帶以前Cookie中保存的內容。

    Session技術具體原理以下所示:

96e1cd9e8c47fe940d33a6e8c906d65f.png

圖1-2 Session會話管理技術流程圖

    如上所示Session技術調用Serlet接口的Session方法,能夠將會話ID、網購產品等非重要數據保存會話,經過構建response響應報文返回瀏覽器會話ID,瀏覽器緩存會話ID,瀏覽器再次訪問Serlet接口時攜帶以前分配的會話ID,從而能夠從會話服務器中獲取保存在會話中的內容。

    2.核心配置

    調度器Cookie轉發

    採用調度器採用Cookie會話管理時,會話保持技術主要集中在調度器,服務器端無需採用其餘Cookie或Session技術便可作到會話保持,如apache作調度時核心配置:

[ root@centos7 ~ ]#vim /etc/httpd/conf.d/vhost.conf
    #apache給請求報文頭部添加Cookie,並轉發
   Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
   <Proxy balancer://tcpsv>
                BalancerMember http://172.18.27.23:8080 route=1
                BalancerMember http://172.18.27.24:8080 route=2 
                #調度採用基於Cookie的會話保持                                                                                                             
                proxyset stickysession=ROUTEID
   </Proxy>
   
   <VirtualHost *:80>
           ServerName www.jncsy.com
          ProxyVia On
          ProxyRequests Off
          ProxyPreserveHost On
          <Proxy *>
                  Require all granted
          </Proxy>
          <Location />
                  Require all granted
          </Location>
          ProxyPass / balancer://tcpsv/
          ProxyPa***everse / balancer://tcpsv/
    </VirtualHost>

    集羣會話同步

    參考官方集羣文檔https://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html,在每臺tomcat  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.0.0.8"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      <!--定義接收會話同步的IP地址 -->
					  address="172.18.27.23"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
					<!--根據服務器數量定義,具體爲服務器數量-1  -->
                      maxThreads="8"/>

            <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>

    並在在目錄/WEB-INF的目錄的web.xml中的文件的末尾中添加

	<welcome-file-list>
         <welcome-file>index.html</welcome-file>
         <welcome-file>index.htm</welcome-file>
         <welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	<!-- 開啓會話分佈功能 -->
        <distributable/>
</web-app>

    會話服務器

    會話服務器採用tomcat+memcache構建,其中tomcat中添加/usr/share/tomcat/bin下添加會話管理包,讓tomcat支持會話管理,在每一個頁面程序中的WEB-INF下常見lib目錄並在此目錄中添加序列化工具,將服務器產生的會話經過序列化工具轉化爲能夠存儲在memcache中的鍵值,具體可參考官網文檔https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration。

    核心配置以下:

[ root@nginxser01 lib ]#pwd                     #上傳序列化工具
/usr/local/tomcat/webapps/test/WEB-INF/lib
[ root@nginxser01 lib ]#ls
asm-6.0.jar     kryo-serializers-0.42.jar  msm-kryo-serializer-2.1.1.jar  reflectasm-1.11.3.jar
kryo-4.0.1.jar  minlog-1.3.0.jar           objenesis-2.6.jar
[ root@nginxser01 lib ]#pwd
/usr/local/tomcat/lib                           #上傳會話管理工具
[ root@nginxser01 lib ]#ls
memcached-session-manager-2.1.1.jar memcached-session-manager-tc8-2.1.1.jar 
spymemcached-2.12.3.jar 
[ root@nginxser01 conf]# vim server.xml         #粘性會話和非粘性會話根據業務需求二選一
   <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Context path="/test" docBase="test">
    <!-- 粘性會話主備模式,單臺存儲會話-->
    <!--    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:172.18.27.110:11211,n2:172.18.253.104:11211"
    failoverNodes="n1"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    /> -->
    <!--非粘性會話主主模式,兩臺同時存儲會話-->
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:172.18.27.110:11211,n2:172.18.253.104:11211"
    sticky="false"                                                                                                                              
    sessionBackupAsync="false"
    lockingMode="auto"                                                                                                   
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
    </Context>

方案評估

    根據如上3套方案,若業務量相對較小時,建議採用基於Cookie調度,由於網絡NAT技術有可能會產生調度不均衡,可是並不是同一IP會同時產生大量訪問量。若業務量相對較大時,建議採用專用會話管理服務器集羣,專業的工具作專業的事效果會更佳。若服務器資源相對匱乏、內存資源沒法保障時,建議採用會話同步。

相關文章
相關標籤/搜索