集羣是將多個系統連接在一起組成一個系統總體的一種方案,集羣一方面爲了提高系統的負載能力,將請求由多臺系統共同分擔,另一方面也是爲了提高系統的可靠性,當某個系統崩潰時由其它系統響應請求。在這裏,我們將介紹Tomcat的集羣配置,結構見下圖:
一、工具和資料:
Apache的WEB服務器(apache httpd):http://httpd.apache.org/download.cgi
JK(jk-1.2.18):http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.18/
Tomcat(tomcat5.5):http://tomcat.apache.org/download-55.cgi
相關文檔請參見各個工具相應提供的文檔,工具的安裝此處不再介紹,默認地,將Apache安裝在$APACHE目錄,並將mod_jk-apache-2.2.2.so改名爲mod_jk.so放在$APACHE/ modules下(注意JK與Apache httpd的版本關係),兩個Tomcat的安裝路徑都在$TOMCAT1和$TOMCAT2。
二、負載均衡
1、基於request的負載均衡
該種方式下,負載均衡器 (load balancer)會根據各個node的狀況,把每個 http request進行分發。使用這樣的均衡策略,就必須在多個節點之間複製用戶的session,實時保持整個集羣的用 戶狀態同步,這種操作被稱爲session複製(session replication)。
該方法的優點是客戶不會被綁定都具體的node,只要還有一個node存活,用戶狀態都不會丟失,cluster都能夠繼續工作。缺點是隨着節點的增加,可能會因廣播風暴而導致性能大幅度下降
2、 基於session的負載均衡
該 種方式下,當用戶發出第一個request後,負載均衡器動態的把該用戶分配到某個節點,並記錄該節點的jvm路由,以後該用戶的所有request都會被綁定這個jvm路由,用戶只會與該server發生交互,這種策略被稱爲粘性session(session sticky)。該方法的優點是響應速度快,多個節點之間無須通信。缺點也很明顯,某個node死掉以後,它負責的所有用戶都會丟失session。
3、Broker負載均衡
將節點進行分片,每個分片組成一個對外的服務整體,在片內使用基於request的負載均衡,而在片外使用基於session的負載均衡,使用這種處理將使地Session複製的廣播保持爲一個常量,不因爲節點增加而導致性能下降,同時又保持高可靠性,不因爲某個節點的崩潰而導致所有的Session數據的丟失
這裏將着重介紹第一和第二種負載均衡的配置
三、基於session的負載均衡
1)Apache配置,在$APACHE/conf/httpd.conf中增加如下配置:
以下內容爲程序代碼:
# Load mod_jk module # Update this path to match your modules location LoadModule jk_module modules/mod_jk.so # Declare the module for <IfModule directive> (remove this line on Apache 2.x) #AddModule mod_jk.c # Where to find workers.properties # Update this path to match your conf directory location (put workers.properties next to httpd.conf) JkWorkersFile conf/workers.properties # Where to put jk logs # Update this path to match your logs directory location (put mod_jk.log next to access_log) JkLogFile jk/JK_LOG.txt # 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" # Send everything for context /examples to worker named worker1 (ajp13) JkMount /* loadbalancer
|
|
2)在$APACHE/conf/中創建workers.properties,內容如下,關於Worker的詳細配置,請參見Jarkarta-Tomcat的Connector文檔
以下內容爲程序代碼:
worker.list=loadbalancer,server2,server1 # Define the first node... worker.server2.port=8010 worker.server2.host=localhost worker.server2.type=ajp13 worker.server2.lbfactor=1 worker.server2.local_worker=1 worker.server2.cachesize=10
# Define the first node... worker.server1.port=8009 worker.server1.host=localhost worker.server1.type=ajp13 worker.server1.lbfactor=1 worker.server1.local_worker=1 worker.server1.cachesize=10
# Now we define the load-balancing behaviour worker.loadbalancer.type=lb worker.loadbalancer.balanced_workers=server1,server2 worker.loadbalancer.sticky_session=1
|
|
在上面中,loadbalancer是一個虛擬Worker,並不代表任何節點,僅用於管理其他的Worker(注意其type爲lb)
3)兩個Tomcat的配置
根據上面的workers.properties配置修改$TOMCAT/conf/server.xml的端口配置,並修改
<Engine name="Catalina" defaultHost="localhost">爲<Engine name="Catalina" defaultHost="localhost" jvmRoute="server1/2">
啓動Tomcat、Apache,到功告成
四、基於request的負載均衡
在如上配置的基礎上增加如下配置:
1)workers.properties的worker.loadbalancer.sticky_session值改爲0
2)server.xml中的Cluster配置註釋去掉(注意端口,如果在同臺機上進行負載均衡,注意端口不要衝突)
3)在應用的web.xml中增加<distributable/>