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