針對cluster負(fù)載均衡的方方面面
集群技術(shù)是負(fù)載均衡的發(fā)展根本。那么對于理解cluster也是學(xué)習(xí)負(fù)載均衡很重要的一部分。那么我們現(xiàn)在就來從集群的角度來認(rèn)識負(fù)載均衡吧。這樣我們通過多方位的交叉學(xué)習(xí),就能夯實這方面的基礎(chǔ)了,為以后的軟硬件配置做好鋪墊。
CLUSTER概要
一、Cluster的概念及優(yōu)勢
Weblogic支持集群技術(shù),即讓一組Server指向同一域名一起工作從而提供一個更強大、更可靠的應(yīng)用平臺。對于客戶端而言,無論 Cluster中有幾個Server在工作,看上去都是一個。集群技術(shù)有兩個最明顯的特色:
(1)可伸縮性:
Cluster對加入其中的Server在性能上沒有限制,為了提高性能,當(dāng)客戶端的請求大幅增加時,可以動態(tài)地向Cluster中添加 Server。并且,配置Cluster當(dāng)一臺機器的資源沒有被完全利用時,可以在同一機器上啟動多個Server,但要求每一個Server使用不同的 IP,而不能用同一IP的不同端口。
(2)高可用性:
由于在Cluster中同一service在多個Server上同時存放或放在一個共享文件系統(tǒng)中,因此相同的請求可以有多個 Server提供,并且Server間還可以復(fù)制狀態(tài)信息。這樣,當(dāng)其中某一Server宕機或無法響應(yīng)請求時,其它的Server會立即接管它的任務(wù),從而把應(yīng)用和客戶端完全隔離開來。
二、Cluster的工作機制
每一個Clustered service,在每一個server上都會有一個instance,即一個replica,這些replicas集合在一起形成一個replica- aware stub。這些stubs負(fù)責(zé)客戶端與相關(guān)的服務(wù)器段對象的通信,當(dāng)客戶端請求該service時,實際上是向stub發(fā)出請求,stub根據(jù)不同的算法調(diào)用集合中某一replica,如果調(diào)用失敗,stub會檢測到錯誤并重新調(diào)用其它的replica。Cluster支持多種算法:隨機、輪循、基于性能的負(fù)載均衡的輪循(Weight-based round-robin)、根據(jù)參數(shù)值調(diào)用(Parameter-based routing)。
Weblogic Cluster通過負(fù)載均衡和容錯***程度的實現(xiàn)了它的可伸縮性和可用性。為了提高Cluster的可伸縮性,必須保證充分利用每一個Server。Weblogic可以在不同平臺、不同性能的機器上安裝Server并進行Cluster,然后采用Weight-based round-robin算法達(dá)到負(fù)載均衡,從而使每一個Server都得到充分的利用。為了使Cluster具有高可用性,必須具備故障恢復(fù)的能力,這一點可以通過replica-aware stub的容錯功能來實現(xiàn)。Stub 主要是通過在檢測到錯誤信息時重新進行調(diào)用的方式實現(xiàn)容錯。當(dāng)重新調(diào)用不會導(dǎo)致錯誤的結(jié)果時(如stub確認(rèn)failed server不能接收到請求),容錯功能自動實現(xiàn)。而有些情況下,重新調(diào)用可能會導(dǎo)致某一service被請求了多次的錯誤結(jié)果。例如:客戶端C請求 Clustered購物車服務(wù)中的additem()方法,replica-aware stub接收到請求,根據(jù)算法調(diào)用Server1上的service,Server1響應(yīng)請求并返回結(jié)果,但在結(jié)果成功到達(dá)客戶端之前,Server1出現(xiàn)錯誤。此時stub接收到錯誤信息,因此重新調(diào)用Server2上的這一方法,但實際上Server1已經(jīng)將item加入購物車,這樣就造成重復(fù)。為了解決這種問題,可以為服務(wù)添加一個唯一標(biāo)識,如上述的additem()方法中可添加一個參數(shù)——序列號。每一個item有一個唯一的sequence,相同 sequence的item不能被重復(fù)添加。
三、 Cluster的命名服務(wù)
在Weblogic Server中使用命名服務(wù)時,客戶端通過JNDI存取service,JNDI tree上綁定了Server提供的所有的公共服務(wù)。Server提供一個新的service時,是將service以某一名稱綁定到JNDI tree上,客戶端和Server建立連接并按照名稱獲取相應(yīng)的stub。
Custer擴展了Server的這種命名服務(wù)機制,它不僅包含了每一個Server上的非Clustered的stub,而且包含了多個Server間的Clustered 的replica-aware stub。
四、 Cluster的服務(wù)類型
在Weblogic中,有多種服務(wù)可以進行cluster,如:RMI對象、EJB、Servlets、Jsp、Web Application。
(1)RMI和EJB Clustering
RMI和EJB對象在Cluster過程中使用JNDI命名服務(wù)機制。RMI和EJB對象發(fā)送remote stubs到客戶端,客戶端獲取的這些stubs可以是已經(jīng)clustered的,也可以是沒有clustered的。對于Clustered的服務(wù),Stubs根據(jù)負(fù)載均衡和容錯的不同需求調(diào)用Cluster中合適的Server;而對沒有Clustered的服務(wù),所有對此stub的調(diào)用只能由提供此服務(wù)的Server來處理。
有些有狀態(tài)的RMI和EJB對象是不可以進行clustered的,因為客戶端必須總是和同一個Server上的對象實例相聯(lián)系。所有的EJB都是 clusterable,雖然EJB也有有狀態(tài)的,但是EJB home interface 都是無狀態(tài)的,可以進行clustered,這樣就可以從JNDI tree上獲取 Clusterable EJB 的home stub 對象。然后通過home stub的方法創(chuàng)建或檢索相應(yīng)的EJB bean,若為stateful session bean 或entity bean,那么此時得到的stub就是不可clusterable。為了使有狀態(tài)的對象可以更好的cluster,可以將一些操作作為一個事務(wù)來執(zhí)行,如果工作中的Server出現(xiàn)意外,可以重新獲取此對象并進行事務(wù)操作。RMI和EJB不同,RMI沒有定義有狀態(tài)和無狀態(tài)分類,因此必須特意綁定一個有狀態(tài)的RMI對象到Server上。可以仿效EJB home interface的方式即客戶端從JNDI tree上獲取一個clusterable factory method,然后factory method 可以調(diào)用集群中的任意一臺Server,但是被調(diào)用的Server上必須有由此factory調(diào)用的對象。
(2)Clustered Servlets
Servlets也是可以進行Cluster的。對于Servlets,它用replica-aware proxy替代了replica-aware。這個proxy接受web server上所有請求,并轉(zhuǎn)給集群中的某一Server。Proxy對cluster的所有請求進行負(fù)載均衡,并且當(dāng)請求失敗時會進行恢復(fù)處理。 Proxy還可以在cluster中特別是Server沒有正常完成請求響應(yīng)時保持session狀態(tài)。當(dāng)session初始化時,proxy按照負(fù)載均衡算法選擇一臺Server保存session,此后,所有與此session相關(guān)的請求都由這同一臺Server處理。為了避免當(dāng)此Server出錯時,無法保存客戶端狀態(tài)信息,所以session會被復(fù)制下來,并且session的所有變化都會在備份中進行及時更新,這樣,當(dāng)原有Server在響應(yīng)請求過程中失敗時,proxy會立即獲取session的備份,并由此繼續(xù)響應(yīng)客戶端請求,同時做新的復(fù)制。
(3)JDBC clustering
為了利用Weblogic Server cluster的負(fù)載均衡和容錯的性能,Weblogic JDBC連接池也可以在replicated naming tree上注冊。通常情況下,cluster中的每一個Server都進行連接池屬性配置來訪問同一個后端的DBMS實例,即對相同數(shù)據(jù)庫的訪問,每一個Server都有一個連接池。然后通過在配置文件中定義一個DataSource屬性來在naming tree 上注冊連接池。客戶端使用Weblogic JDBC/RMI JDBC 驅(qū)動程序從cluster中獲取數(shù)據(jù)庫連接,即客戶端按照DataSource name獲取連接池,然后按照負(fù)載均衡的算法選擇相應(yīng)的Weblogic Server來響應(yīng)請求。