tomcat apache session粘性配置和session復制配置


好早前配置了負載均衡和session復制,今天寫出來備忘。

方案:
1、基於request的負載均衡
    該種方式下,負載均衡器 (load balancer)會根據各個node的狀況,把每個 http request進行分發。使用這樣的均衡策略,就必須在多個node之間復制用戶的session,實時保持整個cluster的用戶狀態同步,這種操作被稱為session復制(session replication)。Jboss的實現原理是使用攔截器(interceptor),根據用戶的同步策略攔截request,做同步處理后再交給server產生響應。

     優點是客戶不會被綁定都具體的node,只要還有一個node存活,用戶狀態都不會丟失,cluster都能夠繼續工作。

缺點是node之間通信頻繁,響應速度有影響,多並發、高頻操作的情況下性能下降比較厲害。

2、    基於用戶的負載均衡
該種方式下,當用戶發出第一個request后,負載均衡器動態的把該用戶分配到某個節點,並記錄該節點的jvm路由,以后該用戶的所有request都會被綁定這個jvm路由,用戶只會與該server發生交互,這種策略被稱為粘性session(session sticky)。

     優點是響應速度快,多個節點之間無須通信。

缺點也很明顯,某個node死掉以后,它負責的所有用戶都會丟失session。

 

采取方案:

         目前采用第二種,也就是session stiky (1小時)

         文件服務器的配置   (1天)  

         Tomcat參數優化    (1天)

集群的配置

 

首先在apache 的conf目錄下找到httpd.conf(apache 的配置文件)文件

在該文件里找到

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

LoadModule proxy_connect_module modules/mod_proxy_connect.so

LoadModule proxy_ftp_module modules/mod_proxy_ftp.so

LoadModule proxy_http_module modules/mod_proxy_http.so

並且把上面的#號去掉

然后找到

Include conf/extra/httpd-vhosts.conf

把上面的#號去掉

在最后一行加上

ProxyRequests Off

 

<proxy balancer://cluster>

 

BalancerMember ajp://127.0.0.1:8010 loadfactor=1 route=tomcat3(與該tomcat里德jvmRote名字一樣)

 

BalancerMember ajp://127.0.0.1:8020 loadfactor=1 route=tomcat2

 

</proxy>

 

第二步找到\conf\extra包下面的httpd-vhosts.conf

在下面加上

<VirtualHost *:80>

ServerAdmin yancheng100088@163.com

ServerName localhost

ServerAlias   localhost

ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=On

ProxyPassReverse / balancer://cluster/

ErrorLog "logs/dummy-host2.163.com-error.log"

    CustomLog "logs/dummy-host2.163.com-access.log" common

</VirtualHost>

 

 

第三步找到解壓后的tomcat在不同的tomcat里修改server.xml里的端口參數使之不重復

(大家都知道就不詳細說了)

這里改幾個比較重要的參數

一個是<Engine name="Catalina" defaultHost="localhost">

改成<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">

另一個后面改成tomcat3

 

然后加上

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

                                                        mcastBindAddress="127.0.0.1"

                        address="228.0.0.4"

                        port="45564"

                        frequency="500"

                        dropTime="3000"/>

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

                                               tcpListenAddress="127.0.0.1"

                      address="auto"

                      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>      

這個是session復制用的不需要session復制的可以不用

 

最后一步

在需要session復制的程序里面的web.xml里加上

 

  <distributable />

 

 

 

Session粘性,一般用到粘性就不用sesssion復制了

只需要在httpd.conf里最后一段加上

ProxyRequests Off

ProxyPass / balancer://cluster/ lbmethod=byrequests stickysession=JSESSIONID nofailover=Off timeout=5 maxattempts=3 

ProxyPassReverse / balancer://cluster/ 

<proxy balancer://cluster>

 

BalancerMember ajp://127.0.0.1:8010 loadfactor=1 route=tomcat3

 

BalancerMember ajp://127.0.0.1:8020 loadfactor=1 route=tomcat2

 

</proxy>

就行了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM