- 相關(guān)推薦
關(guān)于J2EE應(yīng)用服務(wù)器集群簡介
J2EE應(yīng)用服務(wù)器提供商給集群下了定義, 一個(gè)集群就是一組在一起工作,顯式提供企業(yè)服務(wù)(支持JNDI,EJB,JSP, HttpSession和組件失敗轉(zhuǎn)移等等)的機(jī)器群.下面是小編整理的J2EE應(yīng)用服務(wù)器集群簡介,希望大家認(rèn)真閱讀!
負(fù)載均衡器(Load balancers):
進(jìn)入集群和通行指示器到單個(gè)Web或應(yīng)用服務(wù)器的唯一入口點(diǎn)
·Web servers
·網(wǎng)關(guān)路由器(Gateway routers) 在內(nèi)網(wǎng)外的的出口點(diǎn).
·多層交換器(Multilayer switches)
包和幀過濾確保在集群里的每個(gè)機(jī)器僅僅收到相關(guān)機(jī)器的信息.
·防火墻(Firewalls)
集群保護(hù)器通過端口過濾防止Hackers訪問集群和內(nèi)網(wǎng)
·存儲區(qū)域網(wǎng)絡(luò)交換器(SAN---Storage Area Networking switches)
連接應(yīng)用服務(wù)器,web服務(wù)器,和數(shù)據(jù)庫到一個(gè)后端存儲媒介;
管理寫數(shù)據(jù)到物理硬盤;還有失敗轉(zhuǎn)移.
·數(shù)據(jù)庫(Databases)
不管他們是如何實(shí)現(xiàn)的,所有的集群都提供兩個(gè)好處:可伸縮性(scalability)和高可用性(high availability---HA)
可伸縮性(scalability)
伸縮性支持用戶增長時(shí)保證應(yīng)用服務(wù)質(zhì)量的能力.集群允許你依靠增加額外的服務(wù)器提供額外的容量,因而保證伸縮性.
高可用性(high availability---HA)
HA能被一個(gè)詞概括:冗余.集群使用許多的機(jī)器處理服務(wù)請求.因此,如果在集群里的任何機(jī)器失敗,另外一臺機(jī)器會直接接管.
集群僅僅在應(yīng)用服務(wù)器層提供HA.對于一個(gè)要展示真正HA的Web系統(tǒng),一定象諾亞方舟一樣至少包括Web服務(wù)器,網(wǎng)關(guān)路由器, 交換基礎(chǔ)設(shè)施,等等中的兩種.(關(guān)于HA的更多內(nèi)容,看這個(gè)HA Checklist.)
集群類型
J2EE集群通常流行兩種風(fēng)格:非共享和共享磁盤.在非共享集群里, 每個(gè)應(yīng)用服務(wù)器都有的它自己的文件系統(tǒng), 和這個(gè)集群里運(yùn)行的應(yīng)用程序自己的拷貝相一致.應(yīng)用的更新和增加需要更新集群里的每個(gè)節(jié)點(diǎn).當(dāng)代碼增加和更新發(fā)布時(shí)進(jìn)行配置,大的集群有惡夢般的維護(hù).
相反,磁盤共享集群使用一個(gè)所有的應(yīng)用服務(wù)器都用的存儲設(shè)備來獲取在集群里運(yùn)行的應(yīng)用.更新和增加出現(xiàn)在一個(gè)文件系統(tǒng)里,集群里的所有的機(jī)器可以訪問這些變化.直到最近才發(fā)現(xiàn), 單點(diǎn)失敗是這種方法的不利方面.然而,SAN給出了一個(gè)單獨(dú)的邏輯接口,通過這個(gè)接口可以進(jìn)入到一個(gè)提供失敗轉(zhuǎn)移,反饋,和伸縮性的冗余存儲中介.(關(guān)于SAN更多的內(nèi)容,看Storage Infrastructure)
當(dāng)比較J2EE應(yīng)用服務(wù)器的集群實(shí)現(xiàn)時(shí),重要考慮:
·集群實(shí)現(xiàn)
·集群和組件失敗轉(zhuǎn)移服務(wù)
·HttpSession失敗轉(zhuǎn)移
·集群拓?fù)淅锏膯吸c(diǎn)失敗
·柔性拓?fù)湟?guī)劃
·維護(hù)
以后我們將看到四種流行的應(yīng)用服務(wù)器在不同領(lǐng)域如何比較,但是,首先還是讓我們更詳細(xì)的檢查所要考慮的每一項(xiàng).
集群實(shí)現(xiàn)
J2EE應(yīng)用服務(wù)器在他們的JNDI(java命名和目錄接口)實(shí)現(xiàn)周圍實(shí)現(xiàn)了群集.雖然JNDI是J2EE應(yīng)用依賴的核心服務(wù),但是它很難在集群里實(shí)現(xiàn),因?yàn)樗荒馨讯鄠(gè)對象綁定在單個(gè)名字上.關(guān)于每個(gè)應(yīng)用服務(wù)器的JNDI實(shí)現(xiàn)有三個(gè)普遍的群集方法.
·獨(dú)立的
·中央集中的
·全局共享的
獨(dú)立JNDI樹
HP Bluestone Total-e-Server 和SilverStream Application Server利用了一個(gè)適合于每個(gè)應(yīng)用服務(wù)器的獨(dú)立JNDI樹.在一個(gè)獨(dú)立JNDI樹的集群里成員服務(wù)器不知道或不關(guān)心集群里其他服務(wù)的存在.因此,不支持失敗轉(zhuǎn)移或者通過重定向HTTP或EJB請求的媒介服務(wù)提供支持.配置媒介服務(wù),使他們知道集群里每個(gè)組件都駐留在哪里和萬一失敗發(fā)生如何得到一個(gè)替代的組件.
獨(dú)立JNDI樹的集群它的一個(gè)優(yōu)點(diǎn):更短的集群收斂時(shí)間和靈活的伸縮.集群收斂衡量了集群完全知道集群里所有的機(jī)器和相關(guān)對象的時(shí)間.然而, 在一個(gè)獨(dú)立JNDI樹的集群里收斂(Convergence)并不是一個(gè)要關(guān)心的問題,因?yàn)榧涸趦膳_機(jī)器一啟動(dòng)就完成了收斂(Convergence).獨(dú)立的JNDI樹的其他優(yōu)點(diǎn):伸縮僅僅需要需要增加額外的服務(wù)器.
然而,也存在幾個(gè)弱點(diǎn).首先,失敗轉(zhuǎn)移通常是開發(fā)者的責(zé)任. 也就是說,因?yàn)槊總(gè)應(yīng)用服務(wù)器的JNDI樹都是獨(dú)立的,所以通過JNDI重新找到的遠(yuǎn)程代理被固定到已出現(xiàn)的lookup服務(wù)器上.在這種情況下,如果調(diào)用EJB的一個(gè)方法失敗了,開發(fā)者必須寫額外的代碼連接到分發(fā)器來獲得另外一個(gè)活動(dòng)服務(wù)器的地址,做另外一次JNDI查找,再一次調(diào)用已失敗的方法. Bluestone實(shí)現(xiàn)了一個(gè)更復(fù)雜的獨(dú)立JNDI樹的形式,就是每個(gè)請求都經(jīng)過EJB代理服務(wù)或者代理LBB (Load Balance Broker).EJB代理服務(wù)保證每個(gè)EJB請求都進(jìn)入一個(gè)活動(dòng)的UBS實(shí)例.這種方案對每個(gè)請求都添加了額外的反應(yīng)時(shí)間,但是在方法調(diào)用之間允許自動(dòng)的失敗轉(zhuǎn)移.
中央集中JNDI樹
Sybase企業(yè)應(yīng)用服務(wù)器實(shí)現(xiàn)了一個(gè)中央集中JNDI樹的集群.根據(jù)這種設(shè)置,中央集中的JNDI樹利用了CORBA的CosNaming服務(wù).命名服務(wù)器收容了集群的中央集中的JDNI樹,清楚哪個(gè)服務(wù)器出事了.剛一啟動(dòng),集群里的每個(gè)服務(wù)器就綁定它的對象到它的JNDI樹和所有的命名服務(wù)器.
在一個(gè)中央集中JNDI樹的集群里獲得一個(gè)EJB的引用需要兩個(gè)步驟.首先,客戶端從命名服務(wù)器查找一個(gè)home對象,返回一個(gè)互操作對象引用(IOR).一個(gè)IOR指向集群里活動(dòng)的具有home對象的幾臺機(jī)器.第二,客戶端挑選出定位在IOR里的第一個(gè)服務(wù)器,得到home和remote.如果在EJB方法調(diào)用之間出現(xiàn)失敗,CORBA stub實(shí)現(xiàn)了重新獲得另外一個(gè)home或者remote的邏輯.這個(gè)home或者remote來自從命名服務(wù)器返回的IOR里列出的一個(gè)替代服務(wù)器.
命名服務(wù)器本身就證實(shí)了中央集中JNDI樹集群的一個(gè)弱點(diǎn).如果你有特定的50臺機(jī)器的集群,之中有5臺是命名服務(wù)器,如果5臺命名服務(wù)器都down掉了,那么這個(gè)集群就變的沒什么用了.當(dāng)然,另外45臺機(jī)器能運(yùn)行,但是當(dāng)命名服務(wù)器down了,這個(gè)集群將不能為一個(gè)EJB客戶端服務(wù).
如果集群原先的命名服務(wù)器全部發(fā)生了失敗, 在線引進(jìn)一個(gè)額外的命名服務(wù)器就會出現(xiàn)另一個(gè)問題. 假如這樣做的話,一個(gè)新的中央集中命名服務(wù)器就需要集群里每個(gè)活動(dòng)機(jī)器綁定它的對象到新的命名服務(wù)器的JNDI樹.雖然當(dāng)綁定過程發(fā)生時(shí)開始收到請求是可能的,但不推薦這樣做,因?yàn)榻壎ㄟ^程延長了集群的恢復(fù)時(shí)間.此外,來自一個(gè)application或者applet的JNDI lookup,事實(shí)上出現(xiàn)了兩次網(wǎng)絡(luò)調(diào)用.第一個(gè)調(diào)用從命名服務(wù)器重新獲得一個(gè)對象的IOR,第二的調(diào)用從IOR里指定的一個(gè)服務(wù)器那重新獲得客戶端想要的對象.
最后,當(dāng)集群數(shù)量增長時(shí)中央集中JNDI樹的集群承擔(dān)收斂(Convergence)所帶來的增加時(shí)間.就是說當(dāng)你伸縮你的集群時(shí),你必須增加更多的命名服務(wù)器. 緊記命名服務(wù)器所在的機(jī)器和全部的集群機(jī)器通常公認(rèn)的比率是1:10,兩個(gè)命名服務(wù)器是最小數(shù)目.因此,如果你有一個(gè)10臺機(jī)器的集群和兩臺命名服務(wù)器,在服務(wù)器和命名服務(wù)器之間綁定的總數(shù)能達(dá)到20,在一個(gè)40臺機(jī)器的集群和四臺命名服務(wù)器里,會有160個(gè)綁定關(guān)系.每個(gè)綁定都表示其中一個(gè)成員服務(wù)器綁定所有的對象到一個(gè)命名服務(wù)器的JNDI樹的過程.記住,中央集中JDNI樹的集群在所有的JNDI集群實(shí)現(xiàn)之間具有更糟糕的收斂時(shí)間(Convergence time).
全局共享JNDI樹
最后,BEA Weblogic實(shí)現(xiàn)了一個(gè)全局共享的JNDI樹.用這種方式,當(dāng)集群里的一個(gè)服務(wù)器啟動(dòng)時(shí),通過IP廣播宣布它的存在并且把JNDI樹通知給集群里的其它服務(wù)器.群集里的每個(gè)機(jī)器既綁定它的對象到全局共享JNDI樹,又綁定到它自己的本地JNDI樹.
在每個(gè)成員服務(wù)器里都擁有一個(gè)全局的和本地的JNDI樹,允許生成的home和remote stubs失敗轉(zhuǎn)移,并且提供很快的進(jìn)程里的JNDI lookups. 全局共享JNDI樹在集群里的所有機(jī)器之間都是共享的,允許任何成員機(jī)器知道集群里所有對象的精確位置.如果在集群里的多個(gè)機(jī)器上對象是可用的,一個(gè)特殊的home對象被綁定到全局共享JNDI樹.這個(gè)特殊的home知道所有EJB對象和與它相關(guān)聯(lián)對象的位置, 也生成知道所有EJB對象和與它相關(guān)聯(lián)對象的位置的remote對象.
全局共享方式的主要不利方面:當(dāng)服務(wù)器啟動(dòng)時(shí)所產(chǎn)生的大量網(wǎng)絡(luò)初始化傳輸和集群的過分收斂時(shí)間(Convergence time).相反,在一個(gè)獨(dú)立JNDI樹的集群里, 由于沒有JNDI共享信息出現(xiàn),所以收斂并不被看做是個(gè)問題.然而,對集群里所有機(jī)器來說, 一個(gè)全局共享或者中央集中的集群,建立全局共享或者中央集中JNDI樹都需要花費(fèi)時(shí)間. 實(shí)際上,因?yàn)槿止蚕砑菏褂脧V播傳輸JNDI信息,建立全局共享JNDI樹所需的時(shí)間與以后增加的服務(wù)器數(shù)相比是線性相關(guān)的.
全局共享與中央集中JNDI樹的集群相比主要的好處集中在自由伸縮和高可用性.使用全局共享,你就不必在專門的命名服務(wù)器上亂動(dòng)CPU和RAM,不必在集群里調(diào)整命名服務(wù)器的數(shù)目.當(dāng)然,為了伸縮應(yīng)用程序,僅僅增加更多的機(jī)器就可以.此外,如果集群里的一些機(jī)器down掉了,集群將完全繼續(xù)起作用.最后,和在中央集中JNDI樹的集群里每個(gè)remote lookup都需要兩個(gè)網(wǎng)絡(luò)調(diào)用相比, 每個(gè)remote lookup都只需要一個(gè)單一的網(wǎng)絡(luò)調(diào)用.
所有這些都應(yīng)該打個(gè)折扣,不可全信.因?yàn)檫\(yùn)行在應(yīng)用服務(wù)器上的JSPs,servlets,EJBs,和JavaBeans可以共處在EJB服務(wù)器里.他們總是使用一個(gè)進(jìn)程里的JNDI lookup.緊記,如果你只運(yùn)行服務(wù)器端(server-side)應(yīng)用,那么在獨(dú)立的,中央集中的,或者全局共享的集群實(shí)現(xiàn)幾乎沒有什么差別. 實(shí)際上,每個(gè)HTTP請求在應(yīng)用服務(wù)器上都將結(jié)束,因?yàn)閼?yīng)用服務(wù)器將使用進(jìn)程里的JNDI lookup返回你server-side服務(wù)器里使用的一些對象.
集群和失敗轉(zhuǎn)移服務(wù).
在一臺機(jī)器上提供J2EE服務(wù)與通過集群提供相同的服務(wù)相比是微不足道,價(jià)值不高的.由于集群的復(fù)雜性,每個(gè)應(yīng)用服務(wù)器都以統(tǒng)一的方法實(shí)現(xiàn)群集組件.你應(yīng)當(dāng)理解提供商如何實(shí)現(xiàn)entity beans, stateless session beans, stateful session beans, 和JMS的群集和失敗轉(zhuǎn)移.許多提供商聲稱支持群集組件,但是他們所做的定義通常意味著涉及集群里運(yùn)行的組件.例如,BEA WebLogic Server 5.1支持群集stateful session beans但是如果bean實(shí)例所在的服務(wù)器失敗,bean的所有狀態(tài)都將丟失.客戶端然后將必須重新創(chuàng)建和重新駐留,在集群里這么做是沒用的.直到BEA WebLogic 6.0, stateful session beans才使用內(nèi)存復(fù)制來處理失敗轉(zhuǎn)移和群集.
所有的應(yīng)用服務(wù)器都支持EJB群集,但是在可配置的自動(dòng)失敗轉(zhuǎn)移方面存在著非常大的差別.實(shí)際上,一些應(yīng)用服務(wù)器依靠EJB客戶端的一些條件,不支持自動(dòng)的失敗轉(zhuǎn)移.例如, Sybase Enterprise Application Server通過你從數(shù)據(jù)庫或者系列化裝載bean的狀態(tài)來支持stateful session bean失敗轉(zhuǎn)移.就象上面提到的那樣, BEA WebLogic 6.0通過stateful session bean狀態(tài)的內(nèi)存復(fù)制支持stateful session bean的失敗轉(zhuǎn)移.大多數(shù)應(yīng)用服務(wù)器可以在集群里運(yùn)行JMS,但是不具有個(gè)別命名的主題(Topics)和隊(duì)列(Queues)負(fù)載均衡或失敗轉(zhuǎn)移,記住,你可能需要購買一個(gè)JMS的可群集實(shí)現(xiàn).比如說通過購買SonicMQ獲得Topics和Queues的負(fù)載均衡.
現(xiàn)在,我們轉(zhuǎn)到另外一個(gè)重要考慮的事情: HttpSession失敗轉(zhuǎn)移.
HttpSession失敗轉(zhuǎn)移
當(dāng)客戶端在原始的服務(wù)器上建立的一個(gè)session失敗時(shí),HttpSession失敗轉(zhuǎn)移允許客戶端從集群里的其他服務(wù)器無縫的取得session信息. BEA WebLogic Server實(shí)現(xiàn)了session信息的內(nèi)存復(fù)制,而HP Bluestone Total-e-Server有個(gè)為HA所做的備份,利用了一個(gè)中央集中session服務(wù)器. SilverStream Application Server和Sybase Enterprise Application Server利用一個(gè)所有應(yīng)用服務(wù)器都要讀寫的中央集中數(shù)據(jù)庫或者文件系統(tǒng).
數(shù)據(jù)庫/文件系統(tǒng)session持久性的主要缺點(diǎn)集中在當(dāng)存儲大的或者眾多的HttpSession對象時(shí)受限的伸縮性.一個(gè)用戶每次增加一個(gè)對象到HttpSession,在session里的所有對象都被系列化寫到一個(gè)數(shù)據(jù)庫或者共享文件系統(tǒng).大多數(shù)利用了數(shù)據(jù)庫session持久性的應(yīng)用服務(wù)器提倡最小限度的使用HttpSession存儲對象,但是這限制了你web應(yīng)用的架構(gòu)和設(shè)計(jì),尤其如果你正在使用HttpSession來存儲緩存的用戶數(shù)據(jù).
基于內(nèi)存的session持久性把內(nèi)存里的session信息存儲到備份服務(wù)器.這種方法存在兩種變化.第一個(gè)方法把HttpSession信息寫到一個(gè)中央集中的狀態(tài)服務(wù)器.集群里的所有機(jī)器把它們的HttpSession對象寫到這個(gè)服務(wù)器.在第二種方法里,每個(gè)集群節(jié)點(diǎn)選擇一個(gè)任意備份節(jié)點(diǎn)來存儲內(nèi)存里的session信息.用戶每次增加一個(gè)對象到HttpSession,那個(gè)對象獨(dú)自被序列化,然后從內(nèi)存里添加到一個(gè)備份服務(wù)器.
在這些方法中,如果集群里的服務(wù)器數(shù)低的話,這個(gè)專門的狀態(tài)服務(wù)器證明了比內(nèi)存復(fù)制到一個(gè)任意的備份服務(wù)器更好,因?yàn)闉榱耸聞?wù)處理和動(dòng)態(tài)頁面生成,它釋放了CPU周期.
另一方面,當(dāng)集群里的機(jī)器數(shù)變大時(shí),這個(gè)專門的狀態(tài)服務(wù)器會成為瓶頸,當(dāng)你增加更多的服務(wù)器時(shí),內(nèi)存復(fù)制到一個(gè)任意的備份服務(wù)器(相對于一個(gè)專門的狀態(tài)服務(wù)器來說)將線形伸縮.此外,當(dāng)你在集群里增加更多的機(jī)器時(shí),也需要你增加更多的RAM和CPUs來持續(xù)的調(diào)整這個(gè)狀態(tài)服務(wù)器.對于內(nèi)存復(fù)制到一個(gè)任意的備份服務(wù)器來說,你只需添加更多的機(jī)器,sessions可以均勻的把自己分布到集群里的所有機(jī)器上.
基于內(nèi)存的持久性提供了柔性的web應(yīng)用設(shè)計(jì),伸縮性和高可用性.
我們已經(jīng)解決了HttpSession的失敗轉(zhuǎn)移, 現(xiàn)在我們將研究單點(diǎn)失敗(single points of failure)
單點(diǎn)失敗(single points of failure)
沒有備份的集群服務(wù)以單點(diǎn)失敗而聞名.他們會引起整個(gè)集群或你的部分應(yīng)用失敗.例如, WebLogic JMS可以在集群里的單機(jī)上只有一個(gè)運(yùn)行的Topic. 你的應(yīng)用依賴JMS Topics,如果那臺機(jī)器發(fā)生死機(jī),你的集群將down掉直到另外一個(gè)WebLogic實(shí)例和那個(gè)JMS Topics一起啟動(dòng). (注意:當(dāng)開始新的實(shí)例時(shí), 只有持久信息將被發(fā)送.)
問問自己你的集群是否具有單點(diǎn)失敗,如果有的話,你需要估計(jì)基于你應(yīng)用的需求,是否可以忍受它們.
【J2EE應(yīng)用服務(wù)器集群簡介】相關(guān)文章:
J2EE應(yīng)用服務(wù)器03-29
J2EE技術(shù)簡介03-20
什么是J2EE03-16
j2ee介紹03-20
J2EE的概念03-19