安靜的等待

          茹呲綄鎂
          posts - 51, comments - 9, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Apache+JK+Tomcat負載平衡配置

          Posted on 2007-07-18 10:11 ricki 閱讀(459) 評論(0)  編輯  收藏 所屬分類: 負載均衡配置

          網上關于Apache + JK + Tomcat的集群配置例子很多,按著例子配置下來,基本都能運行,不過,在一些重要的地方卻沒有進一步的說明。這次公司一個產品就是采用Apache+JK+Tomcat集群,在整個配置、測試過程中,遇到了許多的問題,經過不斷測試、摸索,最后總算是搞定了,性能也達到了預期的目標。針對網上的例子,感覺有必要再詳細的介紹一下我的配置過程,對一些要特別注意的地方進行補充。

          集群有別于分布式的解決方案,它采用的是每臺服務器運行相同應用的策略,由負責平衡的服務器進行分流,這對提高整個系統的并發量及吞吐量是更有效的辦法。而集群對請求的處理又有兩種不同的方式:負載平衡、狀態復制(即集群),狀態復制需要在各服務器間復制應用狀態,而負載平衡則不用,每臺服務器都是獨立的。實踐證明,在各應用服務器之間不需要狀態復制的情況下,負載平衡可以達到性能的線性增長及更高的并發需求。

          對于集群的其它基礎知識,在此就不再做累贅。以下就這次Apache + JK + Tomcat的負載平衡配置進行總結,重點關注整個配置及注意事項。

          準備軟件

          1、 Tomcat或JBoss(本文檔中采用的是JBoss4.0.2);

          2、 apache2.0.54是開源的Web服務器,下載地址為: http://www.apache.org/dist/httpd/binaries/

          3、 mod_jk-1.2.14-apache-2.0.54.so模塊,jk是mod_jserv的替代者,它是Tomcat-Apache插件,為Apache和Tomcat的連接器,處理Tomcat和Apache之間的通信,在集群配置中充當負載均衡器的作用,當前的最新版本為1.2.15,不過不同JK版本與不同的Apache版本之間的搭配有一些差異,有的甚至配不起來。JK2是符合apache2.x系列的新品,但由于其配置太過麻煩,使用的人很少,所以目前已停止開發,所以我們采用了jk連接器,下載地址:http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/

          集群與負載平衡

          使用mod_jk默認的以輪循方式進行平衡負載,假設有四個服務器節點,有10個請求,則四個節點分別接受請求編號如下:

          節點1

          節點2

          節點3

          節點4

          1

          2

          3

          4

          5

          6

          7

          8

          9

          10

           

           

          而集群方式也是使用這種方法進行平衡。Tomcat中的集群原理是通過組播的方式進行節點的查找并使用TCP連接進行會話的復制。

              集群不同于負載平衡的是,由于集群服務需要在處理請求之間不斷地進行會話復制,復制后的會話將會慢慢變得龐大,因此它的資源占用率是非常高的,如果在并發量大的應用中,復制的會話大小會變得相當大,而使用的總內存更是會迅速升高。

              但集群的會話復制,增加了系統的高可用性。由于在每臺服務器都保存有用戶的Session信息,如果服務器群中某臺當機,應用可以自動切換到其它服務器上繼續運行,而用戶的信息不會丟失,這提高了應用的冗錯性。

          具體采用負載平衡還是集群,這要看應用的需求了。

          安裝配置Apache

          1、下載Apache的安裝程序apache_2.0.54-win32-x86-no_ssl.exe后,安裝很簡單,一路回車,就此略過。

          2、安裝完畢后,將下載的mod_jk-1.2.14-apache-2.0.54.so復制到Apache安裝目錄下的modules子目錄中。

          3、然后進入Apache安裝目錄下的conf子目錄中,打開httpd.conf配置文件,在最后插入以下一行:

          Include conf/mod_jk.conf

          4、 在conf子目錄下,建立一個新的配置文件:mod_jk.conf,此文件為Apache加載連接器的配置文件,文件名可修改,但要與httpd.conf中Include的文件名一致,內容如下:

          # Load mod_jk module. Specify the filename

          # of the mod_jk lib you’ve downloaded and

          # installed in the previous section

          #加載mod_jk模塊

          LoadModule jk_module modules/mod_jk-1.2.14-apache-2.0.54.so

          # Where to find workers.properties

          JkWorkersFile conf/workers2.properties

          # Where to put jk logs

          JkLogFile logs/mod_jk.log

          # Set the jk log level [debug/error/info]

          JkLogLevel info

          # Select the log format

          JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

          # JkOptions indicate to send SSL KEY SIZE,

          JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

          # JkRequestLogFormat set the request format

          JkRequestLogFormat "%w %V %T"

          # 請求分發配置,可以配置多項

          JkMount /* loadbalancer

          #關掉主機Lookup,如果為on,很影響性能,可以有10多秒鐘的延遲。
          HostnameLookups Off

          注:藍色加粗的兩行是重點,第一句是Apache加載JK模塊用的;第二句為配置哪些URL請求將由負載平衡器來處理。

          5、 在conf子目錄下,建立一個新的配置文件:workers2.properties,此文件為負載平衡的配置文件,文件名不能修改,這是JK默認的名字,內容如下:

          worker.list=loadbalancer

          # Define the first node...

          worker.server99.port=8009

          worker.server99.host=192.168.11.99

          worker.server99.type=ajp13

          worker.server99.lbfactor=1

          worker.server99.local_worker=1

          worker.server99.cachesize=1000

          worker.server99.cache_timeout=600

          worker.server99.socket_keepalive=1

          worker.server99.socket_timeout=0

          worker.server99.reclycle_timeout=300

          worker.server99.retries=3

          # Define the second node...

          worker.server202.port=8009

          worker.server202.host=192.168.11.202

          worker.server202.type=ajp13

          worker.server202.lbfactor=1

          worker.server202.local_worker=1

          worker.server202.cachesize=1000

          worker.server202.cache_timeout=600

          worker.server202.socket_keepalive=1

          worker.server202.socket_timeout=0

          worker.server202.reclycle_timeout=300

          worker.server202.retries=3

          # Now we define the load-balancing behaviour

          worker.loadbalancer.type=lb

          worker.retries=3

          worker.loadbalancer.balance_workers=server99 ,server202

          worker.loadbalancer.sticky_session=true

          worker.loadbalancer.sticky_session_force=true

          注:以上定義了兩個worker,一個為server99,另一個為server202,定義了一個負載平衡服務器loadbalancer,其中標藍色的為重點配置項,相關的詳細說明可以看官方的網站文檔:http://tomcat.apache.org/connectors-doc/,其它節點的定義可以直接Copy,修改一下節點名及IP就好了。
          A、worker.list=loadbalancer

          設定工作的負載平衡器,各Tomcat節點不能加入此列表。

              B、worker.server99.lbfactor

          負載平衡的權重比,如果此權重比越大,則分配到此節點的請求越多,如以上兩個節點的權重比為1:1,則為平均分配。

          C、worker.loadbalancer.balance_workers=server99,server202

             指定此負載平衡器負責的Tomcat應用節點。

          D、worker.loadbalancer.sticky_session=true

             此處指定集群是否需要會話復制,如果設為true,則表明為會話粘性,不進行會話復制,當某用戶的請求第一次分發到哪臺Tomcat后,后繼的請求會一直分發到此Tomcat服務器上處理;如果設為false,則表明需求會話復制。

          E、worker.loadbalancer.sticky_session_force=true

             如果上面的sticky_session設為true時,建議此處也設為true,此參數表明如果集群中某臺Tomcat服務器在多次請求沒有響應后,是否將當前的請求,轉發到其它Tomcat服務器上處理;此參數在sticky_session=true時,影響比較大,會導致轉發到其它Tomcat服務器上的請求,找不到原來的session,所以如果此時請求中有讀取session中某些信息的話,就會導致應用的null異常。

          6、Apache服務器的配置文件httpd.conf中,默認有三個參數對性能的影響比較大,但根據不同的性能要求,參數的表現又不一樣,太小并發提不上去,太大性能反而不好,建議根據項目的需要,實際做個測試,如并發要求800的話,可以設定為:

          #一個連接的最大請求數量

          MaxKeepAliveRequests 1000(值為0,則不限制數量)

          #每個進程的線程數,最大1920。NT只啟動父子兩個進程,不能設置啟動多個進程

          ThreadsPerChild    1000(最大為1920)

          #每個子進程能夠處理的最大請求數

          MaxRequestsPerChild   1000(值為0,則不限制數量)

          這三個參數要根據不同的需求,不同的服務器進行調整。

          安裝配置Tomcat或JBoss

          1、對于Tomcat或JBoss的安裝,這里不做說明,目前我們是采用Apache+JBoss,不過,JBoss也是用的Tomcat,所以這里的配置也是適合Tomcat的;

          2、對于JBoss的配置,很簡單,只需要改兩個地方就可以了:

          第一個地方:進入jboss-4.0.2\server\default\deploy\jbossweb-tomcat55.sar,打開server.xml,大約在第32行左右,有,在其中加入一個參數,變為:

          第二個地方:進入jboss-4.0.2\server\default\deploy\jbossweb-tomcat55.sar\META-INF目錄,打開jboss-service.xml,大約在110行,有false,將其改為:

          true

          這里有一個需要特別注意的地方,JBoss的Tomcat中,關于AJP連接協議的默認配置,對于大并發量是不夠用的,要做一些修改,進入jboss-4.0.2\server\default\deploy\jbossweb-tomcat55.sar,打開server.xml,找到的地方,這里是定義AJP連接器的地方,它的配置中沒有maxThreads項,默認為200,我們可以做修改:

                   emptySessionPath="true" enableLookups="false" redirectPort="8443"

                   protocol="AJP/1.3" maxThreads="3000"/>

          maxThreads的值要看你的并發量多大,設置太大也不好。

          運行

          至此,整個配置全部完成,注意一點是,在各JBoss節點,重啟或新增加一個JBoss節點時,需要重新啟動Apache,而對于服務器群中某個JBoss節點shutdown,Apache會自動偵測,不用重新啟動。

          如果在運行過程中,群中的某個JBoss節點shutdown,則已登錄到此服務器上的用戶的請求將出錯,此服務器負責的session將丟失,但Apache會自動偵測到此服務器已shutdown,后繼的新請求將不會再引導到此節點。

          對于負責請求分發的Apache服務器,需要消耗大量的CPU資源,因此如果在測試過程中出現一些Service Temporarily Unavailable或Server  has shut down the connection prematurely這樣的錯誤,這一般都是服務器配置不夠好引起的,或者是Apache、Tomcat、及應用中的某些配置不夠使用,這時候就要考慮換更好的機器或優化應用中的配置。

          常見問題

          一、cannot connect to server:無法連接到服務器。這種情況是服務器的配置有問題,服務器無法承受過多的并發連接了,需要優化服務器的配置:

          如操作系統采用更高版本,如windows 2003 server,

          優化tomcat配置:maxThreads="500" minSpareThreads="400" maxSpareThreads="450"

          但是tomcat 最多支持500個并發訪問

          優化apache配置:

          ThreadsPerChild 1900

          MaxRequestsPerChild  10000

          二、 Action.c(10): Error -27791: Server  has shut down the connection prematurely

          HTTP Status-Code=503 (Service Temporarily Unavailable)
          一般都是由于服務器配置不夠好引起的,需要優化硬件和調整程序了。

          三、無法處理請求:

          當我們輸入 ***.do 命令后,apache卻返回錯誤信息,而連接tomcat卻沒有問題。原因是沒有把.do命令轉發給tomcat處理。解決方法如下:

          在apache配置文件中配置如下內容:

          JkMount /*.jsp loadbalancer

          JkMount /*.do loadbalancer

          主站蜘蛛池模板: 东兴市| 南丹县| 策勒县| 阿拉善左旗| 鹤山市| 津南区| 安义县| 新干县| 平昌县| 天门市| 项城市| 尉氏县| 濉溪县| 门头沟区| 财经| 隆昌县| 浠水县| 辽中县| 泾川县| 福州市| 墨江| 莱西市| 敦煌市| 许昌县| 古浪县| 肥西县| 金川县| 绥阳县| 扎赉特旗| 海安县| 施秉县| 宜君县| 白河县| 军事| 苏州市| 鹤峰县| 濉溪县| 虹口区| 黑山县| 温泉县| 洛川县|