Apache+Tomcat負載均衡兩種session共享方式的設置

session共享有兩種方式:

 

1、session共享,多個服務器session拷貝保存,一臺宕機不會影響用戶的登錄狀態;

 

2、請求精確集中定位,即當前用戶的請求都集中定位到一臺服務器中,這樣單臺服務器保存了用戶的session登錄信息,如果宕機,則等同於單點部署,會丟失;

 

apache中針對上述兩個方法提供了不同的配置項:

 

 session replication:會話複製,即上述的方法一;

 

 session sticky:會話不復制,即上述的方法二;

 

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


選取Apache HTTP Server作爲前端的負載服務器,後端選取兩個Tomcat作集羣。

 

一、採用粘性Session

 

這種方式將同一用戶的請求轉發到特定的Tomcat服務器上,避免了集羣中Session的複製,缺點是用戶只跟一種的一臺服務器通信,如果此服務器down掉,那就廢了。

採用的model爲mod_proxy_ajp.so,整個配置在tomcat的配置文件中都有相關的註釋,只需作相應修改就OK。

我們選取的是Apache HTTP Server2.2.4,Tomcat5.5.16。

首先安裝Apache HTTP Server,然後修改其配置文件http.conf,首先load三個model,代碼如下:

LoadModule proxy_modulemodules/mod_proxy.so

LoadModule proxy_ajp_modulemodules/mod_proxy_ajp.so

LoadModule proxy_balancer_modulemodules/mod_proxy_balancer.so

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

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

ProxyPassReverse /balancer://tomcatcluster/  

 

<Proxy balancer://tomcatcluster> 

BalancerMember ajp://localhost:8009route=a 

BalancerMember ajp://localhost:9009 route=b

</Proxy>

 

以上代碼配置了Proxy的相關參數,<Proxy>模塊定義了均衡負載的配置,其中兩個Tomcat Server都配置在同一臺服務器上,端口分別爲8009、9009,並配置各自的route,這樣Apache Server就能根據route將請求轉發給特定的Tomcat。

接下來修改Tomcat的server.xml文件,如下:

<!-- Define an AJP 1.3 Connector on port8009 -->

   <Connector port="8009"

                enableLookups="false"redirectPort="8443" protocol="AJP/1.3" />

其中的port爲前面<Proxy>中設定的端口,還要配置其route,代碼如下:

<!-- Define the top level container inour container hierarchy -->

   <Engine name="Catalina" defaultHost="localhost"jvmRoute="a">

jvmRoute也須同前面的設置一樣。

 

下面用JMeter對配置後的負載均衡做一測試,首先先啓動兩個Tomcat Server,隨後啓動Apache Server,在JMeter中新建測試計劃,在兩個Tomcat Server中的jsp-examples下新建test.jsp(此jsp自己隨便寫兩句就成),然後進行測試,以下是部分取樣器結果:

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請求中的JSESSIONID中已經附帶了route後綴,.b表示此請求將轉發到route爲b的Tomcat Server上,你將會發現其中的一部分請求的JSESSIONID後綴爲.a,也就是轉發給route爲a的Tomcat Server上。

 

 

 

二、採用Session複製

 

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

LoadModule proxy_modulemodules/mod_proxy.so

LoadModule proxy_ajp_modulemodules/mod_proxy_ajp.so

LoadModule proxy_balancer_modulemodules/mod_proxy_balancer.so

 

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

 

ProxyPass / balancer://tomcatcluster/

 

ProxyPassReverse / balancer://tomcatcluster/  

 

<Proxy balancer://tomcatcluster> 

BalancerMember ajp://localhost:8009route=a 

BalancerMember ajp://localhost:9009 route=b

</Proxy>

接下來修改Tomcat的server.xml文件,如下:

<!-- Define an AJP 1.3 Connector on port8009 -->

   <Connector port="8009"

                enableLookups="false"redirectPort="8443" protocol="AJP/1.3" />

其中的port爲前面<Proxy>中設定的端口,還要配置其route,代碼如下:

<!-- Define the top level container inour container hierarchy -->

   <Engine name="Catalina" defaultHost="localhost"jvmRoute="a">

 

jvmRoute也須同前面的設置一樣。

另外,還需要在tomcat中將以下配置打開:

 

 <ClusterclassName="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"/>

 

           <ValveclassName="org.apache.catalina.cluster.tcp.ReplicationValve"

                  filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>

                 

           <DeployerclassName="org.apache.catalina.cluster.deploy.FarmWarDeployer"

                     tempDir="/tmp/war-temp/"

                     deployDir="/tmp/war-deploy/"

                     watchDir="/tmp/war-listen/"

                      watchEnabled="false"/>

                    

           <ClusterListenerclassName="org.apache.catalina.cluster.session.ClusterSessionListener"/>

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