Tomcat叢集與負載均衡

zhaosoft1982發表於2010-03-24

在單一的伺服器上執行WEB應用程式有一些重大的問題,當網站成功建成並開始接受大量請求時,單一伺服器終究無法滿足需要處理的負荷量,所以就有點顯得有點力不從心了。

 

另外一個常見的問題是會產生單點故障,如果該伺服器壞掉,那麼網站就立刻無法運作了。不論是因為要有較佳的擴充性還是容錯能力,我們都會想在一臺以上的伺服器計算機上執行WEB應用程式。所以,這時候我們就需要用到叢集這一門技術了。

 

在進入叢集系統架構探討之前,先定義一些專門術語:

1. 叢集(Cluster):是一組獨立的計算機系統構成一個鬆耦合的多處理器系統,它們之間通過網路實現程式間的通訊。應用程式可以通過網路共享記憶體進行訊息傳送,實現分散式計算機。

2. 負載均衡(Load Balance):先得從叢集講起,叢集就是一組連在一起的計算機,從外部看它是一個系統,各節點可以是不同的作業系統或不同硬體構成的計算機。如一個提供Web服務的叢集,對外界來看是一個大Web伺服器。不過叢集的節點也可以單獨提供服務。

3. 特點:在現有網路結構之上,負載均衡提供了一種廉價有效的方法擴充套件伺服器頻寬和增加吞吐量,加強網路資料處理能力,提高網路的靈活性和可用性。叢集系統(Cluster)主要解決下面幾個問題:

高可靠性(HA):利用叢集管理軟體,當主伺服器故障時,備份伺服器能夠自動接管主伺服器的工作,並及時切換過去,以實現對使用者的不間斷服務。

高效能運算(HP):即充分利用叢集中的每一臺計算機的資源,實現複雜運算的並行處理,通常用於科學計算領域,比如基因分析,化學分析等。

負載平衡:即把負載壓力根據某種演算法合理分配到叢集中的每一臺計算機上,以減輕主伺服器的壓力,降低對主伺服器的硬體和軟體要求。

 

目前比較常用的負載均衡技術主要有:

1. 基於DNS的負載均衡

通過DNS服務中的隨機名字解析來實現負載均衡,在DNS伺服器中,可以為多個不同的地址配置同一個名字,而最終查詢這個名字的客戶機將在解析這個名字時得到其中一個地址。因此,對於同一個名字,不同的客戶機會得到不同的地址,他們也就訪問不同地址上的Web伺服器,從而達到負載均衡的目的。

2. 反向代理負載均衡 (如Apache+JK2+Tomcat這種組合)

使用代理伺服器可以將請求轉發給內部的Web伺服器,讓代理伺服器將請求均勻地轉發給多臺內部Web伺服器之一上,從而達到負載均衡的目的。這種代理方式與普通的代理方式有所不同,標準代理方式是客戶使用代理訪問多個外部Web伺服器,而這種代理方式是多個客戶使用它訪問內部Web伺服器,因此也被稱為反向代理模式。

3. 基於NAT(Network Address Translation)的負載均衡技術 (如Linux Virtual Server,簡稱LVS)

網路地址轉換為在內部地址和外部地址之間進行轉換,以便具備內部地址的計算機能訪問外部網路,而當外部網路中的計算機訪問地址轉換閘道器擁有的某一外部地址時,地址轉換閘道器能將其轉發到一個對映的內部地址上。因此如果地址轉換閘道器能將每個連線均勻轉換為不同的內部伺服器地址,此後外部網路中的計算機就各自與自己轉換得到的地址上伺服器進行通訊,從而達到負載分擔的目的。

介紹完上面的叢集技術之後,下面就基於Tomcat的叢集架構方案進行說明:

 

上面是採用了Apache httpd作為web伺服器的,即作為Tomcat的前端處理器,根據具體情況而定,有些情況下是不需要Apache httpd作為 web 伺服器的,如系統展現沒有靜態頁面那就不需要Apache httpd,那時可以直接使用Tomcat作為web 伺服器來使用。使用Apache httpd主要是它在處理靜態頁面方面的能力比Tomcat強多了。

1、使用者的網頁瀏覽器做完本地 DNS和企業授權的DNS之的請求/響應後,這時候企業授權的DNS(即21cn BOSS DNS)會給使用者本地的DNS伺服器提供一個NAT請求分配器(即閘道器)IP。

 

2、NAT分配器,它會根據特定的分配演算法,來決定要將連線交給哪一臺內部 Apache httpd來處理請求。大多數的NAT請求分配器提供了容錯能力:根據偵測各種WEB伺服器的失效狀況,停止將請求分配給已經宕掉的伺服器。並且有些分配器還可以監測到WEB伺服器機器的負載情況,並將請求分配給負載最輕的伺服器等等。Linux Virtual Server是一個基於Linux作業系統上執行的VS-NAT開源軟體套件,而且它有豐富的功能和良好的說明檔案。商業硬體解決方案 Foundry Networks的ServerIron是目前業界公認最佳的請求分配器之一。

 

3、Apache httpd + Mod_JK2在這裡是作為負載均衡器,那為什麼要做叢集呢?如果叢集系統要具備容錯能力,以便在任何單一的硬體或軟體元件失效時還能100%可用,那麼叢集系統必須沒有單點故障之憂。所以,不能只架設一臺有mod_jk2的Apache httpd,因為如果 httpd或mod_jk2失效了,將不會再有請求被會送交到任何一個Tomcat 例項。這種情況下,Apache httpd就是瓶勁,特別在訪問量大的網站。

 

4、Mod_JK2負載均衡與故障復原,決定把Apache httpd當成web伺服器,而且使用mod_jk2將請求傳送給Tomcat,則可以使用mod_jk2的負載均衡與容錯功能。在叢集系統中,帶有mod_jk2的Apache httpd可以做的事情包括:

A、 將請求分配至一或多個Tomcat例項上

你可以在mod_jk2的workers.properties檔案中,設定許多Tomcat例項,並賦於每個例項一個lb_factor值,以作為請求分配的加權因子。

 

B、偵測Tomcat例項是否失敗

當Tomcat例項的聯結器服務不再響應時,mod_jk2會及時偵測到,並停止將請求送給它。其他的Tomcat例項則會接受失效例項的負載。

 

C、偵測Tomcat例項在失效後的何時恢復

因聯結器服務失效,而停止將請求分配給Tomcat例項之後,mod_jk2會週期性地檢查是否已恢復使用性,並自動將其加入現行的Tomcat例項池中。

 

5、Tomcat中的叢集原理是通過組播的方式進行節點的查詢並使用TCP連線進行會話的複製。這裡提示一下就是,對每個請求的處理,Tomcat都會進行會話複製,複製後的會話將會慢慢變得龐大。

 

6、Mod_jk2同時支援會話親和和會話複製。在tomcat 5中如何實現會話親和和會話複製?把server.xml中的標籤去掉就實現會話親和,把標籤加上就實現會話複製。

 

7、會話親和:就是表示來自同會話的所有請求都由相同的Tomcat 例項來處理,這種情況下,如果Tomcat例項或所執行的伺服器機器失效,也會喪失Servlet的會話資料。即使在叢集系統中執行更多的Tomcat例項,也永遠不會複製會話資料。這樣是提高叢集效能的一種方案,但不具備有容錯能力了。

 

8、 使用會話複製,則當一個Tomcat例項宕掉時,由於至少還有另一個Tomcat例項保有一份會話狀態資料,因而資料不會喪失。但效能會有所降低。

相關文章