电竞比分网-中国电竞赛事及体育赛事平台

分享

Apache+Tomcat負(fù)載均衡兩種session共享方式的設(shè)置

 nacy2012 2017-07-17

Apache+Tomcat負(fù)載均衡兩種session共享方式的設(shè)置session共享有兩種方式:

1、session共享,多個(gè)服務(wù)器session拷貝保存,一臺(tái)宕機(jī)不會(huì)影響用戶的登錄狀態(tài);

2、請(qǐng)求精確集中定位,即當(dāng)前用戶的請(qǐng)求都集中定位到一臺(tái)服務(wù)器中,這樣單臺(tái)服務(wù)器保存了用戶的session登錄信息,如果宕機(jī),則等同于單點(diǎn)部署,會(huì)丟失;

apache中針對(duì)上述兩個(gè)方法提供了不同的配置項(xiàng):

  session replication:會(huì)話復(fù)制,即上述的方法一;

  session sticky:會(huì)話不復(fù)制,即上述的方法二;

-------------------------------

 

選取Apache HTTP Server作為前端的負(fù)載服務(wù)器,后端選取兩個(gè)Tomcat作集群。

一、采用粘性Session

這種方式將同一用戶的請(qǐng)求轉(zhuǎn)發(fā)到特定的Tomcat服務(wù)器上,避免了集群中Session的復(fù)制,缺點(diǎn)是用戶只跟一種的一臺(tái)服務(wù)器通信,如果此服務(wù)器down掉,那就廢了。
采用的model為mod_proxy_ajp.so,整個(gè)配置在tomcat的配置文件中都有相關(guān)的注釋,只需作相應(yīng)修改就OK。
我們選取的是Apache HTTP Server2.2.4,Tomcat5.5.16。
首先安裝Apache HTTP Server,然后修改其配置文件http.conf,首先load三個(gè)model,代碼如下:

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
然后在此配置文件末端加入以下代碼:
ProxyPass / balancer://tomcatcluster/ lbmethod=byrequests stickysession=JSESSIONID nofailover=Off timeout=5 maxattempts=3  
ProxyPassReverse / balancer://tomcatcluster/   
  
<Proxy balancer://tomcatcluster>  
BalancerMember ajp://localhost:8009 route=a  
BalancerMember ajp://localhost:9009 route=b
</Proxy>

以上代碼配置了Proxy的相關(guān)參數(shù),<Proxy>模塊定義了均衡負(fù)載的配置,其中兩個(gè)Tomcat Server都配置在同一臺(tái)服務(wù)器上,端口分別為8009、9009,并配置各自的route,這樣Apache Server就能根據(jù)route將請(qǐng)求轉(zhuǎn)發(fā)給特定的Tomcat。
接下來(lái)修改Tomcat的server.xml文件,如下:
<!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009"
                enableLookups
="false" redirectPort="8443" protocol="AJP/1.3" />
其中的port為前面<Proxy>中設(shè)定的端口,還要配置其route,代碼如下:
<!-- Define the top level container in our container hierarchy -->
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="a">
jvmRoute也須同前面的設(shè)置一樣。

下面用JMeter對(duì)配置后的負(fù)載均衡做一測(cè)試,首先先啟動(dòng)兩個(gè)Tomcat Server,隨后啟動(dòng)Apache Server,在JMeter中新建測(cè)試計(jì)劃,在兩個(gè)Tomcat Server中的jsp-examples下新建test.jsp(此jsp自己隨便寫(xiě)兩句就成),然后進(jìn)行測(cè)試,以下是部分取樣器結(jié)果:
HTTP response headers:
HTTP/1.1 200 OK
Date: Wed, 11 Jul 2007 02:17:55 GMT
Set-Cookie: JSESSIONID=AC7EF1CAA8C6B0FEB68E77D7D375E2AF.b; Path=/jsp-examples
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 3
Keep-Alive: timeout=5, max=79
Connection: Keep-Alive

以上紅色代碼表示用戶的http請(qǐng)求中的JSESSIONID中已經(jīng)附帶了route后綴,.b表示此請(qǐng)求將轉(zhuǎn)發(fā)到route為b的Tomcat Server上,你將會(huì)發(fā)現(xiàn)其中的一部分請(qǐng)求的JSESSIONID后綴為.a,也就是轉(zhuǎn)發(fā)給route為a的Tomcat Server上。

 

二、采用Session復(fù)制

修改apache http server配置文件http.conf,首先load三個(gè)model,代碼如下:

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

然后在此配置文件末端加入以下代碼:

ProxyPass / balancer://tomcatcluster/

ProxyPassReverse / balancer://tomcatcluster/   
  
<Proxy balancer://tomcatcluster>  
BalancerMember ajp://localhost:8009 route=a  
BalancerMember ajp://localhost:9009 route=b
</Proxy>

接下來(lái)修改Tomcat的server.xml文件,如下:
<!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009"
                enableLookups
="false" redirectPort="8443" protocol="AJP/1.3" />
其中的port為前面<Proxy>中設(shè)定的端口,還要配置其route,代碼如下:
<!-- Define the top level container in our container hierarchy -->
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="a">

jvmRoute也須同前面的設(shè)置一樣。
另外,還需要在tomcat中將以下配置打開(kāi):

 <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
                 managerClassName="org.apache.catalina.cluster.session.DeltaManager"
                 expireSessionsOnShutdown="false"
                 useDirtyFlag="true"
                 notifyListenersOnReplication="true">

            <Membership
                className="org.apache.catalina.cluster.mcast.McastService"
                mcastAddr="228.0.0.4"
                mcastPort="45564"
                mcastFrequency="500"
                mcastDropTime="3000"/>

            <Receiver
                className="org.apache.catalina.cluster.tcp.ReplicationListener"
                tcpListenAddress="auto"
                tcpListenPort="4001"
                tcpSelectorTimeout="100"
                tcpThreadCount="6"/>

            <Sender
                className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
                replicationMode="pooled"
                ackTimeout="15000"
                waitForAck="true"/>

            <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
                   filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
                  
            <Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"
                      tempDir="/tmp/war-temp/"
                      deployDir="/tmp/war-deploy/"
                      watchDir="/tmp/war-listen/"
                      watchEnabled="false"/>
                     
            <ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/>
        </Cluster>
最后,要在我們的應(yīng)用程序里的web-inf下的web.xml文件<web-app>元素的最后加上: <distributable/> 。


  

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多