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