天天看點

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)中。

儲存至檔案中的示例:

<code>&lt;Manager className=</code><code>"org.apache.catalina.session.PersistentManager"</code>

<code>  </code><code>saveOnRestart=</code><code>"true"</code><code>&gt;</code>

<code>  </code><code>&lt;Store className=</code><code>"org.apache.catalina.session.FileStore"</code>

<code>    </code><code>directory=</code><code>"/data/tomcat-sessions"</code><code>/&gt;</code>

<code>&lt;</code><code>/Manager</code><code>&gt;</code>

每個使用者的會話會被儲存至directory指定的目錄中的檔案中,檔案名為&lt;session id&gt;.session,并通過背景線程每隔一段時間(checkInterval參數定義,預設為60秒)檢查一次逾時會話。

儲存至JDBCStore中的示例:

<code>  </code><code>&lt;Store className=</code><code>"org.apache.catalina.session.JDBCStore"</code>

<code>    </code><code>driverName=</code><code>"com.mysql.jdbc.Driver"</code>

<code>    </code><code>connectionURL=</code><code>"jdbc:mysql://localhost:3306/mydb?user=jb;password=pw"</code><code>/&gt;</code>

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

1、為了避免使用者直接通路後端Tomcat執行個體,影響負載均衡的效果,建議在Tomcat 7的各執行個體上禁用HTTP/1.1連接配接器。

2、為每一個Tomcat 7執行個體的引擎添加jvmRoute參數,并通過其為目前引擎設定全局惟一辨別符。如下所示。需要注意的是,每一個執行個體的jvmRoute的值均不能相同。

&lt;Engine name=”Standalone” defaultHost=”localhost” jvmRoute=” TomcatA ”&gt;

3、修改虛拟主機配置

<code>[root@liang-study extra]</code><code># vim httpd-jk.conf </code>

<code># Load the mod_jk</code>

<code>LoadModule  jk_module  modules</code><code>/mod_jk</code><code>.so</code>

<code>JkWorkersFile  </code><code>/usr/local/apache/conf/extra/workers</code><code>.properties</code>

<code>JkLogFile  logs</code><code>/mod_jk</code><code>.log</code>

<code>JkLogLevel  debug</code>

<code>JkMount  /*  lbcluster1</code>

<code>JkMount  </code><code>/status/</code>  <code>stat1</code>

<code>[root@liang-study extra]</code><code># vim workers.properties </code>

<code>worker.list = lbcluster1,stat1</code>

<code>worker.TomcatA.</code><code>type</code> <code>= ajp13</code>

<code>worker.TomcatA.host = 192.168.210.148</code>

<code>worker.TomcatA.port = 8009</code>

<code>worker.TomcatA.lbfactor = 5</code>

<code>worker.TomcatB.</code><code>type</code> <code>= ajp13</code>

<code>worker.TomcatB.host = 192.168.210.198</code>

<code>worker.TomcatB.port = 8009</code>

<code>worker.TomcatB.lbfactor = 5</code>

<code>worker.lbcluster1.</code><code>type</code> <code>= lb</code>

<code>worker.lbcluster1.sticky_session = 1</code>

<code>worker.lbcluster1.balance_workers = TomcatA, TomcatB</code>

<code>worker.stat1.</code><code>type</code> <code>= status</code>

4、重新開機httpd服務,驗證通路結果。

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

2、為每一個Tomcat 7執行個體的引擎添加jvmRoute參數,并通過其為目前引擎設定全局惟一辨別符。如下所示。需要注意的是,修改server.xml每一個執行個體的jvmRoute的值均不能相同。

3、修改httpd.conf配置

<code>[root@liang-study conf]</code><code># vim httpd.conf</code>

<code>Include conf</code><code>/extra/tomcat-http</code><code>.conf</code>

4、添加虛拟主機配置

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

<code>ProxyRequests Off</code>

<code>   </code><code>&lt;proxy balancer:</code><code>//liangcluster</code><code>&gt;</code>

<code>       </code><code>BalancerMember ajp:</code><code>//192</code><code>.168.210.148:8009 loadfactor=1 route=tomcatA</code>

<code>       </code><code>BalancerMember ajp:</code><code>//192</code><code>.168.210.198:8009 loadfactor=1 route=tomcatB</code>

<code>   </code><code>&lt;</code><code>/proxy</code><code>&gt;</code>

<code>&lt;VirtualHost *:80&gt;</code>

<code>  </code><code>ServerName www.liangstudy.com</code>

<code>  </code><code>ProxyPass / balancer:</code><code>//liangcluster/</code> <code>stickysession=jsessionid nofailover=On</code>

<code>  </code><code>ProxyPassReverse / balancer:</code><code>//liangcluster/</code>

<code>  </code><code>ErrorLog </code><code>"logs/proxyTest-error.log"</code>

<code>  </code><code>CustomLog </code><code>"logs/lbtest-access.log"</code> <code>common</code>

<code>&lt;</code><code>/VirtualHost</code><code>&gt;</code>

5、重新啟動apache,即可

五、用于mod_proxy狀态資訊的輸出

&lt;Location /balancer-manager&gt;

  SetHandler balancer-manager

  Order Deny,Allow

  Allow from all

&lt;/Location&gt;

如果使用虛拟主機實作反向代理,如何在對應的虛拟主機上完成狀态資訊輸出:

ProxyRequests Off

&lt;proxy balancer://lbcluster1&gt;

  BalancerMember ajp://192.168.10.8:8009 loadfactor=1

  BalancerMember ajp://192.168.10.9:8009 loadfactor=1

  ProxySet lbmethod=bytraffic

&lt;/proxy&gt;

&lt;VirtualHost *:80&gt;

  ServerName localhost

  ProxyVia On

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

  ProxyPassReverse / balancer://lbcluster1/

  &lt;Location /balancer-manager&gt;

    SetHandler balancer-manager

    Proxypass !

    Require all granted

  &lt;/Location&gt;

  &lt;Proxy *&gt;

  &lt;/Proxy&gt;

  &lt;Location  / &gt;

&lt;/VirtualHost&gt;

五、基于mod_proxy實作共享叢集

  根據會話管理器的模式,我們選用org.apache.catalina.ha.session.DeltaManager的方法來實作共享,所有啟用叢集功能的web應用程式,其web.xml中都須添加&lt;distributable/&gt;才能實作叢集功能。如果某web應用程式沒有自己的web.xml,也可以通過複制預設的web.xml至其WEB-INF目錄中實作。

1、修改web.xml

<code>[root@liang-study webapps]</code><code># cd /home/websites/webapps/</code>

<code>[root@liang-study webapps]</code><code># mkdir WEB-INF</code>

<code>[root@liang-study webapps]</code><code># cp /usr/local/tomcat/conf/web.xml WEB-INF/</code>

<code>[root@liang-study webapps]</code><code># ll</code>

<code>total 8</code>

<code>-rw-r--r-- 1 root root  434 Jan 17 17:57 index.jsp</code>

<code>drwxr-xr-x 2 root root 4096 Jan 18 20:20 WEB-INF</code>

<code>[root@liang-study webapps]</code><code># vim WEB-INF/web.xml </code>

<code>在web.xml中添加&lt;distributable/&gt;即可,記得在另外一台tomcat上也需要做這個操作</code>

<code>[root@liang-study webapps]</code><code># scp -r WEB-INF/ [email protected]:/home/websites/webapps/</code>

2、修改server.xml

<code>在&lt;Engine name=</code><code>"Catalina"</code> <code>defaultHost=</code><code>"www.liangstudy.com"</code> <code>jvmRoute=</code><code>"tomcatA"</code><code>&gt;下添加</code>

<code>&lt;Cluster className=</code><code>"org.apache.catalina.ha.tcp.SimpleTcpCluster"</code>

<code>                   </code><code>channelSendOptions=</code><code>"8"</code><code>&gt;</code>

<code>     </code><code>&lt;Manager className=</code><code>"org.apache.catalina.ha.session.DeltaManager"</code>

<code>                    </code><code>expireSessionsOnShutdown=</code><code>"false"</code>

<code>                    </code><code>notifyListenersOnReplication=</code><code>"true"</code><code>/&gt;</code>

<code>       </code><code>&lt;Channel className=</code><code>"org.apache.catalina.tribes.group.GroupChannel"</code><code>&gt;</code>

<code>          </code><code>&lt;Membership className=</code><code>"org.apache.catalina.tribes.membership.McastService"</code>

<code>                   </code><code>address=</code><code>"228.90.90.1"</code>   <code>bind=</code><code>"192.168.210.148"</code>   <code>port=</code><code>"45564"</code>

<code>                   </code><code>frequency=</code><code>"500"</code>  <code>dropTime=</code><code>"3000"</code><code>/&gt;</code>

<code>             </code><code>&lt;Receiver className=</code><code>"org.apache.catalina.tribes.transport.nio.NioReceiver"</code>

<code>                                </code><code>address=</code><code>"192.168.210.148"</code>   <code>port=</code><code>"4000"</code>  <code>autoBind=</code><code>"100"</code>

<code>                                </code><code>selectorTimeout=</code><code>"5000"</code>   <code>maxThreads=</code><code>"6"</code><code>/&gt;</code>

<code>             </code><code>&lt;Sender className=</code><code>"org.apache.catalina.tribes.transport.ReplicationTransmitter"</code><code>&gt;</code>

<code>                </code><code>&lt;Transport className=</code><code>"org.apache.catalina.tribes.transport.nio.PooledParallelSender"</code><code>/&gt;</code>

<code>             </code><code>&lt;</code><code>/Sender</code><code>&gt;</code>

<code>       </code><code>&lt;Interceptor className=</code><code>"org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"</code><code>/&gt;</code>

<code>       </code><code>&lt;Interceptor className=</code><code>"org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"</code><code>/&gt;</code>

<code>     </code><code>&lt;</code><code>/Channel</code><code>&gt;</code>

<code>     </code><code>&lt;Valve className=</code><code>"org.apache.catalina.ha.tcp.ReplicationValve"</code>

<code>                        </code><code>filter=</code><code>".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"</code><code>/&gt;</code>

<code>     </code><code>&lt;Valve className=</code><code>"org.apache.catalina.ha.session.JvmRouteBinderValve"</code><code>/&gt;</code>

<code>     </code><code>&lt;Deployer className=</code><code>"org.apache.catalina.ha.deploy.FarmWarDeployer"</code>

<code>                     </code><code>tempDir=</code><code>"/tmp/war-temp/"</code> <code>deployDir=</code><code>"/tmp/war-deploy/"</code>

<code>                    </code><code>watchDir=</code><code>"/tmp/war-listen/"</code>  <code>watchEnabled=</code><code>"false"</code><code>/&gt;</code>

<code>      </code><code>&lt;ClusterListener className=</code><code>"org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"</code><code>/&gt;</code>

<code>      </code><code>&lt;ClusterListener className=</code><code>"org.apache.catalina.ha.session.ClusterSessionListener"</code><code>/&gt;</code>

<code>&lt;</code><code>/Cluster</code><code>&gt;</code>

<code>注意根據tomcat主機不同修改配置檔案中 bind=</code><code>"192.168.210.148"</code><code>和address=</code><code>"192.168.210.148"</code>

3、重新開機tomcat

本文轉自  亮公子  51CTO部落格,原文連結:http://blog.51cto.com/iyull/1892637