tomcat負載均衡配置

一、web server session

server端session:

1、service向用戶瀏覽器發送cookie,此cookie包含獲取服務端session的標識。

2、向用戶通過瀏覽器請求同一站點的頁面時,相應的cookie信息會隨之發送。

3、server從cookie信息中識別出與此瀏覽器相關的session標識,從而判別出當前server上此瀏覽器的session信息。

在用戶瀏覽器不支持cookie的場景中,也可以基於URL重寫實現session功能。簡單來講就是server端通過爲任何一個響應給用戶的URL附加上session id的方式來標識用戶請求。

不過需要注意的是,每個瀏覽器進程都會各自管理各自跟服務端的會話ID,因此,在服務器端看來,同一個客戶端上的多個瀏覽器進程會被識別成不同的客戶端。


二、會話管理器:

標準會話管理器和持久會話管理器

標準會話管理器(StandardManager):

<Manager className="org.apache.catalina.session.StandardManager"

         maxInactiveInterval="7200"/>

默認保存於$CATALINA_HOME/work/Catalina/<hostname>/<webapp-name>/下的SESSIONS.ser文件中。

maxActiveSessions:最多允許的活動會話數量,默認爲-1,表示不限制; 

maxInactiveInterval:非活動的會話超時時長,默認爲60s;

pathname:會話文件的保存目錄;


持久會話管理器(PersistentManager):

將會話數據保存至持久存儲中,並且能在服務器意外中止後重新啓動時重新加載這些會話信息。持久會話管理器支持將會話保存至文件存儲(FileStore)或JDBC存儲(JDBCStore)中。

保存至文件中的示例:

<Manager className="org.apache.catalina.session.PersistentManager"
  saveOnRestart="true">
  <Store className="org.apache.catalina.session.FileStore"
    directory="/data/tomcat-sessions"/>
</Manager>

每個用戶的會話會被保存至directory指定的目錄中的文件中,文件名爲<session id>.session,並通過後臺線程每隔一段時間(checkInterval參數定義,默認爲60秒)檢查一次超時會話。

保存至JDBCStore中的示例:

<Manager className="org.apache.catalina.session.PersistentManager"
  saveOnRestart="true">
  <Store className="org.apache.catalina.session.JDBCStore"
    driverName="com.mysql.jdbc.Driver"
    connectionURL="jdbc:mysql://localhost:3306/mydb?user=jb;password=pw"/>
</Manager>


三、配置基於mod_jk的負載均衡

1、爲了避免用戶直接訪問後端Tomcat實例,影響負載均衡的效果,建議在Tomcat 7的各實例上禁用HTTP/1.1連接器。

2、爲每一個Tomcat 7實例的引擎添加jvmRoute參數,並通過其爲當前引擎設置全局惟一標識符。如下所示。需要注意的是,每一個實例的jvmRoute的值均不能相同。

<Engine name=”Standalone” defaultHost=”localhost” jvmRoute=” TomcatA ”>

3、修改虛擬主機配置

[root@liang-study extra]# vim httpd-jk.conf 

# Load the mod_jk
LoadModule  jk_module  modules/mod_jk.so
JkWorkersFile  /usr/local/apache/conf/extra/workers.properties
JkLogFile  logs/mod_jk.log
JkLogLevel  debug
JkMount  /*  lbcluster1
JkMount  /status/  stat1
[root@liang-study extra]# vim workers.properties 

worker.list = lbcluster1,stat1
worker.TomcatA.type = ajp13
worker.TomcatA.host = 192.168.210.148
worker.TomcatA.port = 8009
worker.TomcatA.lbfactor = 5
worker.TomcatB.type = ajp13
worker.TomcatB.host = 192.168.210.198
worker.TomcatB.port = 8009
worker.TomcatB.lbfactor = 5
worker.lbcluster1.type = lb
worker.lbcluster1.sticky_session = 1
worker.lbcluster1.balance_workers = TomcatA, TomcatB
worker.stat1.type = status

4、重啓httpd服務,驗證訪問結果。


四、配置基於mod_proxy的負載均衡

1、爲了避免用戶直接訪問後端Tomcat實例,影響負載均衡的效果,建議在Tomcat 7的各實例上禁用HTTP/1.1連接器。

2、爲每一個Tomcat 7實例的引擎添加jvmRoute參數,並通過其爲當前引擎設置全局惟一標識符。如下所示。需要注意的是,修改server.xml每一個實例的jvmRoute的值均不能相同。

<Engine name=”Standalone” defaultHost=”localhost” jvmRoute=” TomcatA ”>

3、修改httpd.conf配置

[root@liang-study conf]# vim httpd.conf
Include conf/extra/tomcat-http.conf

4、添加虛擬主機配置

[root@liang-study conf]# vim extra/tomcat-http.conf 

ProxyRequests Off
   <proxy balancer://liangcluster>
       BalancerMember ajp://192.168.210.148:8009 loadfactor=1 route=tomcatA
       BalancerMember ajp://192.168.210.198:8009 loadfactor=1 route=tomcatB
   </proxy>


<VirtualHost *:80>
  ServerName www.liangstudy.com
  ProxyPass / balancer://liangcluster/ stickysession=jsessionid nofailover=On
  ProxyPa***everse / balancer://liangcluster/
  ErrorLog "logs/proxyTest-error.log"
  CustomLog "logs/lbtest-access.log" common
</VirtualHost>

5、重新啓動apache,即可


五、用於mod_proxy狀態信息的輸出

<Location /balancer-manager>

  SetHandler balancer-manager

  Order Deny,Allow

  Allow from all

</Location>


如果使用虛擬主機實現反向代理,如何在對應的虛擬主機上完成狀態信息輸出:

ProxyRequests Off

<proxy balancer://lbcluster1>

  BalancerMember ajp://192.168.10.8:8009 loadfactor=1

  BalancerMember ajp://192.168.10.9:8009 loadfactor=1

  ProxySet lbmethod=bytraffic

</proxy>



<VirtualHost *:80>

  ServerName localhost

  ProxyVia On

  ProxyPass / balancer://lbcluster1/  stickysession=JSESSIONID|jsessionid nofailover=On

  ProxyPa***everse / balancer://lbcluster1/

  <Location /balancer-manager>

    SetHandler balancer-manager

    Proxypass !

    Require all granted

  </Location>

  <Proxy *>

    Require all granted

  </Proxy>

  <Location  / >

    Require all granted

  </Location>

</VirtualHost>


五、基於mod_proxy實現共享集羣

  根據會話管理器的模式,我們選用org.apache.catalina.ha.session.DeltaManager的方法來實現共享,所有啓用集羣功能的web應用程序,其web.xml中都須添加<distributable/>才能實現集羣功能。如果某web應用程序沒有自己的web.xml,也可以通過複製默認的web.xml至其WEB-INF目錄中實現。

1、修改web.xml

[root@liang-study webapps]# cd /home/websites/webapps/
[root@liang-study webapps]# mkdir WEB-INF
[root@liang-study webapps]# cp /usr/local/tomcat/conf/web.xml WEB-INF/
[root@liang-study webapps]# ll
total 8
-rw-r--r-- 1 root root  434 Jan 17 17:57 index.jsp
drwxr-xr-x 2 root root 4096 Jan 18 20:20 WEB-INF
[root@liang-study webapps]# vim WEB-INF/web.xml 
在web.xml中添加<distributable/>即可,記得在另外一臺tomcat上也需要做這個操作
[root@liang-study webapps]# scp -r WEB-INF/ [email protected]:/home/websites/webapps/

2、修改server.xml

在<Engine name="Catalina" defaultHost="www.liangstudy.com" jvmRoute="tomcatA">下添加
<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.90.90.1"   bind="192.168.210.148"   port="45564"
                   frequency="500"  dropTime="3000"/>
             <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                                address="192.168.210.148"   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=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
     <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>
注意根據tomcat主機不同修改配置文件中 bind="192.168.210.148"和address="192.168.210.148"

3、重啓tomcat

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