網(wǎng)上關(guān)于A(yíng)pache+JK+Tomcat的集群配置例子很多,按著(zhù)例子配置下來(lái),基本都能運行,不過(guò),在一些重要的地方卻沒(méi)有進(jìn)一步的說(shuō)明。這次公司一個(gè)產(chǎn)品就是采用Apache+JK+Tomcat集群,在整個(gè)配置、測試過(guò)程中,遇到了許多的問(wèn)題,經(jīng)過(guò)不斷測試、摸索,最后總算是搞定了,性能也達到了預期的目標。針對網(wǎng)上的例子,感覺(jué)有必要再詳細的介紹一下我的配置過(guò)程,對一些要特別注意的地方進(jìn)行補充。
集群有別于分布式的解決方案,它采用的是每臺服務(wù)器運行相同應用的策略,由負責平衡的服務(wù)器進(jìn)行分流,這對提高整個(gè)系統的并發(fā)量及吞吐量是更有效的辦法。而集群對請求的處理又有兩種不同的方式:負載平衡、狀態(tài)復制(即集群),狀態(tài)復制需要在各服務(wù)器間復制應用狀態(tài),而負載平衡則不用,每臺服務(wù)器都是獨立的。實(shí)踐證明,在各應用服務(wù)器之間不需要狀態(tài)復制的情況下,負載平衡可以達到性能的線(xiàn)性增長(cháng)及更高的并發(fā)需求。
對于集群的其它基礎知識,在此就不再贅述。以下就這次Apache+JK+Tomcat的負載平衡配置進(jìn)行總結,重點(diǎn)關(guān)注整個(gè)配置及注意事項。
準備軟件
1、Tomcat或JBoss(本文檔中采用的是JBoss4.0.2);
2、apache2.0.54是開(kāi)源的Web服務(wù)器,下載地址為: 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,不過(guò)不同JK版本與不同的Apache版本之間的搭配有一些差異,有的甚至配不起來(lái)。JK2是符合apache2.x系列的新品,但由于其配置太過(guò)麻煩,使用的人很少,所以目前已停止開(kāi)發(fā),所以我們采用了jk連接器,下載地址: http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/ 。
集群與負載平衡
使用mod_jk默認的以輪循方式進(jìn)行平衡負載,假設有四個(gè)服務(wù)器節點(diǎn),有10個(gè)請求,則四個(gè)節點(diǎn)分別接受請求編號如下:

而集群方式也是使用這種方法進(jìn)行平衡。Tomcat中的集群原理是通過(guò)組播的方式進(jìn)行節點(diǎn)的查找并使用TCP連接進(jìn)行會(huì )話(huà)的復制。
集群不同于負載平衡的是,由于集群服務(wù)需要在處理請求之間不斷地進(jìn)行會(huì )話(huà)復制,復制后的會(huì )話(huà)將會(huì )慢慢變得龐大,因此它的資源占用率是非常高的,如果在并發(fā)量大的應用中,復制的會(huì )話(huà)大小會(huì )變得相當大,而使用的總內存更是會(huì )迅速升高。
但集群的會(huì )話(huà)復制,增加了系統的高可用性。由于在每臺服務(wù)器都保存有用戶(hù)的Session信息,如果服務(wù)器群中某臺當機,應用可以自動(dòng)切換到其它服務(wù)器上繼續運行,而用戶(hù)的信息不會(huì )丟失,這提高了應用的冗錯性。
具體采用負載平衡還是集群,這要看應用的需求了。
安裝配置Apache
1、下載Apache的安裝程序apache_2.0.54-win32-x86-no_ssl.exe后,安裝很簡(jiǎn)單,一路回車(chē),就此略過(guò)。
2、安裝完畢后,將下載的mod_jk-1.2.14-apache-2.0.54.so復制到Apache安裝目錄下的modules子目錄中。
3、然后進(jìn)入Apache安裝目錄下的conf子目錄中,打開(kāi)httpd.conf配置文件,在最后插入以下一行:
Include conf/mod_jk.conf
以上指令的目的為加載JK模塊的配置文件,當然,你也可以直接將JK配置文件直接寫(xiě)在此處,但前者思路更加清晰。
4、在conf子目錄下,建立一個(gè)新的配置文件: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
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"
# 請求分發(fā)配置,可以配置多項
JkMount /* loadbalancer
# 關(guān)掉主機Lookup,如果為on,很影響性能,可以有10多秒鐘的延遲。
HostnameLookups Off
5、在conf子目錄下,建立一個(gè)新的配置文件: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
注:以上定義了兩個(gè)worker,一個(gè)為server99,另一個(gè)為server202,定義了一個(gè)負載平衡服務(wù)器loadbalancer,相關(guān)的詳細說(shuō)明可以看官方的網(wǎng)站文檔: http://tomcat.apache.org/connectors-doc/ ,其它節點(diǎn)的定義可以直接Copy,修改一下節點(diǎn)名及IP就好了。下面對各指令做詳細的說(shuō)明:
worker.list=loadbalancer:設定工作的負載平衡器,各Tomcat節點(diǎn)不能加入此列表。worker.server99.lbfactor:負載平衡的權重比,如果此權重比越大,則分配到此節點(diǎn)的請求越多,如以上兩個(gè)節點(diǎn)的權重比為1:1,則為平均分配。worker.loadbalancer.balance_workers=server99,server202:指定此負載平衡器負責的Tomcat應用節點(diǎn)。worker.loadbalancer.sticky_session=true:此處指定集群是否需要會(huì )話(huà)復制,如果設為true,則表明為會(huì )話(huà)粘性,不進(jìn)行會(huì )話(huà)復制,當某用戶(hù)的請求第一次分發(fā)到哪臺Tomcat后,后繼的請求會(huì )一直分發(fā)到此Tomcat服務(wù)器上處理;如果設為false,則表明需求會(huì )話(huà)復制。worker.loadbalancer.sticky_session_force=true:如果上面的sticky_session設為true時(shí),建議此處也設為true,此參數表明如果集群中某臺Tomcat服務(wù)器在多次請求沒(méi)有響應后,是否將當前的請求,轉發(fā)到其它Tomcat服務(wù)器上處理;此參數在sticky_session=true時(shí),影響比較大,會(huì )導致轉發(fā)到其它Tomcat服務(wù)器上的請求,找不到原來(lái)的session,所以如果此時(shí)請求中有讀取session中某些信息的話(huà),就會(huì )導致應用的null異常。
6、Apache服務(wù)器的配置文件httpd.conf中,默認有三個(gè)參數對性能的影響比較大,但根據不同的性能要求,參數的表現又不一樣,太小并發(fā)提不上去,太大性能反而不好,建議根據項目的需要,實(shí)際做個(gè)測試,如并發(fā)要求800的話(huà),可以設定為:
# 一個(gè)連接的最大請求數量
MaxKeepAliveRequests 1000(值為0,則不限制數量)
# 每個(gè)進(jìn)程的線(xiàn)程數,最大1920。NT只啟動(dòng)父子兩個(gè)進(jìn)程,不能設置啟動(dòng)多個(gè)進(jìn)程
ThreadsPerChild 1000(最大為1920)
# 每個(gè)子進(jìn)程能夠處理的最大請求數
MaxRequestsPerChild 1000(值為0,則不限制數量)
這三個(gè)參數要根據不同的需求,不同的服務(wù)器進(jìn)行調整。
安裝配置Tomcat或JBoss
1、對于Tomcat或JBoss的安裝,這里不做說(shuō)明,目前我們是采用Apache+JBoss,不過(guò),JBoss也是用的Tomcat,所以這里的配置也是適合Tomcat的;
2、對于JBoss的配置,很簡(jiǎn)單,只需要改兩個(gè)地方就可以了:
進(jìn)入jboss-4.0.2\server\default\deploy\jbossweb-tomcat55.sar,打開(kāi)server.xml,大約在第32行左右,有,在其中加入一個(gè)參數,變?yōu)椋哼M(jìn)入jboss-4.0.2\server\default\deploy\jbossweb-tomcat55.sar\META-INF目錄,打開(kāi)jboss-service.xml,大約在110行,有false,將其改為:true
這里有一個(gè)需要特別注意的地方,JBoss的Tomcat中,關(guān)于A(yíng)JP連接協(xié)議的默認配置,對于大并發(fā)量是不夠用的,要做一些修改,進(jìn)入jboss-4.0.2\server\default\deploy\jbossweb-tomcat55.sar,打開(kāi)server.xml,找到的地方,這里是定義AJP連接器的地方,它的配置中沒(méi)有maxThreads項,默認為200,我們可以做修改:
emptySessionPath="true" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" maxThreads="3000" />
maxThreads的值要看你的并發(fā)量多大,設置太大也不好。
運行
至此,整個(gè)配置全部完成,注意一點(diǎn)是,在各JBoss節點(diǎn),重啟或新增加一個(gè)JBoss節點(diǎn)時(shí),需要重新啟動(dòng)Apache,而對于服務(wù)器群中某個(gè)JBoss節點(diǎn)shutdown,Apache會(huì )自動(dòng)偵測,不用重新啟動(dòng)。
如果在運行過(guò)程中,群中的某個(gè)JBoss節點(diǎn)shutdown,則已登錄到此服務(wù)器上的用戶(hù)的請求將出錯,此服務(wù)器負責的session將丟失,但Apache會(huì )自動(dòng)偵測到此服務(wù)器已shutdown,后繼的新請求將不會(huì )再引導到此節點(diǎn)。
對于負責請求分發(fā)的Apache服務(wù)器,需要消耗大量的CPU資源,因此如果在測試過(guò)程中出現一些Service Temporarily Unavailable或Server has shut down the connection prematurely這樣的錯誤,這一般都是服務(wù)器配置不夠好引起的,或者是Apache、Tomcat、及應用中的某些配置不夠使用,這時(shí)候就要考慮換更好的機器或優(yōu)化應用中的配置。
常見(jiàn)問(wèn)題
1、cannot connect to server:無(wú)法連接到服務(wù)器。這種情況是服務(wù)器的配置有問(wèn)題,服務(wù)器無(wú)法承受過(guò)多的并發(fā)連接了,需要優(yōu)化服務(wù)器的配置:
如操作系統采用更高版本,如windows 2003 server,優(yōu)化tomcat配置:maxThreads="500" minSpareThreads="400" maxSpareThreads="450" 但是tomcat 最多支持500個(gè)并發(fā)訪(fǎng)問(wèn)優(yōu)化apache配置:ThreadsPerChild 1900, MaxRequestsPerChild 10000
2、 Action.c(10): Error -27791: Server has shut down the connection prematurely HTTP Status-Code=503 (Service Temporarily Unavailable):一般都是由于服務(wù)器配置不夠好引起的,需要優(yōu)化硬件和調整程序了。
3、無(wú)法處理請求:當我們輸入 ***.do 命令后,apache卻返回錯誤信息,而連接tomcat卻沒(méi)有問(wèn)題。原因是沒(méi)有把.do命令轉發(fā)給tomcat處理。解決方法為在apache配置文件中配置如下內容:
JkMount /*.jsp loadbalancer
JkMount /*.do loadbalancer
聯(lián)系客服