顧永生 高沈鋼 戚林成



(江蘇電力信息技術有限公司,江蘇 南京 210004)
隨著互聯網應用技術的飛速發展,為滿足用戶日益增長的需求,互聯網應用的形式也逐漸從單服務器架構轉向多服務器的分布式架構。采用多臺服務器組成負載均衡集群,每個群集節點運行自己的獨立進程,但對于網絡用戶來說,是一個整體的應用系統。集群系統可通過在集群中增加服務節點的方式,增加服務的處理能力,并通過系統級的冗余保障系統的可靠性和可用性。
然而,由于HTTP協議是無狀態的,這就需要應用能夠保持用戶與應用交互過程的信息,比如用戶登錄、訪問歷史等信息,這就要采用Session(會話)技術[1]。在集群的計算環境中,這種技術面臨更復雜的情況。因為,Session是保持在單個服務器內部的,而當用戶每次發起HTTP請求時,都有可能被分配到不同的服務器來處理,如果Session無法在各服務器內部保持統一,那么在集群環境下,應用的運行邏輯就會發生混亂。所以,需要研究負載均衡集群環境中Session共享的方法,并根據具體的使用場景采用不同的Session共享的方式,使應用在正常運行的同時,達到較優的性能[2]。
1 基于Cookie的Session共享
基于Cookie的Session共享,基本原理是服務器將用戶的Session信息加密、序列化以后,以Cookie的方式存在用戶的機器上。當用戶再次請求時,服務器就能從Cookie中獲取相應Session中的內容,從而實現Session的共享[3]。下面以一次用戶請求為例,解釋Session的檢查和裝載過程。
用戶請求到服務端后,服務端首先檢查當前的Session是否為空,如果不空,說明已經登錄;如果為空,則從Cookie中讀取Session值。然后驗證該值是否為空,如果為空,則返回用戶登錄界面;如果不空,則進行解密,設置到當前的Session中,再繼續下面的業務流程。
這種方案的優點是Session信息保存在用戶端,無需額外的服務器資源。缺點是在Cookie中存儲的Session信息有長度限制,僅能夠存儲較少的用戶信息;同時,Cookie化的Session內容需要進行安全加解密(如采用RSA等進行明文加解密;再由MD5、SHA-1等算法進行防偽認證);它也會占用一定的帶寬資源,這是因為每次請求時,都要把本地Cookie附加在http頭中傳遞到服務器。
2 基于源IP地址的Session保持
基于源IP地址的Session保持是指來自同一源IP地址的請求,會被負載均衡器分配到同一臺服務器上,而在這臺服務器上保持Session的一種方式。
如圖1所示,在負載均衡服務器中記錄了客戶端X,Y,Z的請求路徑。每當客戶端有請求過來,都會被轉發至相同的服務器,這樣就能保證應用邏輯的正常運行。
這種方案的優點是Session信息無需特殊處理,只需要在負載均衡器中配置即可。缺點是一旦某單個服務器出現故障,就會有一部分用戶無法正常訪問應用;如果大量的請求是從同一臺代理服務器發送到負載均衡服務器的,就會造成某個應用服務器的負載過大,導致不均衡的情況出現。
3 集群統一管理Session復制
該方案的實現原理是在集群中,當任何一個節點服務器建立或更新了Session,這個Session都會被復制到集群中的所有其他節點服務器中,這樣就保證每個節點服務器都擁有所有的Session。請求被分配到任何一臺服務器上后,都擁有相同的Session狀態,從而實現Session共享。這其中的復制過程由集群來完成,需要對集群中的服務器做一定的配置,不同的服務器的配置方式有所不同。下面以Jboss和Tomcat為例,分別介紹Session復制的配置方法。
3.1 Jboss集群Session復制配置方法
要配置Jboss集群并實現Session復制功能,需要利用Jboss的組件mod_cluster。modcluster負責Apache HTTPD與AS群集的連接工作。通過HTTPD作為前端,為用戶提供一個統一的群集訪問點,后面負責將負載分擔至群集內各節點。
在這個例子中,我們配置2個Jboss節點,node1和node2,它們的IP地址見表1。分別在2臺機器上安裝Jboss7。安裝完成后,進入node1服務器的/standalone/configuration目錄下,修改standalone-ha.xml文件,其中斜體加粗部分為修改內容。
(1)設置節點名稱。
(2)設置mod_cluster中統一進行管理信息同步的安全認證口令(在下面的 mod_cluster配置當中會進行顯示配置)。
…
cluster并不要求部署在集群節點中的一臺機器上,只要它們在一個子網即可通過IP Multicast自動發現),修改配置文件httpd/httpd/conf/httpd. conf,默認情況下基本上只需要修改下地址跟端口即可。
ServerName 192.168.1.66:80
Listen 192.168.1.66:7777
ManagerBalancerName mycluster
…
KeepAliveTimeout 300
MaxKeepAliveRequests 0
#ServerAdvertise on http://@IP@:6666
AdvertiseFrequency 5
AdvertiseSecurityKey 1234567890
#AdvertiseGroup @ADVIP@:23364
EnableMCPMReceive
…
3.2 Tomcat集群Session復制配置方法
Tomcat的配置方式相對簡單,但是需要在容器和應用中都做一定的修改,具體方法如下。
(1)在Tomcat的安裝目錄找到文件/conf/server.xml,然后找到被注釋
…
bind="127.0.0.1" address="228.0.0.4"<!--保留ip,用于廣播--> port="45564" frequency="500" dropTime="3000"/> address="auto" port="4001" <!--如果是在同一臺機器上的2個tomcat做負載,則此端口則不能重復--> autoBind="100" selectorTimeout="5000" maxThreads="6"/> … (2)在應用的web.xml中,添加標志 ble/>,如下所示。 …