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