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