Java EE集羣技術初探——第三部分(Web層集羣的實現)

 
Web層集羣實現
Web層的集羣技術是Java EE集羣技術中最基礎且最重要的部分。Web集羣技術包括:Web負載均衡與HTTPSession失敗轉移。
 
Web負載均衡
Java EE的供應商通過多種方式實現Web負載均衡。總的來說,負載均衡器在瀏覽器和Web服務器之間進行監聽,如下圖:
諸如F5負載均衡器這樣的硬件產品可以擔當這個工作,也有可能是一個有負載均衡插件的另一個Web服務器。無論使用什麼技術,負載均衡器通常具有以下特點:
  • 實現了負載均衡的算法
當客戶端請求到來時,負載均衡器決定將此請求分發到後端的哪臺服務器實例上。經常使用的算法包括輪詢、隨機和基於權重的算法。負載均衡器試圖均衡每個服務器實例上的工作負載,但上述算法都不可能真正實現理想的均衡,因爲他們僅僅考慮到了分發到特定服務器實例的請求數量。使用複雜算法的負載均衡器通過特殊算法在分發請求之前將探測每臺服務器的工作負載。
  • 心跳線檢查
當某個服務器實例失敗時,負載均衡器需要檢測到該失敗並取消分發到該實例的請求。負載均衡器也需要監控失敗的服務器何時重新開始服務,並開始對其分發請求。
  • 會話持久
幾乎所有的Web應用都使用會話狀態來記錄諸如登錄、購物車等信息。因爲HTTP協議本身是無狀態的,會話狀態需要保存起來並與瀏覽器會話關聯。在負載均衡的狀態下,最佳選擇是將請求分發到與該瀏覽器會話的上次請求同一的服務器實例上。否則,可能會導致應用工作不正確。
 
因爲會話狀態是在Web服務器實例的內存空間中存儲的,所以會話持久就相當重要了。但當一個服務器實例失敗後,所有該實例中的會話信息就會丟失。所以,我們即需要會話的失敗轉移。
 
HTTPSession失敗轉移
主流的Java EE供應商都實現了HTTPSession失敗轉移。如下圖,當瀏覽器在第一和第二步訪問有狀態的Web應用時,在該服務器的內存中會創建會話對象。與此同時,在第三步將能唯一確定會話對象的HTTPSession ID發送至瀏覽器。瀏覽器將該ID作爲cookie存儲,並在下次請求該Web應用時將此cookie發送至Web服務器。爲了支持會話失敗轉移,Web服務器中的會話對象將被備份下來(第四步),以備服務器失敗時防止會話信息丟失。負載均衡器將檢測到實例的失敗(第五步和第六步),並將後續請求分發到其他服務器實例上(第七步)。由於會話對象已經被備份下來了,處理請求的新服務器實例就能恢復該會話的信息,繼續正確處理會話。
要實現上述功能,需要引入以下內容:
  • 全局HTTPSession ID
上面已經講過,HTTPSession ID用來標識特定服務器實例中的內存會話對象。在Java EEHTTPSession ID根據JVM實例來產生。每個JVM實例能駐留多個Web應用,每個應用能爲不同的用戶保存HTTPSessionHTTPSession ID是在當前JVM實例中訪問相關會話對象的關鍵。在會話失敗轉移的實現中,不同的JVM實例不能生成相同的HTTPSession ID。如若不然,在失敗轉移發生時,就不知道哪個對象是應該恢復的對象。所以,需要引入全局HTTPSession ID機制。
  • 備份會話狀態的機制
後續的描述中會有這方面的內容。將來我還着手寫一片比較各主流服務器中會話備份機制的具體實現的文章。
  • 備份頻率和粒度
HTTPSession狀態的備份會造成額外開銷,比如CPU時間週期、網絡帶寬和磁盤或數據庫I/O。備份操作的頻率和粒度的選擇都可能影響集羣的性能。
 
數據庫持久化辦法
一些的Java EE集羣產品都支持使用JDBC通過關係型數據庫備份會話狀態。在下圖中,顯示了該方法僅需讓服務器實例序列化會話內容並在適當的時候將他們保存在數據庫中。當失敗轉移發生時,另一可用的服務器實例接管失敗的服務器實例,並從數據庫中恢復所有的會話狀態。對象的序列化是其中的一個關鍵點,這樣內存中的會話數據就可以得到持久化並可進行移植。
通常,執行數據庫的事務會造成一些額外的開銷,所以本方法的主要缺陷在於當併發數據量較大時可能無法提供需要的可擴展性。大部分採用數據庫會話持久化方法的應用服務器供應商都建議儘量減少HTTPSession存儲的對象,但這又可能影響到web應用的架構和設計,尤其是在需要使用HTTPSession存儲用戶數據的時候。
 
採用數據庫持久化方法的優點在於:
  • 易於實現。
  • 由於數據庫對集羣中的所有節點都共享,所以,可以實現對會話數據的失敗轉移。
  • 即使在集羣的所有節點都癱瘓的情況下,會話數據依然能夠得到保留。
 
 
內存複製辦法
TomcatJBossWebLogicWebsphere之流的Java EE服務器都提供了另一種實現:內存複製。
在上圖中描述了使用內存複製技術來實現會話狀態備份的場景。本方法的性能很好。之餘數據庫持久化技術,在原服務器和一臺或多臺備份服務器之間進行直接內存複製對網絡通信的影響很小。但是,不同廠商的服務器對內存複製技術的應用方式不同(在下面有具體描述),有的廠商採用的技術就不再需要恢復的過程了,即會話數據備份時已駐留在備份服務器的內存中,當備份服務器接管時,所有的數據已經存在。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章