| 2007-08-16 | ![]() ![]() |
| J2EE平臺提供了一個(gè)基于組件的方法,用來(lái)設計、開(kāi)發(fā)、裝配及部署企業(yè)應用程序。而且提供了一個(gè)多層的分布式的應用模型、組件的復用、一致化的安全模型以及靈活的事務(wù)控制模型。近年來(lái)在企業(yè)系統中得到了大量使用。隨著(zhù)J2EE應用服務(wù)器的大量部署和客戶(hù)訪(fǎng)問(wèn)量的猛增。企業(yè)對于J2EE系統的可伸縮性和高可用性要求越來(lái)越高,特別是在電子商務(wù)和金融領(lǐng)域,這個(gè)問(wèn)題越顯的突出。如何設計和構建一個(gè)具有可伸縮的,高可用性的J2EE集群應用服務(wù)器,成為設計J2EE應用服務(wù)器設計必須考慮的問(wèn)題。但J2EE應用服務(wù)器的集群是基于EJB組件的集群,和普通Web Server集群技術(shù)有很大的不同。實(shí)現的方法也根本不相同。 1 集群系統特點(diǎn) 一個(gè)集群系統是一群松散結合的服務(wù)器組,形成一個(gè)虛擬的服務(wù)器,為客戶(hù)端用戶(hù)提供統一的服務(wù)。對于這個(gè)客戶(hù)端來(lái)說(shuō),通常在訪(fǎng)問(wèn)集群系統時(shí)不會(huì )意識到它的服務(wù)是由具體的哪一臺服務(wù)器提供。集群系統一般應具高可用性、可伸縮性、負載均衡、故障恢復和可維護性等特殊性能。 高 可用性是集群系統最基本的要求,它是對整個(gè)系統運行穩定性的一個(gè)評價(jià)??缮炜s性是指整個(gè)系統在隨著(zhù)客戶(hù)端用戶(hù)數量的增加而繼續保持有效響應時(shí)間的能力。在 一個(gè)可伸縮性系統中,隨著(zhù)用戶(hù)數量的增加,有效響應時(shí)間變長(cháng),成線(xiàn)性變化關(guān)系,這也體現一個(gè)系統的峰值負載處理能力,但隨著(zhù)越來(lái)越多的系統處于Internet上, 用戶(hù)訪(fǎng)問(wèn)的峰值負載有效預測已變的不可能。用戶(hù)訪(fǎng)問(wèn)量的猛增,使系統的有效響應時(shí)間成非線(xiàn)性變化,響應時(shí)間急劇變長(cháng),知道系統不堪重負而停機。一般的解決 方法就是通過(guò)提升系統硬件系統,或通過(guò)增加服務(wù)器。但是不合理的增加服務(wù)器只能使整個(gè)集群系統變的越來(lái)越龐大,系統的這種復雜化就意味系統故障率變高,隨 之整個(gè)系統可靠性、可維護性都會(huì )降低。 所以,一個(gè)系統的可用性和可伸縮性是一對矛盾的關(guān)系,而且和整個(gè)集群系統的實(shí)現方法有很大的關(guān)系。 2 EJB技術(shù) EJB是J2EE應用平臺的核心。Sun在EJB2.0規范中對EJB定義如下:EJB是用于開(kāi)發(fā)和部署具多層結構的、分布式的、面向對象的Java應用系統跨平臺的構件體系結構。EJB組件有三中類(lèi)型:會(huì )話(huà)bean、實(shí)體bean、消息驅動(dòng)bean。其中會(huì )話(huà)bean分為有狀態(tài)和無(wú)狀態(tài)兩種。 EJB服務(wù)器的核心是提供EJB使用的一個(gè)或者多個(gè)EJB容器(Container)。EJB容器管理它所包含的EJB,為EJB組件的生存和執行提供了運行環(huán)境,同時(shí)也負責EJB的事務(wù)管理,安全管理,資源訪(fǎng)問(wèn)控制和一些異常處理。EJB容器不允許J2EE的客戶(hù)端程序直接訪(fǎng)問(wèn)容器中EJB對象,當一個(gè)客戶(hù)端用戶(hù)想訪(fǎng)問(wèn)一個(gè)EJB, EJB規范中要求客戶(hù)使用Java名字和目錄接口JNDI(Java Naming and Directory Interface)API來(lái)定位Bean的home接口。 要訪(fǎng)問(wèn)EJB一般需要經(jīng)過(guò)以下三步(見(jiàn)圖1)(下面只列舉Remote的調用): 1) 從JNDI中查找Bean的home接口。首先客戶(hù)需要獲得一個(gè)JNDI的初始化上下文,然后,客戶(hù)就可以使用上下文的lookup方法從一個(gè)名字對應到它的home接口; 2) 使用home接口中的Create()方法獲得Bean的Remote接口引用; 3) 通過(guò)Remote接口中的方法使用Bean中定義的方法; 一個(gè)簡(jiǎn)單訪(fǎng)問(wèn)例子如下: // 獲得JNDI初始化上下文 Context mycontext// 查找MyEJB,獲得Home對象的引用 Object homeref = mycontext.lookup(“MyEJB”); // Home對象造型為RMI-IIOP對象 MyBeanHome home = (MyBeanHome)PortableRemoteObject(homeref, MyBeanHome.Class); EJB對象,返回Remote接口 MyBeanRemote myref = home.create( ); //通過(guò)Remote接口調用EJB中實(shí)現的方法 System.out.println ( myref.getname( )); 3 EJB服務(wù)器集群 EJB服務(wù)器的集群是基于組件的一種集群方式,和普通Web Server集群技術(shù)有很大的不同。實(shí)現的方法也不相同。又由于EJB規范中沒(méi)有提供任何有關(guān)支持集群的標準,即使有的廠(chǎng)商在EJB服務(wù)器中提供了集群特性,但如何具體實(shí)現集群也是由廠(chǎng)商自己確定。實(shí)現的方法也各不相同。目前,大多數J2EE應用服務(wù)器都提供了集群功能,如Bea WebLogic應用服務(wù)器,開(kāi)放源碼的JBoss應用服務(wù)器,Sybase公司提供的J2EE應用服務(wù)器等都提供了集群功能。在EJB服務(wù)器集群設計 中,負載均衡(Load Balance),EJB集群和HttpSession集群技術(shù)是設計中涉及到的主要技術(shù)。其中EJB集群的實(shí)現是整個(gè)系統實(shí)現的核心。 3.1負載均衡(Load Balance) Load Balance 主要的目的在于將訪(fǎng)問(wèn)系統的負荷分散在不同的機器上,使整個(gè)系統吞吐量和并發(fā)性得到提高,它能讓多臺服務(wù)器共同承擔一些繁重的計算或任務(wù),從而消除網(wǎng)絡(luò )瓶頸,提高網(wǎng)絡(luò )的靈活性和可靠性。常見(jiàn)的方法如下: l 循環(huán)DNS DNS負載均衡是一種簡(jiǎn)單而有效的方法,該方法使用簡(jiǎn)單的域名查詢(xún)IP地址來(lái)實(shí)現一種簡(jiǎn)單的負載均衡。任意給出一個(gè)地址,DNS服務(wù)器都有一個(gè)IP地址池與之對應。每次請求將域名轉換成IP地址時(shí),循環(huán)返回IP地址池中的下一個(gè)地址。故被稱(chēng)作DNS round-robin。當一個(gè)Client訪(fǎng)問(wèn)時(shí),給請求JNDI的InitialContext客戶(hù)端傳遞一個(gè)DNS名,作為命名服務(wù)器的URL,每個(gè)名字被轉換成一個(gè)不同的地址,使用這個(gè)技術(shù),每個(gè)客戶(hù)端InitailContext請求就被直接發(fā)送到不同的服務(wù)器上。 負載均衡的一大缺點(diǎn)是:一旦某個(gè)服務(wù)器出現故障,即使及時(shí)修改了設置,還是要等待足夠的時(shí)間(因為需要一定的刷新時(shí)間)才能發(fā)揮作用,在此期間,有些客戶(hù)端用戶(hù)訪(fǎng)問(wèn)仍舊將發(fā)送故障服務(wù)器上。 l 軟件Proxy 軟件Proxy維護連接到一系列服務(wù)器上的打開(kāi)連接。當一個(gè)Client訪(fǎng)問(wèn)服務(wù)器時(shí),先要經(jīng)過(guò)這個(gè)軟件代理,這個(gè)代理能通過(guò)一些負載均衡的算法(如采用類(lèi)似DNS Round-robin、隨機方法、訪(fǎng)問(wèn)權衡算法 )把一個(gè)用戶(hù)的訪(fǎng)問(wèn)重新定向到一個(gè)服務(wù)器。這個(gè)軟件代理方法能夠及時(shí)發(fā)現服務(wù)器死機或沒(méi)有響應,有效地避免了DNS round-robin方法中出現地故障訪(fǎng)問(wèn)。 l 硬件均衡器 這種硬件均衡器一般采用地址轉換技術(shù),將一個(gè)外部地址映射為多個(gè)內部地址,對每次連接請求動(dòng)態(tài)使用其中一個(gè)內部地址,達到負載均衡的目的。一般可采用第四層(或4層以上)的交換機來(lái)實(shí)現,這種交換機是按照地址和端口進(jìn)行虛擬連接的交換,直接將數據包發(fā)送到目的計算機的相應端口。通過(guò)交換機就能將來(lái)自外部的初始連接請求,分別與內部的多個(gè)地址相聯(lián)系,從而建立虛擬連接實(shí)現負載均衡。這種第四層交換基于硬件芯片,因此網(wǎng)絡(luò )傳輸速度和交換速度遠遠超過(guò)普通軟件代理方式。如采用Cisco CSS 11150(一種L4 Switch)可以實(shí)現硬件均衡。 3.2 EJB 集群技術(shù) Client端要訪(fǎng)問(wèn)EJB容器中EJB都是先要先訪(fǎng)問(wèn)JNDI命名服務(wù)器[見(jiàn)2節EJB技術(shù)]。所以J2EE的EJB服務(wù)器的實(shí)現集群( Cluster)核心也就圍繞著(zhù)JNDI。根據集群對于JNDI命名樹(shù)在系統中管理和組織的不同,一般EJB集群可以分為下面三種: 1) JNDI樹(shù)代理(Proxy) Cluster中每個(gè)J2EE Application Server都維護一個(gè)自己的本地私有JNDI樹(shù),Cluster中的每個(gè)服務(wù)器不知道其它服務(wù)器的狀態(tài)和存在情況,只有Proxy服務(wù)知道Cluster中每個(gè)服務(wù)器的狀態(tài),并且可以訪(fǎng)問(wèn)Cluster中任何一個(gè)服務(wù)器上的JNDI樹(shù),這就要求每個(gè)服務(wù)器在啟動(dòng)和啟動(dòng)后要不斷地和Proxy服務(wù)保持聯(lián)系,以便Proxy知道它們的工作情況和Cluster所有的EJB對象。Client訪(fǎng)問(wèn)EJB對象,首先要訪(fǎng)問(wèn)JNDI Proxy,通過(guò)Proxy,可以重新定向訪(fǎng)問(wèn)到Cluster中所有的EJB對象(見(jiàn)圖2)。這種方法的優(yōu)點(diǎn)是實(shí)現簡(jiǎn)單,只需要設計一個(gè)JNDI Proxy代理。對于每個(gè)應用服務(wù)器不做復雜要求;而且系統的伸縮性好,要升級系統,只是簡(jiǎn)單增加服務(wù)器就可以。但這種方法有一個(gè)致命的缺點(diǎn),就是Proxy服務(wù)要是失敗,整個(gè)Cluster系統將無(wú)法正常工作,可靠性差。 2) 集中式JNDI樹(shù) 采用集中式集群時(shí),整個(gè)集群系統中僅有一個(gè)主命名服務(wù)器,它負責管理和維護集群中一個(gè)全局、集中的JNDI樹(shù),集群中所有的EJB服務(wù)器在啟動(dòng)后,都要把要發(fā)布的對象綁定在這臺命名服務(wù)器上,每個(gè)EJB服務(wù)器不需要維護自己的私有JNDI樹(shù),由這臺主命名服務(wù)器來(lái)維護。假如在集群中一個(gè)EJB要在多個(gè)服務(wù)器上部署,那么每個(gè)服務(wù)器可以把同一個(gè)home對象綁定到命名服務(wù)器上,當一個(gè)客戶(hù)從命名服務(wù)器請求訪(fǎng)問(wèn)這個(gè)EJB的home對象,可以將所有的home對象引用都返回給客戶(hù)端,或者可以按一種均衡算法返回一個(gè)服務(wù)器的home對象引用(見(jiàn)圖3)。這種集中式方法要提高整個(gè)系統可靠性,必須考慮命名服務(wù)器的備份問(wèn)題,往往在大系統同時(shí)采用多臺命名服務(wù)器,命名服務(wù)器間可以采用JNDI樹(shù)復制方式,或者采用EJB服務(wù)器在多臺服務(wù)器上綁定方式。例如Sybase公司的EJB應用服務(wù)器就是采用這種方式,它采用采用CORBA Cos Naming Service集中的管理Cluster中所有應用服務(wù)器的JNDI樹(shù)。采用這種集中式的設計模型,系統設計簡(jiǎn)單,但同時(shí)為系統帶來(lái)了集中式所固有的缺陷。首先,當系統設計中要考慮到命名服務(wù)器備份問(wèn)題,而且隨著(zhù)集群系統越來(lái)越大,命名服務(wù)器在整個(gè)系統種瓶頸問(wèn)題越顯突出。 3) 分布式JNDI樹(shù) 3.3 HttpSession Cluster 在J2EE的Web程序Jsp/Servlet中經(jīng)常用到Session對象,它的主要功能是記錄訪(fǎng)問(wèn)端客戶(hù)會(huì )話(huà)中有關(guān)信息。在一般的Web系統中,在Client訪(fǎng)問(wèn)階段,假設系統中Server端死機后,這次Client訪(fǎng)問(wèn)中Session中保留的相關(guān)信息將全部丟失。用戶(hù)下次訪(fǎng)問(wèn)就又需要重新開(kāi)始建立新的Session。HttpSession Cluster的目的就是即使服務(wù)器端系統死機重新啟動(dòng),上次未完成訪(fǎng)問(wèn)中的Session在系統中仍舊保存,Client可以接著(zhù)完成上次未完成的訪(fǎng)問(wèn)。 在一些大型的系統中,同時(shí)又成千上萬(wàn)的用戶(hù)同時(shí)訪(fǎng)問(wèn),要時(shí)實(shí)的保存所有Client端的Session信息,而且以保證一旦系統失效,系統會(huì )重新載入自己的Session狀態(tài),用戶(hù)能夠繼續操作。一般的實(shí)現HttpSession Cluster有下面兩種方法: 1) 采用內存復制: 在這個(gè)方法中,當某臺J2EE Server 中的某個(gè)HttpSession某個(gè)Object被修改后,或是新增一個(gè)Object后,這臺Server可以采用某種通訊方式(如IP Broadcast )將這個(gè)Object傳送到其它備份的J2EE Server上,讓其它 J2EE Server上相同的HttpSession同步變化。 2) 集中式: 所謂的集中式處理,與上面的內存復制方法非常相似,不同的是在集中式中,Session中的Object不是送到其它的Server上,而是送到一臺特定的機器上,在這臺機器上Object中的信息可以采用對象序列化后文件保存,或者抽象成數據后,保存到關(guān)系數據庫中。這臺機器集中管理所有Cluster中的所有Session狀態(tài)和信息。 4 結語(yǔ) 本文在對于集群系統的方法分析側重于JNDI樹(shù)的實(shí)現問(wèn)題,在實(shí)際的設計中還應該具體的考慮到兩種會(huì )話(huà)Bean,實(shí)體Bean和消息驅動(dòng)Bean對于集群方法實(shí)現的差異性以及它們的故障恢復技術(shù)。 |
聯(lián)系客服