注意以下幾點(diǎn):(目前只想到這些)
1、往session里邊放的東東要實(shí)現(xiàn)序列化的接口(session復(fù)制用)
2、因?yàn)閟ession要復(fù)制,所以session里邊的東西要盡可能的少,否則可能集群性能還不如單機(jī)
3、集群下沒有真正單例的實(shí)現(xiàn),所以不要用單態(tài)模式來保存集群內(nèi)所有服務(wù)器都需要的狀態(tài),比如程序的某個(gè)全局變量,可以考慮用jndi來實(shí)
現(xiàn)。不過相信好的程序這么做的并不多。
4、同步問題也要注意~比如不要試圖用加同步來實(shí)現(xiàn)取得最大id這樣的操作,可以通過保存到數(shù)據(jù)庫的手段來解決這個(gè)問題
5.特別要注意緩存的情況,大部分開源的緩存實(shí)現(xiàn)是不支持集群的。這時(shí)候要全面考慮你需要的緩存情況再定奪。比較省事的辦法是不用緩存
(緩存的作用不是任何時(shí)候都很大,比如客戶查詢?cè)捹M(fèi)祥單記錄,越加緩存越壞事)。如果對(duì)數(shù)據(jù)實(shí)時(shí)性要求不算高那也好說,定期的重建緩
存就是了。如果都不行,只有使用jboss cache等支持集群的cache實(shí)現(xiàn)。或者采用某些商業(yè)性的實(shí)現(xiàn)。
------------------------
weblogic的分發(fā)是怎么實(shí)現(xiàn)的:
1、實(shí)現(xiàn)請(qǐng)求的分發(fā),可以靠硬件(高層交換機(jī)),也可以靠weblogic自己。一般的是新建一個(gè)proxy分發(fā)域,然后其中部署一個(gè)proxy應(yīng)用,利
用weblogic.servlet.proxy.HttpClusterServlet將請(qǐng)求分發(fā)到不同的server。
2、分發(fā)的過程是這樣的(不管是交換機(jī)還是weblogic):
數(shù)個(gè)請(qǐng)求發(fā)過來,先判斷一下請(qǐng)求的ip地址,將ip地址相同的發(fā)送到同一臺(tái)server,不同的ip根據(jù)分發(fā)策略分發(fā)到不同的server.
如果一臺(tái)server不可用,請(qǐng)求將不會(huì)發(fā)送至這一臺(tái)server.原本發(fā)送至這臺(tái)不可用server的請(qǐng)求將被發(fā)送至此server session復(fù)制目的地
server.(到底是哪一臺(tái)看相應(yīng)的復(fù)制策略)。這樣,客戶端session也就不會(huì)失效,這一過程對(duì)客戶是透明的。呵呵,不知道這樣算不算是
failover
------------------------
Web只是EJb的一種客戶端,RMI/XML-RPC/Web Service/Corba都是EJB企業(yè)應(yīng)用服務(wù)器的客戶端。
------------------------
Session Replication 絕對(duì)不是為負(fù)載平衡用的。絕大多數(shù)情況下,負(fù)載平衡器都有一個(gè)基本特性叫做“Session Affinity”。也就是說,同
一個(gè)SESSION,即使在負(fù)載平衡的情況下,也是由同一個(gè)節(jié)點(diǎn)來提供服務(wù)的。這是性能優(yōu)化的必然要求。
這首先要從SESSION REPLICATION的機(jī)制說起來。SESSION 復(fù)制發(fā)生的時(shí)間順訊可能有兩種:1。每次請(qǐng)求都復(fù)制。2。定時(shí)復(fù)制。第一種情況可
以基本保障節(jié)點(diǎn)之間SESSION狀態(tài)在絕大多數(shù)情況下是同步的,但是這樣做的潛在性能代價(jià)非常高。
以上說明,從應(yīng)用層面上看,“任何時(shí)間主從節(jié)點(diǎn)狀態(tài)都同步”的要求是基本上不可能達(dá)到的。直接邏輯結(jié)論就是,主服務(wù)節(jié)點(diǎn)的重新導(dǎo)向不
能在任意時(shí)間發(fā)生。這就是為什么要有SESSION AFFINITY。
AFFINITY在系統(tǒng)軟件是一個(gè)普遍應(yīng)用的優(yōu)化技術(shù)。多CPU操作系統(tǒng),比如WINDOWS,UNIX,LINUX,相應(yīng)地有“PROCESS AFFINITY,THREAD AFFINITY
”的概念,基本上出于同樣的原理。CPU的L1 CACHE,在這里就對(duì)應(yīng)于我們的SESSION STATE。為了不造成頻繁的緩存沖洗,OS就要保證PROCESS
被綁定在一個(gè)CPU上。
SESSION AFFINITY實(shí)現(xiàn)的方式,取決于不同的應(yīng)用服務(wù)器是不同的。軟件負(fù)載平衡器一般是應(yīng)用服務(wù)器的一個(gè)WEB SERVER插件。這個(gè)插件里就
內(nèi)建了SESSION AFFINITY邏輯。硬件負(fù)載平衡器也支持SESSION AFFINITY,當(dāng)然這需要一些配置。詳見(http://e-
docs.bea.com/wls/docs81/cluster/load_balancing.html#1044135)
------------------------
綜上,負(fù)載平衡在絕大多數(shù)情況下,只發(fā)生在建立SESSION之前。一旦SESSION建立,那么SESSION AFFINITY會(huì)保障同一SESSION綁定在一個(gè)節(jié)點(diǎn)
上。而SESSION REPLICATION的目的,是在發(fā)生FAIL-OVER的情況下,會(huì)話狀態(tài)不會(huì)丟失,也就是BANQ說的“用戶沒有感覺”。
要對(duì)每次請(qǐng)求都做負(fù)載平衡,有兩種選擇:1。你完全不計(jì)較性能,通過配置保證每個(gè)請(qǐng)求都做狀態(tài)復(fù)制。這不是每款應(yīng)用服務(wù)器都支持的。這
方面沒有什么JSR標(biāo)準(zhǔn)。2。你的應(yīng)用完全是“應(yīng)用服務(wù)器無會(huì)話狀態(tài)”的。也就是說,所有的會(huì)話狀態(tài)存在數(shù)據(jù)庫或者客戶端。這種架構(gòu)并不
適用于所有的應(yīng)用。商業(yè)企業(yè)應(yīng)用大多數(shù)都有相當(dāng)數(shù)量的會(huì)話狀態(tài)和CONTEXT狀態(tài),采用數(shù)據(jù)庫狀態(tài)會(huì)帶來頻繁的數(shù)據(jù)庫操作,而客戶端狀態(tài)首
先未必能夠容納那么多數(shù)據(jù),即使能夠容納,每次請(qǐng)求都要附帶大量狀態(tài)數(shù)據(jù),會(huì)對(duì)網(wǎng)絡(luò)傳輸造成壓力。
------------------------
1。所謂狀態(tài)恢復(fù),就是通過狀態(tài)復(fù)制實(shí)現(xiàn)的。狀態(tài)復(fù)制不一定要在兩個(gè)節(jié)點(diǎn)之間。比如WEBSPHERE,就是把狀態(tài)復(fù)制到數(shù)據(jù)庫。在WEBSPHERE里
,狀態(tài)復(fù)制有兩種方式,通過內(nèi)存復(fù)制(類似WEBLOGIC),或者通過數(shù)據(jù)庫永久化。無論那種方式,對(duì)于應(yīng)用而言都是透明的,目的都是在
FAIL-OVER情況下實(shí)現(xiàn)透明的狀態(tài)恢復(fù)。
2。EJB的負(fù)載平衡,也不是所謂“時(shí)時(shí)刻刻都在發(fā)生”。EJB的負(fù)載平衡,同樣有“SESSION AFFINITY”的優(yōu)化,當(dāng)然這是針對(duì)于SFSB。對(duì)于
SLSB而言,既然沒有狀態(tài),和WEB負(fù)載平衡就不具備可比性。
EJB的負(fù)載平衡,不但在概念上,甚至在算法上,實(shí)現(xiàn)上,都和WEB集群完全一致。
并且,EJB的負(fù)載平衡和 WEB負(fù)載平衡相比,作用要小得多。這樣說的原因:
第一:絕大多數(shù)生產(chǎn)環(huán)境里,EJB的客戶端是WEB,并且EJB和WEB是共同部署。也就是說,如果EJB容器死了,那么WEB容器肯定也死了。EJB的負(fù)
載平衡邏輯是建入在STUB里的。既然WEB已經(jīng)死了,那么STUB也就不存在了。談何EJB負(fù)載平衡?
第二,LOCAL EJB是沒有集群功能的。
第三,ENTITY EJB是沒有集群功能的。
第四,在WEB,EJB共同部署的情況下,即使WEB訪問EJB是通過REMOTE INTERFACE, 應(yīng)用服務(wù)器也會(huì)做優(yōu)化,把訪問當(dāng)作類似LOCAL INTERFACE的
方式處理(目的是為了省略不必要的對(duì)象序列化)。這樣獲得的STUB有目的地關(guān)閉了集群邏輯。原因在一中已經(jīng)描述。
所以,EJB的集群,只在下面的情況下才會(huì)發(fā)生:
REMOTE SESSION BEAN(STATEFUL或者STATELESS), 并且客戶端不部署在同一JVM里。即使在這樣的情況下,EJB開發(fā)者還要保證EJB方法是
IDEMPOTENT的。
EJB集群。WEB集群二者的實(shí)現(xiàn),在代碼層面都是用同樣的代碼,何來一者簡(jiǎn)陋另一者高級(jí)?
----------------------
1。從負(fù)載平衡的實(shí)現(xiàn)機(jī)制角度講,沒有人說WEB負(fù)載平衡算法只有ROUND ROBIN一種?;贑PU負(fù)載的平衡算法,也就是BANQ稱作“EJB集群的智
能”,同樣也適用于WEB負(fù)載平衡。這一點(diǎn)上EJB集群和WEB集群毫無區(qū)別。
BANQ所謂“EJB集群的智能”,有兩個(gè)要求:CPU負(fù)荷檢測(cè),和請(qǐng)求重定向。這兩個(gè)要求,WEB容器都可以輕松實(shí)現(xiàn)。有什么理由認(rèn)為EJB容器可
以做到這些而WEB容器不能?請(qǐng)問BANQ,這兩點(diǎn)中哪一點(diǎn)是WEB容器不可實(shí)現(xiàn)的?
2。從CPU負(fù)載分布模式看, BANQ描述的WEB集群情況下大負(fù)荷請(qǐng)求重復(fù)定向給同一節(jié)點(diǎn)的問題,同樣也適用于EJB集群。BANQ描述的WEB負(fù)載分
配所可能出現(xiàn)的問題(大負(fù)荷請(qǐng)求重復(fù)發(fā)向同一節(jié)點(diǎn)),其根本假設(shè)是WEB請(qǐng)求的CPU負(fù)荷模式很不均勻。請(qǐng)問,同樣的假設(shè)難道不適用于EJB?
難道EJB的CPU負(fù)荷模式莫名其妙地會(huì)比WEB請(qǐng)求更均勻?另外,這種情況,是計(jì)算機(jī)科學(xué)中負(fù)載平衡方面的經(jīng)典病理情況,有多種方法解決。最
簡(jiǎn)單的就是所有服務(wù)器都支持的隨機(jī)平衡算法。更重要的,隨機(jī)平衡算法也是WEB和EJB集群都支持的算法。
負(fù)載平衡不是什么EJB獨(dú)有的特殊算法。EJB負(fù)載平衡算法基本上都是計(jì)算機(jī)科學(xué)里大家耳熟能詳?shù)臇|西。EJB和WEB在負(fù)載平衡方面,無論機(jī)理
還是算法,都是一致的。BANQ似乎認(rèn)為EJB集群的優(yōu)勢(shì)在于EJB集群能夠根據(jù)CPU負(fù)荷進(jìn)行重新負(fù)荷分配而WEB集群不具備這個(gè)功能。這是完全而
徹底的誤解。
3。從生產(chǎn)環(huán)境的現(xiàn)實(shí)角度看,這種“基于CPU負(fù)荷重新分配負(fù)載”的行為,雖然實(shí)現(xiàn)起來并不難,卻沒有多少實(shí)用價(jià)值。理論分析,模擬數(shù)據(jù)
和生產(chǎn)實(shí)踐都表明,ROUND ROBIN,RANDOM, 和根據(jù)負(fù)荷的“自適應(yīng)反饋算法”,在性能方面沒有很大區(qū)別。這是 相關(guān)數(shù)據(jù)在多數(shù)操作系統(tǒng)或
者計(jì)算機(jī)網(wǎng)絡(luò)教科書里都有描述。這聽起來似乎有些奇怪,但不過是“大數(shù)定理”的必然結(jié)果。
4。從現(xiàn)實(shí)商業(yè)服務(wù)器支持角度看:BANQ描述的“根據(jù)CPU重新分配負(fù)荷”的行為,至少在WEBLOGIC, WEBSPHERE兩者都不支持。Weblogic和
WebSphere只支持 Round Robin, 加權(quán) Round Robin和隨機(jī) 這三種算法(Web集群和EJB集群都一樣?。?。 JBoss支持一種“First Available”
的算法,但實(shí)質(zhì)上是隨機(jī)算法。
當(dāng)然,WebLogic允許用戶自己開發(fā)和定制負(fù)載分配算法,但是未見有記錄表明用戶通過自定義負(fù)載分配算法提高了性能的。否則,IBM,BEA,
JBOSS會(huì)只支持這三種算法么?
并且,對(duì)于 WEBLOGIC 和 WEBSPHERE, 缺省狀況下即使是 REMOTE EJB , 在JNDI解析時(shí)也會(huì)被“本地優(yōu)先”,根本不會(huì)做負(fù)載平衡。
再者,一旦會(huì)話建立,后續(xù)請(qǐng)求會(huì)由于“Session Affinity”優(yōu)化而綁定在同一節(jié)點(diǎn),也不會(huì)做負(fù)載平衡。
----------------
JNDI查詢的是HOME INTERFACE STUB。FAILOVER邏輯,在WEBLOGIC和JBOSS上,是建入在智能REMOTE STUB里的,在WEBSPHERE上是建入在代理服
務(wù)器上,JES是建入在IIOP運(yùn)行庫里, 和JNDI都?jí)焊淮罱纭?br>JNDI是不會(huì)根據(jù)集群運(yùn)行狀況而返回一個(gè)不同的STUB的。
EJB的最初設(shè)計(jì)思想是“地點(diǎn)透明”(SESSION BEAN,也可以說是分布計(jì)算吧),和關(guān)系數(shù)據(jù)對(duì)象化(ENTITY BEAN),根本不是由“集群”驅(qū)
動(dòng)的。
1。從負(fù)載平衡的實(shí)現(xiàn)機(jī)制角度講,沒有人說WEB負(fù)載平衡算法只有ROUND ROBIN一種?;贑PU負(fù)載的平衡算法,也就是BANQ稱作“EJB集群的智
能”,同樣也適用于WEB負(fù)載平衡。這一點(diǎn)上EJB集群和WEB集群毫無區(qū)別。
BANQ所謂“EJB集群的智能”,有兩個(gè)要求:CPU負(fù)荷檢測(cè),和請(qǐng)求重定向。這兩個(gè)要求,WEB容器都可以輕松實(shí)現(xiàn)。有什么理由認(rèn)為EJB容器可
以做到這些而WEB容器不能?請(qǐng)問BANQ,這兩點(diǎn)中哪一點(diǎn)是WEB容器不可實(shí)現(xiàn)的?
2。從CPU負(fù)載分布模式看, BANQ描述的WEB集群情況下大負(fù)荷請(qǐng)求重復(fù)定向給同一節(jié)點(diǎn)的問題,同樣也適用于EJB集群。BANQ描述的WEB負(fù)載分
配所可能出現(xiàn)的問題(大負(fù)荷請(qǐng)求重復(fù)發(fā)向同一節(jié)點(diǎn)),其根本假設(shè)是WEB請(qǐng)求的CPU負(fù)荷模式很不均勻。請(qǐng)問,同樣的假設(shè)難道不適用于EJB?
難道EJB的CPU負(fù)荷模式莫名其妙地會(huì)比WEB請(qǐng)求更均勻?另外,這種情況,是計(jì)算機(jī)科學(xué)中負(fù)載平衡方面的經(jīng)典病理情況,有多種方法解決。最
簡(jiǎn)單的就是所有服務(wù)器都支持的隨機(jī)平衡算法。更重要的,隨機(jī)平衡算法也是WEB和EJB集群都支持的算法。
負(fù)載平衡不是什么EJB獨(dú)有的特殊算法。EJB負(fù)載平衡算法基本上都是計(jì)算機(jī)科學(xué)里大家耳熟能詳?shù)臇|西。EJB和WEB在負(fù)載平衡方面,無論機(jī)理
還是算法,都是一致的。BANQ似乎認(rèn)為EJB集群的優(yōu)勢(shì)在于EJB集群能夠根據(jù)CPU負(fù)荷進(jìn)行重新負(fù)荷分配而WEB集群不具備這個(gè)功能。這是完全而
徹底的誤解。
3。從生產(chǎn)環(huán)境的現(xiàn)實(shí)角度看,這種“基于CPU負(fù)荷重新分配負(fù)載”的行為,雖然實(shí)現(xiàn)起來并不難,卻沒有多少實(shí)用價(jià)值。理論分析,模擬數(shù)據(jù)
和生產(chǎn)實(shí)踐都表明,ROUND ROBIN,RANDOM, 和根據(jù)負(fù)荷的“自適應(yīng)反饋算法”,在性能方面沒有很大區(qū)別。這是 相關(guān)數(shù)據(jù)在多數(shù)操作系統(tǒng)或
者計(jì)算機(jī)網(wǎng)絡(luò)教科書里都有描述。這聽起來似乎有些奇怪,但不過是“大數(shù)定理”的必然結(jié)果。
4。從現(xiàn)實(shí)商業(yè)服務(wù)器支持角度看:BANQ描述的“根據(jù)CPU重新分配負(fù)荷”的行為,至少在WEBLOGIC, WEBSPHERE兩者都不支持。Weblogic和
WebSphere只支持 Round Robin, 加權(quán) Round Robin和隨機(jī) 這三種算法(Web集群和EJB集群都一樣!)。 JBoss支持一種“First Available”
的算法,但實(shí)質(zhì)上是隨機(jī)算法。
當(dāng)然,WebLogic允許用戶自己開發(fā)和定制負(fù)載分配算法,但是未見有記錄表明用戶通過自定義負(fù)載分配算法提高了性能的。否則,IBM,BEA,
JBOSS會(huì)只支持這三種算法么?
并且,對(duì)于 WEBLOGIC 和 WEBSPHERE, 缺省狀況下即使是 REMOTE EJB , 在JNDI解析時(shí)也會(huì)被“本地優(yōu)先”,根本不會(huì)做負(fù)載平衡。
再者,一旦會(huì)話建立,后續(xù)請(qǐng)求會(huì)由于“Session Affinity”優(yōu)化而綁定在同一節(jié)點(diǎn),也不會(huì)做負(fù)載平衡。
--------------------------------------------------------------------------------------
http://www.jdon.com/jive/thread.jsp?forum=46&thread=23302&start=0&msRange=15
致謝: Kyle Yin ;彭晨陽(網(wǎng)名: 板橋里人)
http://www.jdon.com/
注:以上文章觀點(diǎn),搜集而成,僅代表個(gè)人理解,歡迎討論學(xué)習(xí)!
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=574106
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1774446