集群是解決應用的高性能與高可用的一種技術,就目前的常規Java EE應用中,最常見最常用的就是Web集群。更規范一些說,web集群就是解決兩個問題:客戶請求的負載均衡和Session的高可用。
客戶請求的負載均衡是指客戶的請求依賴特定算法被合理地分配給多臺Web Server來處理。
Session的高可用性是指當某臺Web Server失效,這臺Web Server服務的客戶的請求會被透明地轉發給其它有效Web Server,而會話狀態(Session)依然可用。
對於負載均衡,一直是一個讓人愛恨交織的東東。配置合理可以發揮每臺服務器的最大性能,提供最好的性能與用戶體驗;配置不合理,則會讓你焦頭爛額,死得很難看。而這種東西往往很少能一下成功,往往在人將近絕望的時候,柳暗花明。
Apusic AS提供內置的負載均衡器,並且可以支持第三方的負載均衡器,甚至是硬件負載均衡器。下面分別介紹一下AAS內置的負載均衡器與第三方負載均衡器的配置方法。
使用AAS內置的負載均衡器有一個原生的優點,就是AAS內置實現分佈式Session管理,既能保證集群的高性能又可以保證Session的高可用,集群中的服務器失效以後,Session切換非常及時,不會出現(在應用沒有問題的情況下)Session突然丟失的情況。
采用Apusic LoadBalancer作為負載均衡器時,AAS內置提供三種負載均衡策略:
隨機選擇策略——按照隨機算法,隨機選擇集群中一臺服務器處理請求。
Round-Robin策略——依次輪尋選擇集群中一臺服務器處理請求。
權重策略——按照權重的比例選擇服務器處理請求。
當然,還支持其他一些負載均衡策略,用戶也可以擴展並加入自定義的負載均衡策略。
在一般情況下,如果集群中的服務器配置相當,可以采用Round-Robin策略,再配合AAS內置的Session粘滯(Session-sticky),可以提供更好的性能;如果集群中的服務器配置差別較大,甚至不在同一數量級上,可以采用權重策略,配置客戶請求分發的比例,保證每臺服務器都能夠實現合理的工作負載。
Apusic LoadBalancer使用瞭內存復制技術,將每個後置服務器的Session備份在自己的緩存中,即後臺某個節點處理完客戶端請求時,將當前Session復制到負載均衡器中。所以使用Apusic LoadBalance時,集群中每個節點必須開啟SessionService中的復制服務。
采用Apusic LoadBalancer時,由於Session緩存在Apusic LoadBalancer的緩存中,當主節點失效時,Apusic LoadBalancer從緩存取出當前的Session,將Session帶到下一個節點進行處理,確保Session的可用性。
一般情況下,使用AAS內置的負載均衡器,建議新建一個負載均衡器域,最為一個獨立服務的應用。新增負載均衡器域,使用AAS的config.cmd工具,創建一個新的集群域。
以Windows為例,打開命令行,定位至%AAS_BIN%下,命令行中輸入“config.cmd”,打開“Apusic域配置向導”。如下圖:
按照命令行中的提示,依次輸入相應信息,直至創建集群域完畢。
上述圖片描述瞭一個創建名為“clusterTest”端口號為“3333”的集群域的創建過程,創建完成的集群域存放在與其他域並列的磁盤位置。創建集群域完畢之後,在%APUSIC_DOMAIN_HOME%下,會新建一個clusterTest文件夾,在其下的config目錄下,會有一個loadbalancer.conf文件,此文件的建立,標志著一個基於Apusic Loadbalancer的集群域創建完畢。此配置文件中,關於負載均衡的配置都在<SERVICE CLASS="com.apusic.web.loadbalancer.LoadBalancer"/>節點中配置。
在配置文件中,最關鍵的屬性BackendServers,定義瞭集群中的服務器,這是一個用逗號分割的地址列表,包括主機名和端口號。
Apusic負載均衡器默認情況下是會話粘滯(session-sticky)的,同時采用輪循的策略選擇可用節點。當然也可以關閉會話粘滯,隻要在LoadBalancer服務中,增加屬性:
<ATTRIBUTE NAME="SessionStick" VALUE="false"/>
<ATTRIBUTE NAME="SessionStick" VALUE="false"/>
就可以關閉會話粘滯。
如果想采用其他策略來選擇節點,可以增加屬性:
<ATTRIBUTE NAME="BalancePolicy" VALUE="Random"/>
<ATTRIBUTE NAME="BalancePolicy" VALUE="Random"/>
其中Value值可以選擇:Random,Round-Robin,LoadWeight.
註意當選擇LoadWeight的時候,還需要增加屬性:
<ATTRIBUTE NAME="LoadWeight" VALUE="10,20,70"/>
<ATTRIBUTE NAME="LoadWeight" VALUE="10,20,70"/> 來標識權重的值。其值與服務器地址列表中的服務器一一對應。
此外,用戶還可以擴展自己的負載均衡策略,隻要實現LoadBalancePolicy接口,同時增加屬性:
<ATTRIBUTE NAME="BalancePolicyClass" VALUE="userclass "/>
<ATTRIBUTE NAME="BalancePolicyClass" VALUE="userclass "/> 其中Value值為用戶自定義的類。當兩個屬性BalancePolicy,BalancePolicyClass同時存在時,BalancePolicyClass的優先級高。
要使用Session的分佈式功能,集群中每臺Apusic服務器的SessionService中屬性:
<ATTRIBUTE NAME="Distributable" VALUE="True"/>
<ATTRIBUTE NAME="Distributable" VALUE="True"/>值必須為True。默認情況下為False。
註意:此處的loadbalancer.conf文件中的LoadBalancer相關配置,與普通應用域下的apusic.conf文件中的“com.apusic.web.WebService”部分屬性值可以通用,尤其是當使用Apusic Loadbalancer的集群發生亂碼時,可以在此LoadBalancer屬性下新增
<ATTRIBUTE NAME="URIEncoding" VALUE="GBK"/>
<ATTRIBUTE NAME="URIEncoding" VALUE="GBK"/>
此屬性值,可以解決此問題,關於此問題本博客中的另外一篇文章:使用Apusic AS內置負載均衡器時頁面亂碼的解決辦法中,有詳細介紹。
摘自 寧靜深遠的專欄