我的CRC卡片盒

          zhangwen's blog

          應(yīng)用服務(wù)器集群、可用性與無(wú)session的企業(yè)應(yīng)用(一)

          本文目的

          本文的主要目的是討論企業(yè)應(yīng)用實(shí)現(xiàn)高可用性的方案。即如何在保證性能的同時(shí),使得應(yīng)用保持 24 小時(shí)的可用性。 為實(shí)現(xiàn)此目的,災(zāi)難恢復(fù)和性能問題的解決是必不可少的。本文僅就程序和應(yīng)用服務(wù)器兩方面進(jìn)行討論,不討論數(shù)據(jù)庫(kù)等相關(guān)的問題。

          1. ?? 災(zāi)難恢復(fù)

          所謂災(zāi)難恢復(fù)(僅對(duì) Web 應(yīng)用而言),是指在某個(gè)應(yīng)用失去響應(yīng)能力后(比如重啟),客戶端能立即透明的切換到冗余應(yīng)用。這一切換對(duì)客戶端來(lái)講應(yīng)該是感覺不到的。從技術(shù)上來(lái)講,就是客戶端在與服務(wù)器端進(jìn)行交互的過(guò)程中,客戶端在服務(wù)器端保存的狀態(tài)能立即切換到新的服務(wù)器上。在 web 應(yīng)用中,這些狀態(tài)一般保存在 http session 里。所以所謂狀態(tài)復(fù)制,一般來(lái)講就是 http session 復(fù)制。

          目前能提供災(zāi)難的方案之一是集群。對(duì)于 Weblogic ,集群的實(shí)現(xiàn)方式為 Paired servers replication


          cluster.JPG
          (圖片引自
          http://www.theserverside.com/articles/article.tss?l=J2EEClustering

          在這種實(shí)現(xiàn)方式里, session 只在相鄰的或者指定的兩個(gè) server 之間進(jìn)行復(fù)制,當(dāng)某一個(gè) server down 掉后,需要 servers 前端的 load balancer 知道哪一臺(tái) server 是這個(gè) Server1 paired backup server ,并將原來(lái)指向 Server1 的請(qǐng)求轉(zhuǎn)發(fā)給這臺(tái) paired backup server 。應(yīng)該說(shuō)這種復(fù)制策略是相當(dāng)高效的,但是對(duì)集群前端的路由要求比較高。

          2. ?? 性能

          企業(yè)應(yīng)用一般會(huì)跑在多臺(tái)服務(wù)器上。就性能而言,我們的期望自然是:總體性能 = 單臺(tái)服務(wù)器性能 X 服務(wù)器臺(tái)數(shù)。不過(guò)從上邊的說(shuō)明就能看出,集群中的每一臺(tái) server 都會(huì)有一部分性能耗費(fèi)在 session 復(fù)制上。耗費(fèi)的性能取決于 session 的大小。如果應(yīng)用中 session 保留了大量的數(shù)據(jù),或者用戶數(shù)量很多,損耗的性能也將相當(dāng)可觀。

          (有一種提升性能的方案是使用分布式的對(duì)象,例如 EJB ,根據(jù)對(duì)象耗費(fèi)性能的不同對(duì)其所在服務(wù)器進(jìn)行調(diào)整。不過(guò)這種方案早已充滿了極大的爭(zhēng)論。流行的觀點(diǎn)認(rèn)為,對(duì)于業(yè)務(wù)邏輯不是很復(fù)雜的應(yīng)用,使用分布式對(duì)象只會(huì)讓性能下降。因此下邊將不再討論。)

          3. ?? 維護(hù)

          從維護(hù)的角度上看,如果我們能不重啟應(yīng)用就能給應(yīng)用添加新的功能,或者修改已有的 bug ,那顯然相當(dāng) 8 錯(cuò)。

          分析

          根據(jù)上邊的說(shuō)明,我們可以初步得出幾個(gè)結(jié)論:

          1、? 要使用Weblogic集群所帶來(lái)的災(zāi)難恢復(fù)的好處,就必須忍受同時(shí)帶來(lái)的性能損失。

          2、? 在使用weblogic集群的同時(shí),我們必須擁有高性能的 Server 路由設(shè)備。

          3、? 使用weblogic集群,在重新部署應(yīng)用時(shí),由于不能重新部署 (redeploy) 集群下單臺(tái) server 的應(yīng)用,導(dǎo)致幾臺(tái) server 需要同時(shí)停掉應(yīng)用。當(dāng)所有的 server 全都陷入災(zāi)難中,災(zāi)難恢復(fù)也就失去了意義。

          ?

          那么,如何在實(shí)現(xiàn)災(zāi)難恢復(fù)和高性能的同時(shí),又能避免或者減少上邊列舉的損失呢?

          初步的思路可以有:

          ?

          1、? 如果我們能忍受某一臺(tái) server down 機(jī)后客戶狀態(tài)丟失的后果,那么最簡(jiǎn)單的方案就是停用集群,前端 load balancer 把相同 IP 的請(qǐng)求轉(zhuǎn)到相同的服務(wù)器。在重新部署應(yīng)用時(shí),分批重起不同 server 上的應(yīng)用。

          2、? 全部采用無(wú) session 策略。將客戶狀態(tài)保留在客戶端。這樣沒有Weblogic集群也就無(wú)所謂了。我們只需要一個(gè)普通的(分發(fā)器+失敗檢測(cè))將請(qǐng)求均勻的分發(fā)到可用的服務(wù)器上。

          ?

          posted on 2006-06-14 12:55 不知道叫啥好 閱讀(1843) 評(píng)論(12)  編輯  收藏

          評(píng)論

          # re: 提高企業(yè)應(yīng)用可用性的分析(一) 2006-06-14 13:50 charon

          災(zāi)難回復(fù)可能有更復(fù)雜的含義。
          在災(zāi)難恢復(fù)里面,應(yīng)用服務(wù)器級(jí)別的容錯(cuò)回復(fù)是最簡(jiǎn)單的(在集群服務(wù)的情形下,崩掉一兩臺(tái)不是什么大事情),稍微復(fù)雜一點(diǎn)的是數(shù)據(jù)庫(kù)服務(wù)器級(jí)別的,再?gòu)?fù)雜一點(diǎn),就是異地冗載了。
          如果要作數(shù)據(jù)庫(kù)級(jí)別的災(zāi)難回復(fù),可能必須要用到統(tǒng)一的中央存儲(chǔ)設(shè)備,如獨(dú)立的磁盤陣列之類的,而且必須實(shí)現(xiàn)同一陣列區(qū)域在不同服務(wù)器系統(tǒng)之間的切換(這個(gè)簡(jiǎn)單一點(diǎn))或者共享(沒試過(guò))。HA的配置比應(yīng)用服務(wù)器的集群配置要復(fù)雜很多,而且對(duì)系統(tǒng)的影響是深遠(yuǎn)的。  回復(fù)  更多評(píng)論   

          # re: 提高企業(yè)應(yīng)用可用性的分析(一) 2006-06-14 13:54 不知道叫啥好

          @charon
          你說(shuō)得對(duì),不過(guò)這里只打算對(duì)應(yīng)用和應(yīng)用服務(wù)器的情況做討論。這片東東只寫了一晚上,遣詞造句也沒有深究就拿出來(lái)了,難免有些差錯(cuò)。  回復(fù)  更多評(píng)論   

          # re: 提高企業(yè)應(yīng)用可用性的分析(一) 2006-06-14 14:11 狂人

          援引"Under the Hood of J2EE Clustering"的一句話:Failover can avoid errors completely. -- Negative.具體意思是:Remind that when I defined “failover”, I defined a condition for when the failover will happen: “between the method calls”. It means if you have two successive methods to a remote object, the failover will only happen after the first method call is finished successfully and before the second method request is sent out.
          So, what will happen if the remote server fails when the methods are in the middle of processing in the server? The answer is: the process will stop and the client will see error messages in most cases, unless the methods are idempotent (defined in the “basic terminology” section).Only if the methods are idempotent, some load balancers are smart enough to retry these methods and failover them to other instances.
          我很贊同他的觀點(diǎn).
          另外,根據(jù)我的項(xiàng)目經(jīng)歷,往往集群Appserver并不是真正瓶頸所在,真正瓶頸是在DBServer.  回復(fù)  更多評(píng)論   

          # re: 提高企業(yè)應(yīng)用可用性的分析(一) 2006-06-14 14:27 不知道叫啥好

          @狂人
          呵呵,這片文章本來(lái)是針對(duì)我們的項(xiàng)目寫的,大體改了改就拿出來(lái)了。我們項(xiàng)目的特點(diǎn)就是可用性要求高,但是數(shù)據(jù)庫(kù)操作卻很少。因此先假設(shè)數(shù)據(jù)庫(kù)這里不存在性能問題。實(shí)際上引起數(shù)據(jù)庫(kù)的原因很大程度是由蹩腳的sql,以及海量的數(shù)據(jù),但就不在討論范圍之列了。

          關(guān)于冪等性等問題,會(huì)在本文的后續(xù)中提到~

            回復(fù)  更多評(píng)論   

          # re: 提高企業(yè)應(yīng)用可用性的分析(一) 2006-06-14 14:54 langds

          如果撇開DB性能以及"冪等性"問題,那你的集群其實(shí)要考慮的東西就要會(huì)少了一大半.
          依我的經(jīng)驗(yàn)來(lái)看,最實(shí)用的做法就是直接在Appserver前加web server,該webServer起loadbanance和Httpserver的作用.他能自動(dòng)將不同的客戶端分發(fā)請(qǐng)求到相應(yīng)的Appserver上執(zhí)行,并且服務(wù)器間無(wú)需同步session狀態(tài),webserver能自動(dòng)定位到該客戶端最近一次請(qǐng)求的響應(yīng)AppServer,
          再者,對(duì)于你提供的同步部署問題,我認(rèn)為,只要不新增EJB之類的組件就無(wú)需重新部署應(yīng)用,直接替換相應(yīng)的CLASS或JAR包即可.
          如果一定要重新部署,就拿WAS來(lái)說(shuō)吧,它的所有集群成員都由ND?。觘rver管理,然么你只需要部署到ND后,由ND自動(dòng)同步一把即可.
          事實(shí)上,在真正需要集群的高并發(fā)應(yīng)用生產(chǎn)環(huán)境中是不可能常常重新部署整個(gè)應(yīng)用的.而且對(duì)熱替換的需求也并不會(huì)很明顯,因?yàn)樵谶@樣的環(huán)境里,要的就是穩(wěn)定和速度.  回復(fù)  更多評(píng)論   

          # re: 提高企業(yè)應(yīng)用可用性的分析(一) 2006-06-14 15:06 不知道叫啥好

          @langds
          “依我的經(jīng)驗(yàn)來(lái)看,最實(shí)用的做法就是直接在Appserver前加web server,該webServer起loadbanance和Httpserver的作用.他能自動(dòng)將不同的客戶端分發(fā)請(qǐng)求到相應(yīng)的Appserver上執(zhí)行,并且服務(wù)器間無(wú)需同步session狀態(tài),webserver能自動(dòng)定位到該客戶端最近一次請(qǐng)求的響應(yīng)AppServer, ”

          這也我提的方案之一亞。~不過(guò)不同步session,如何失敗恢復(fù)?另外web server 能自動(dòng)定位到該客戶端最近一次請(qǐng)求的響應(yīng)AppServer? langds能否具體說(shuō)以下?我只試過(guò)使用apache的mod_proxy,用robbin隨機(jī)分發(fā)。目前我們是使用硬件(四層交換機(jī))做到的這一點(diǎn)。  回復(fù)  更多評(píng)論   

          # re: 提高企業(yè)應(yīng)用可用性的分析(一) 2006-06-14 15:08 不知道叫啥好

          @langds

          另外weblogic在生產(chǎn)模式下不支持class的熱部署~
          我們也很希望它能像websphere那樣熱部署亞~  回復(fù)  更多評(píng)論   

          # re: 提高企業(yè)應(yīng)用可用性的分析(一) 2006-06-14 15:52 langds

          為什么一定要失敗恢復(fù)?如果真的是業(yè)務(wù)處理發(fā)生故障能做到真正恢復(fù)的可能性太小太?。谖业牡谝黄貜?fù)中已經(jīng)引用了"wangyu"所說(shuō)的話來(lái)說(shuō)明問題.

          另外:為什么要class熱部署?我們WAS在生產(chǎn)環(huán)境里都是將改功能禁止了的,還是那句話,要的是穩(wěn)定,安全和速度.  回復(fù)  更多評(píng)論   

          # re: 應(yīng)用服務(wù)器集群、可用性與無(wú)session的企業(yè)應(yīng)用(一) 2006-06-14 16:02 不知道叫啥好

          @langds
          至少我要做到,從這個(gè)server跳到那個(gè)server,本來(lái)登陸的狀態(tài)不能變成注銷吧

          另外能否具體說(shuō)下web server 如何自動(dòng)定位到該客戶端最近一次請(qǐng)求的響應(yīng)AppServer? 多謝!  回復(fù)  更多評(píng)論   

          # re: 應(yīng)用服務(wù)器集群、可用性與無(wú)session的企業(yè)應(yīng)用(一) 2006-06-14 16:24 langds

          我對(duì)weblogic不是很熟悉,就說(shuō)我用的was吧,WAS自學(xué)的IBMHttpServer 可以根據(jù)客戶端的標(biāo)識(shí)定位到最近一次請(qǐng)求響應(yīng)的APPSERVER.,所以如果是在WAS環(huán)境里,你所考慮的SESSION問題有些多余.
          另外,WEBLOGIC好像也有自己的集群代理SERVER,不知道你自己有沒有親自實(shí)驗(yàn)過(guò),所有的HTTPSERVER集群控制器都擁有請(qǐng)求重定位功能.  回復(fù)  更多評(píng)論   

          # re: 應(yīng)用服務(wù)器集群、可用性與無(wú)session的企業(yè)應(yīng)用(一) 2006-06-14 16:33 不知道叫啥好

          @langds
          weblogic的集群代理server就是一個(gè)servlet,也能實(shí)現(xiàn)這個(gè)功能,但是性能太差,達(dá)不到生產(chǎn)級(jí)的要求~所以bea給人作方案時(shí),都是推薦用F5來(lái)分發(fā)~

          想起來(lái)IBMHttpServer了……,跟was結(jié)合的很好,又是apache的底子,越發(fā)羨慕was了~  回復(fù)  更多評(píng)論   

          # re: 應(yīng)用服務(wù)器集群、可用性與無(wú)session的企業(yè)應(yīng)用(一) 2006-06-14 17:49 寒晴天

          開始行動(dòng)  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          <2006年6月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          統(tǒng)計(jì)

          常用鏈接

          留言簿(2)

          隨筆檔案(3)

          文章分類

          Programmer

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 织金县| 襄垣县| 全州县| 富平县| 明水县| 永丰县| 安丘市| 营山县| 许昌县| 寿宁县| 巴林右旗| 奉贤区| 吴桥县| 蚌埠市| 磐石市| 丽江市| 任丘市| 文山县| 兴城市| 江口县| 大庆市| 同心县| 崇明县| 广汉市| 柏乡县| 同江市| 佛山市| 若羌县| 闸北区| 孟津县| 越西县| 麟游县| 凤山市| 吉木萨尔县| 石狮市| 嵊州市| 馆陶县| 高清| 永靖县| 富宁县| 嘉禾县|