Tomcat負(fù)載均衡的session和容錯
對于tomact的負(fù)載均衡,里面的問題很多都值得我們研究,這里我們不在討論它的設(shè)置內(nèi)容,而是討論它的一些性能問題。這里面,我們主要重點說容錯和session的相關(guān)知識。這也是為我們了解程序系統(tǒng)必須知道的內(nèi)容。
◆Tomcat的負(fù)載均衡
先前版本的tomcat并沒有提供負(fù)載均衡的能力。集成apache web server和tomcat servlet container就是一個不錯的處理web請求的負(fù)載均衡集群。在Apache Tomcat中,被稱為Tomcat Worker的Tomcat實例被配置來實現(xiàn)負(fù)載均衡。
Tomcat5提供三種方法來實現(xiàn)負(fù)載均衡:
分別是用JK本地連接器,用Apache2的mod_proxy和mod_rewrite,或者用balancer web app。
我們重點使用第三種,使用balancer web application來重定向web請求到集群內(nèi)的各個節(jié)點。這個負(fù)載均衡的應(yīng)用是基于規(guī)則的。使用servlet filter機(jī)制重定向進(jìn)入的web請求到下一個有效的集群成員上。servlet filter在servlet2.3規(guī)范中有詳細(xì)的介紹。過濾器(servletfilter)可以在web應(yīng)用中負(fù)責(zé)多種不同的任務(wù)。例如JAAS認(rèn)證,加密,記錄日志和審核,數(shù)據(jù)壓縮,XSLT過濾器轉(zhuǎn)換XML內(nèi)容等等。就如Tomcat均衡器網(wǎng)站講述的那樣,這個均衡器應(yīng)用并非設(shè)計用來替代其他的強(qiáng)大的負(fù)載均衡機(jī)制。它用簡單并且易于擴(kuò)展的方法來重定向交易(traffic)到其他的服務(wù)器上。檢查均衡器應(yīng)用所提供的樣例Java類,了解均衡器如何用不同的規(guī)則標(biāo)準(zhǔn)來完成各種不同的任務(wù)。
負(fù)載均衡配置文件(rules.xml)包含不同的規(guī)則和重定向的URLs。balancer filter檢查Rule Chain來決定將請求重定向到那里,按照rules.xml中指定的順序來檢查規(guī)則。當(dāng)一條規(guī)則匹配時,過濾器停止評估,并且重定向請求到規(guī)則指定的URL上。
◆容錯
容錯是系統(tǒng)的一種能力,能夠做到系統(tǒng)中的一個服務(wù)器失效時,另一個有效的服務(wù)器能夠接管,這對最終用戶來講是透明的。理想的情況是集群服務(wù)監(jiān)測到集群內(nèi)其中的一個服務(wù)器失效而不能處理請求時,停止發(fā)送請求到該服務(wù)器。然后周期性的檢查集群中的該成員是否再次生效,如果生效,將再次將其添加到活動服務(wù)器節(jié)點池中。
◆Tomcat的容錯
Tomcat5并沒有提供一個內(nèi)建的失敗重啟機(jī)制來檢查集群成員的崩潰。希望,未來的版本能提供這個功能,用來發(fā)現(xiàn)集群內(nèi)有效的機(jī)器,確定那些成員能處理進(jìn)來的請求。
集群解決方案一般提供兩種層次的失敗重啟能力:
請求層次的失敗重啟
如果集群中的一臺服務(wù)器掛起,所有接下來的請求將會被重定向到集群中的其他服務(wù)器。這包含一種heart beat機(jī)制來保持跟蹤服務(wù)狀態(tài)和避免發(fā)送請求到?jīng)]有回應(yīng)的服務(wù)器上。在我們的集群設(shè)置中,一個Tomcat實例扮演著負(fù)載均衡器的角色,處理請求層次上的失敗重啟,并轉(zhuǎn)發(fā)web請求到集群中的其他節(jié)點。
session層次的失敗重啟
一個web客戶可以擁有一個由HTTP服務(wù)器維持的session。如果集群中的其中一臺服務(wù)器掛起,集群中的另一臺服務(wù)器能接手前一臺服務(wù)器的session,保持連續(xù)性。這需要在集群內(nèi)復(fù)制session數(shù)據(jù)。擁有session復(fù)制能力的Tomcat集群能處理session層次的失敗重啟。
◆session狀態(tài)的持久化
失敗重啟和負(fù)載均衡都需要集群內(nèi)不同的服務(wù)器之間能進(jìn)行session狀態(tài)的復(fù)制。當(dāng)原來的服務(wù)器失敗時,session狀態(tài)復(fù)制允許客戶無縫的從集群中的另外一臺服務(wù)器上取得session信息。這個狀態(tài)可以包括系統(tǒng)狀態(tài)和/或應(yīng)用狀態(tài)(應(yīng)用狀態(tài)包含存儲在HTTPsession中的對象和數(shù)據(jù))。session復(fù)制的主要目的是當(dāng)集群成員崩潰、為應(yīng)用升級或者系統(tǒng)維護(hù)停止工作時能夠不丟失任何session的內(nèi)容。
談到session的持續(xù)化,有一個簡單的集群方案,集群成員不知道其他成員的session狀態(tài)。在這個方案中,用戶session完全在一臺服務(wù)器上,由負(fù)載均衡器來選擇。這叫做粘性session(或者叫sessionaffinity)。因此seesion數(shù)據(jù)保存在接收web請求的集群成員上。#p#
從另外一方面來將,集群可以以這樣的一種方式實現(xiàn),每一個集群成員完全明白其他成員的session狀態(tài),通過session狀態(tài)的周期性傳播到其他備用集群成員。這種session被稱為復(fù)制session。
有三種方法實現(xiàn)session的持久化:
內(nèi)存對內(nèi)存的復(fù)制;
文件系統(tǒng)session持久化,session信息從一個中央文件系統(tǒng)讀寫;
數(shù)據(jù)庫session持久化,session數(shù)據(jù)存儲在一個JDBC數(shù)據(jù)存儲器。
在內(nèi)存session持久化中,當(dāng)HTTPsession中的獨立的對象改變,這個對象將會被序列化到其他的備用機(jī)器上,而在數(shù)據(jù)庫session持續(xù)化中,當(dāng)session中的任何對象改變時,session中的所有對象將被一起序列化。
數(shù)據(jù)庫/文件系統(tǒng)session持續(xù)化的缺點是限制了當(dāng)在HttpSession存儲大型或大量對象時的可伸縮性。每一次用戶增加一個對象到HttpSession中,session中所有的對象都會被序列化并被寫到數(shù)據(jù)庫或者共享文件系統(tǒng)中。
◆tomcat中的session復(fù)制
當(dāng)前Tomcat版本的session復(fù)制是一種all-to-all的復(fù)制,即在任何時,session中的屬性被傳播到集群的所有成員。當(dāng)集群小的情況下,這個算法是高效的,為應(yīng)付大型集群的情況,Tomcat的下一個版本將提供主-從復(fù)制,session將僅僅被保存在一個或者兩個備份服務(wù)器上。
在tomcat中,有三種類型的session復(fù)制機(jī)制:
內(nèi)存中復(fù)制,使用Tomcat5自帶的SimpleTcpCluster(在org.apache.catalina.cluster.tcp包中,文件為server/lib/catalina-cluster.jar);
session持久化,保存session在一個共享數(shù)據(jù)庫上(org.apache.catalina.session.JDBCStore);
在共享的文件系統(tǒng)上保存session的狀態(tài)(org.apache.catalina.session.FileStore,partofcatalina-optional.jar)。



















