Tomcat Session共享

有多種實現方案,在這裏介紹2種。
方案1:使用 web容器本身功能,Tomcat組播
優點:配置簡點,不依賴第三方存儲。
缺點:廣播延遲,需要Tomcat7及以上版本,需要廣播端口
方案2:使用緩存實現,Redis或memcached
優點:實時性高,常用方式
缺點:需要維護第三方服務,必須保證高可用。
其他方案:

可以設置nginx或haproxy等負載方式爲ip綁定,假裝實現Tomcat之間的Session共享(對負載均衡要求不嚴)

方案一詳解:

參考http://blog.csdn.net/Readiay/article/details/45393435

1、  修改server.xml,在<Engine>中增加以下代碼

<!-- 
    Cluster(集羣,族) 節點,如果你要配置tomcat集羣,則需要使用此節點.
    className 表示tomcat集羣時,之間相互傳遞信息使用那個類來實現信息之間的傳遞.
    channelSendOptions可以設置爲2、4、8、10,每個數字代表一種方式
    2 = Channel.SEND_OPTIONS_USE_ACK(確認發送)
    4 = Channel.SEND_OPTIONS_SYNCHRONIZED_ACK(同步發送) 
    8 = Channel.SEND_OPTIONS_ASYNCHRONOUS(異步發送)
    在異步模式下,可以通過加上確認發送(Acknowledge)來提高可靠性,此時channelSendOptions設爲10
-->
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
    <!--
        Manager決定如何管理集羣的Session信息。Tomcat提供了兩種Manager:BackupManager和DeltaManager
        BackupManager-集羣下的所有Session,將放到一個備份節點。集羣下的所有節點都可以訪問此備份節點
        DeltaManager-集羣下某一節點生成、改動的Session,將複製到其他節點。
        DeltaManager是Tomcat默認的集羣Manager,能滿足一般的開發需求
        使用DeltaManager,每個節點部署的應用要一樣;使用BackupManager,每個節點部署的應用可以不一樣.


        className-指定實現org.apache.catalina.ha.ClusterManager接口的類,信息之間的管理.
        expireSessionsOnShutdown-設置爲true時,一個節點關閉,將導致集羣下的所有Session失效
        notifyListenersOnReplication-集羣下節點間的Session複製、刪除操作,是否通知session listeners
        maxInactiveInterval-集羣下Session的有效時間(單位:s)。
        maxInactiveInterval內未活動的Session,將被Tomcat回收。默認值爲1800(30min)
    -->
    <Manager className="org.apache.catalina.ha.session.DeltaManager"
             expireSessionsOnShutdown="false"
             notifyListenersOnReplication="true"/>


    <!--
        Channel是Tomcat節點之間進行通訊的工具。
        Channel包括5個組件:Membership、Receiver、Sender、Transport、Interceptor
    -->
    <Channel className="org.apache.catalina.tribes.group.GroupChannel">
         <!--
            Membership維護集羣的可用節點列表。它可以檢查到新增的節點,也可以檢查到沒有心跳的節點
            className-指定Membership使用的類
            address-組播地址
            port-組播端口
            frequency-發送心跳(向組播地址發送UDP數據包)的時間間隔(單位:ms)。默認值爲500
            dropTime-Membership在dropTime(單位:ms)內未收到某一節點的心跳,則將該節點從可用節點列表刪除。默認值爲3000


            注: 組播(Multicast):一個發送者和多個接收者之間實現一對多的網絡連接。
                一個發送者同時給多個接收者傳輸相同的數據,只需複製一份相同的數據包。
                它提高了數據傳送效率,減少了骨幹網絡出現擁塞的可能性
                相同組播地址、端口的Tomcat節點,可以組成集羣下的子集羣
         -->
        <Membership className="org.apache.catalina.tribes.membership.McastService"
                    address="228.0.0.4"
                    port="45564"
                    frequency="500"
                    dropTime="3000"/>


        <!--
            Receiver : 接收器,負責接收消息
            接收器分爲兩種:BioReceiver(阻塞式)、NioReceiver(非阻塞式)


            className-指定Receiver使用的類
            address-接收消息的地址
            port-接收消息的端口
            autoBind-端口的變化區間
            如果port爲4000,autoBind爲100,接收器將在4000-4099間取一個端口,進行監聽
            selectorTimeout-NioReceiver內輪詢的超時時間
            maxThreads-線程池的最大線程數
        -->
        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                  address="auto"
                  port="4000"
                  autoBind="100"
                  selectorTimeout="5000"
                  maxThreads="6"/>
        <!--
            Sender : 發送器,負責發送消息
            Sender內嵌了Transport組件,Transport真正負責發送消息
        -->
        <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
            <!--
                Transport分爲兩種:bio.PooledMultiSender(阻塞式)、nio.PooledParallelSender(非阻塞式) 
            -->
            <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
        </Sender>

        <!--
            Interceptor : Cluster的攔截器
            TcpFailureDetector-網絡、系統比較繁忙時,Membership可能無法及時更新可用節點列表,
            此時TcpFailureDetector可以攔截到某個節點關閉的信息,
            並嘗試通過TCP連接到此節點,以確保此節點真正關閉,從而更新集羣可以用節點列表                 
        -->

        <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>

        <!--
            MessageDispatch15Interceptor-查看Cluster組件發送消息的方式是否設置爲
            Channel.SEND_OPTIONS_ASYNCHRONOUS(Cluster標籤下的channelSendOptions爲8時)。
            設置爲Channel.SEND_OPTIONS_ASYNCHRONOUS時,
            MessageDispatch15Interceptor先將等待發送的消息進行排隊,然後將排好隊的消息轉給Sender
        -->
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
    </Channel>

    <!--
        Valve : 可以理解爲Tomcat的攔截器
        ReplicationValve-在處理請求前後打日誌;過濾不涉及Session變化的請求                   
        vmRouteBinderValve-Apache的mod_jk發生錯誤時,保證同一客戶端的請求發送到集羣的同一個節點
    -->
    <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
    <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

    <!--
        Deployer : 同步集羣下所有節點的一致性。Deployer沒試驗成功過。。。
     -->
     <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                   tempDir="/tmp/war-temp/"
                   deployDir="/tmp/war-deploy/"
                   watchDir="/tmp/war-listen/"
                   watchEnabled="false"/>
    <!--
        ClusterListener : 監聽器,監聽Cluster組件接收的消息
        使用DeltaManager時,Cluster接收的信息通過ClusterSessionListener傳遞給DeltaManager
    -->
    <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

</Cluster>

2、 修改項目web.xml

確保含有<distributable/>

方案二詳解

Redis
1、jar下載地址:https://github.com/jcoleman/tomcat-redis-session-manager/downloads
2、將jar包放到tomcat/lib下
 
3、修改tomcat/conf/contenxt.xml配置文件,增加
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"  
host="localhost"   
port="6379"   
database="0"   
maxInactiveInterval="60" />  


Memcached

1、jar包下載:https://code.google.com/archive/p/memcached-session-manager/downloads
2、將jar包放到tomcat/lib下
Jar包下載地址可下載以下3個包
memcached-session-manager-1.5.1.jar 
memcached-session-manager-tc6-1.5.1.jar 
msm-javolution-serializer-1.5.1.jar
以下2個jar包自行下載相應版本
memcached-2.5.jar
javolution-5.5.1.jar
3、修改tomcat/conf/contenxt.xml配置文件,增加
<Context reloadable="false" path="" >
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"  
memcachedNodes="n1:192.168.1.101:11211,n2:192.168.1.102:11211"  
sticky="false"  
sessionBackupAsync="false"  
lockingMode="auto"  
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"  
transcoderFactoryClass="de.javakaffee.web.msm.JavaSerializationTranscoderFactory" />  
</Context>  


發佈了311 篇原創文章 · 獲贊 2448 · 訪問量 257萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章