《大型網(wǎng)站技術(shù)架構(gòu)》萬(wàn)無(wú)一失之網(wǎng)站的高可用架構(gòu)(2)

一、可用性度量與考核

首先,不得不說(shuō):要保證一個(gè)網(wǎng)站永遠(yuǎn)完全可用幾乎是一件不可能完成的任務(wù)(Mission Impossible,是不是有點(diǎn)碟中諜的感覺(jué))。

? ?。?)如何度量網(wǎng)站可用性?

  一個(gè)神奇的數(shù)字—9!你有幾個(gè)9,就代表了你的可用性。例如QQ可用性達(dá)到了4個(gè)9:99.99%

①2個(gè)9=基本可用  ②3個(gè)9=較高可用 ?、?個(gè)9=具有自動(dòng)恢復(fù)能力的高可用 ?、?b>5個(gè)9=極高可用->理想狀態(tài)

  那么,可用性的9又是怎么計(jì)算出來(lái)的呢:

 ?、倬W(wǎng)站不可用時(shí)間=故障修復(fù)時(shí)間點(diǎn)-故障發(fā)現(xiàn)時(shí)間點(diǎn)

  ②網(wǎng)站年度可用性指標(biāo)=(1-網(wǎng)站不可用時(shí)間/年度總時(shí)間)*100%

 ?。?)如何考核網(wǎng)站可用性?

廣泛采用故障分的,它是對(duì)網(wǎng)站故障進(jìn)行分類加權(quán)計(jì)算故障責(zé)任的方法。一般會(huì)給每個(gè)分類的故障設(shè)置一個(gè)權(quán)重(例如事故級(jí)故障權(quán)重為100,A類為20等),其計(jì)算公式為:故障分=故障時(shí)間(分鐘)*故障權(quán)重。公司對(duì)技術(shù)團(tuán)隊(duì)的考核一般會(huì)參考故障分,例如某團(tuán)隊(duì)今年發(fā)生了幾個(gè)事故級(jí)故障,那么其績(jī)效考核估計(jì)受到很大影響,年終獎(jiǎng)什么的就悲劇了。

二、高可用的架構(gòu)

目前,通常企業(yè)級(jí)應(yīng)用系統(tǒng)(特別是政府部門和大企業(yè)的應(yīng)用系統(tǒng))一般會(huì)采用安規(guī)的軟硬件設(shè)備,如IOE(IBM的小型機(jī)、Oracle數(shù)據(jù)、EMC存儲(chǔ)設(shè)備)系列。而一般互聯(lián)網(wǎng)公司更多地采用PC級(jí)服務(wù)器(x86),開(kāi)源的數(shù)據(jù)庫(kù)(MySQL)和操作系統(tǒng)(Linux)組建廉價(jià)且高容錯(cuò)(硬件故障是常態(tài))的應(yīng)用集群。

  (1)設(shè)計(jì)的目的?

保證服務(wù)器硬件故障服務(wù)依然可用,數(shù)據(jù)依然保存并能夠被訪問(wèn)。

  (2)主要的手段?

數(shù)據(jù)和服務(wù)的①冗余備份以及②失效轉(zhuǎn)移

  對(duì)于服務(wù)而言,一旦某個(gè)服務(wù)器宕機(jī),就將服務(wù)切換到其他可用的服務(wù)器上;

  對(duì)于數(shù)據(jù)而言,如果某個(gè)磁盤損壞,就從備份的磁盤(事先就做好了數(shù)據(jù)的同步復(fù)制)讀取數(shù)據(jù)。

三、高可用的應(yīng)用

應(yīng)用層處理網(wǎng)站應(yīng)用的業(yè)務(wù)邏輯,應(yīng)用的一個(gè)最顯著的特點(diǎn)是:應(yīng)用的無(wú)狀態(tài)性

PS:提到無(wú)狀態(tài)特性,不得不說(shuō)下Http協(xié)議。我們常常聽(tīng)到說(shuō),Http是一個(gè)無(wú)狀態(tài)協(xié)議,同一個(gè)會(huì)話的連續(xù)兩個(gè)請(qǐng)求互相不了解,他們由最新實(shí)例化的環(huán)境進(jìn)行解析,除了應(yīng)用本身可能已經(jīng)存儲(chǔ)在全局對(duì)象中的所有信息外,該環(huán)境不保存與會(huì)話有關(guān)的任何信息。之所以我們?cè)谑褂肁SP.NET WebForm開(kāi)發(fā)中會(huì)感覺(jué)不到Http的無(wú)狀態(tài)特性,完全是因?yàn)镸icrosoft幫我們實(shí)現(xiàn)了ViewState,它是ASP.NET WebForm中保存頁(yè)面信息的基本單位,本質(zhì)是一個(gè)HTML中的隱藏域,回調(diào)時(shí)會(huì)將這個(gè)隱藏域中的數(shù)據(jù)提交到服務(wù)器端。

(1)通過(guò)負(fù)載均衡進(jìn)行無(wú)狀態(tài)服務(wù)的失效轉(zhuǎn)移

 ?。?)應(yīng)用服務(wù)器集群的Session管理

首先,不得不說(shuō)的是:Web應(yīng)用中將上下文對(duì)象稱為會(huì)話(Session),單機(jī)情況下由部署在服務(wù)器上得Web容器(如IIS、Tomcat、JBoss等)管理。在使用了負(fù)載均衡的集群環(huán)境中,由于請(qǐng)求的分發(fā)是隨機(jī)的,所以保證每次請(qǐng)求依然能夠獲得正確的Session比單機(jī)時(shí)要復(fù)雜得多。

  其次,我們來(lái)看看在集群環(huán)境中,Session管理的幾種常見(jiàn)手段。

①Session復(fù)制:該方案簡(jiǎn)單易行,集群中的幾臺(tái)服務(wù)器之間同步Session對(duì)象,任何一臺(tái)服務(wù)器宕機(jī)都不會(huì)導(dǎo)致Session對(duì)象的丟失,服務(wù)器也只需要從本機(jī)獲取即可。但是,該方案只適合集群規(guī)模較小的情況下。當(dāng)規(guī)模較大時(shí),大量的Session復(fù)制操作會(huì)占用服務(wù)器和網(wǎng)絡(luò)的大量資源,系統(tǒng)不堪重負(fù)。

②Session綁定:利用負(fù)載均衡的源地址Hash算法,總是將源于同一IP地址的請(qǐng)求分發(fā)到同一臺(tái)服務(wù)器上。這樣的話,在整個(gè)會(huì)話期間,用戶所有的請(qǐng)求都在同一臺(tái)服務(wù)器上進(jìn)行處理,即Session綁定在某臺(tái)特定服務(wù)器上,保證Session總能在這臺(tái)服務(wù)器上獲取。(這種方案又叫做會(huì)話粘滯)。

但是,這種方案不符合高可用的需求。因?yàn)橐坏┠撑_(tái)服務(wù)器宕機(jī),那么該機(jī)器上得Session也就不復(fù)存在了,用戶請(qǐng)求切換到其他機(jī)器后因?yàn)闆](méi)有Session而無(wú)法完成業(yè)務(wù)處理。因此,很少有網(wǎng)站采用此方案進(jìn)行Session管理。

 ?、跜ookie記錄Session:利用瀏覽器支持的Cookie記錄Session簡(jiǎn)單易行,可用性高,并且支持服務(wù)器的線性伸縮,因此,許多網(wǎng)站都或多或少地使用了Cookie來(lái)記錄Session。但是Cookie記錄Session有缺點(diǎn):比如受Cookie大小限制、每次請(qǐng)求響應(yīng)都要傳輸Cookie影響性能、用戶關(guān)閉了Cookie會(huì)造成訪問(wèn)不正常等。

Session服務(wù)器:利用獨(dú)立部署的Session服務(wù)器(集群)統(tǒng)一管理Session,應(yīng)用服務(wù)器每次讀寫Session時(shí),都訪問(wèn)Session服務(wù)器。這種方案實(shí)際上是將應(yīng)用服務(wù)器的狀態(tài)分離,分為無(wú)狀態(tài)的應(yīng)用服務(wù)器有狀態(tài)的Session服務(wù)器。

對(duì)于,有狀態(tài)的Session服務(wù)器,一種較簡(jiǎn)單的方法是利用分布式緩存(如Memcached、Redis等,有關(guān)Redis的簡(jiǎn)單介紹可以閱讀我的博文:NoSQL初探之人人都愛(ài)Redis)、數(shù)據(jù)庫(kù)等,在這些產(chǎn)品的基礎(chǔ)上進(jìn)行封裝,使其符合Session的存儲(chǔ)和訪問(wèn)要求。

四、高可用的服務(wù)

  高可用的服務(wù)模塊為業(yè)務(wù)產(chǎn)品提供基礎(chǔ)公共服務(wù),在大型站點(diǎn)中這些服務(wù)通常都獨(dú)立分布式部署,被具體應(yīng)用遠(yuǎn)程調(diào)用。

  在具體實(shí)踐中,有以下幾點(diǎn)高可用的服務(wù)策略可以參考:

 ?、俜旨?jí)管理:核心應(yīng)用和服務(wù)具有更高的優(yōu)先級(jí),比如用戶及時(shí)付款比能否評(píng)價(jià)商品更重要;

 ?、诔瑫r(shí)設(shè)置:設(shè)置服務(wù)調(diào)用的超時(shí)時(shí)間,一旦超時(shí)后,通信框架拋出異常,應(yīng)用程序則根據(jù)服務(wù)調(diào)度策略選擇重試or請(qǐng)求轉(zhuǎn)移到其他服務(wù)器上;

 ?、郛惒秸{(diào)用:通過(guò)消息隊(duì)列等異步方式完成,避免一個(gè)服務(wù)失敗導(dǎo)致整個(gè)應(yīng)用請(qǐng)求失敗的情況。

PS:不是所有服務(wù)都可以異步調(diào)用,對(duì)于獲取用戶信息這類調(diào)用,采用異步方式會(huì)延長(zhǎng)響應(yīng)時(shí)間,得不償失。對(duì)于那些必須確認(rèn)服務(wù)調(diào)用成功后才能繼續(xù)進(jìn)行下一步的操作的應(yīng)用也不適合異步調(diào)用。有關(guān)具體使用消息隊(duì)列實(shí)現(xiàn)異步調(diào)用的案例,請(qǐng)閱讀我的博文:《使用Redis作為消息隊(duì)列服務(wù)場(chǎng)景的應(yīng)用案例》。

  ④服務(wù)降級(jí):網(wǎng)站訪問(wèn)高峰期間,為了保證核心應(yīng)用的正常運(yùn)行,需要對(duì)服務(wù)降級(jí)。

  降級(jí)有兩種手段:一是拒絕服務(wù),拒絕較低優(yōu)先級(jí)的應(yīng)用的調(diào)用,減少服務(wù)調(diào)用并發(fā)數(shù),確保核心應(yīng)用的正常運(yùn)行;二是關(guān)閉功能,關(guān)閉部分不重要的服務(wù),或者服務(wù)內(nèi)部關(guān)閉部分不重要的功能,以節(jié)約系統(tǒng)開(kāi)銷,為核心應(yīng)用服務(wù)讓出資源;

 ?、輧绲刃栽O(shè)計(jì):保證服務(wù)重復(fù)調(diào)用和調(diào)用一次產(chǎn)生的結(jié)果相同;

五、高可用的數(shù)據(jù)

  對(duì)于大多數(shù)網(wǎng)站而言,數(shù)據(jù)是其最寶貴的物質(zhì)資產(chǎn)。

  保證數(shù)據(jù)高可用的主要手段有兩種:一是數(shù)據(jù)備份,二是失效轉(zhuǎn)移機(jī)制;

 ?、贁?shù)據(jù)備份:又分為冷備份和熱備份,冷備份是定期復(fù)制,不能保證數(shù)據(jù)可用性。熱備份又分為異步熱備和同步熱備,異步熱備是指多份數(shù)據(jù)副本的寫入操作異步完成,而同步方式則是指多份數(shù)據(jù)副本的寫入操作同時(shí)完成。

  關(guān)系數(shù)據(jù)庫(kù)的熱備機(jī)制就是通常所說(shuō)的主從同步機(jī)制,實(shí)踐中通常使用讀寫分離的方法來(lái)訪問(wèn)Master和Slave數(shù)據(jù)庫(kù),也就是說(shuō)寫操作只訪問(wèn)Master庫(kù),讀操作均訪問(wèn)Slave庫(kù)。

PS:在MS SQL Server中,可以通過(guò)發(fā)布訂閱功能實(shí)現(xiàn)主從分離。關(guān)于發(fā)布訂閱,可以參考MSDN的這篇文章:http://technet.microsoft.com/zh-cn/ff806143.aspx

 ?、谑мD(zhuǎn)移:若數(shù)據(jù)服務(wù)器集群中任何一臺(tái)服務(wù)器宕機(jī),那么應(yīng)用程序針對(duì)這臺(tái)服務(wù)器的所有讀寫操作都要重新路由到其他服務(wù)器,保證數(shù)據(jù)訪問(wèn)不會(huì)失敗。

六、高可用的QA

 ?、倬W(wǎng)站發(fā)布:在柔性的發(fā)布過(guò)程中,每次關(guān)閉的服務(wù)都是集群中的一小部分,并在發(fā)布完成后立即可以訪問(wèn);

 ?、谧詣?dòng)化測(cè)試:使用自動(dòng)測(cè)試工具或腳本完成測(cè)試;

  ③預(yù)發(fā)布驗(yàn)證:引入預(yù)發(fā)布服務(wù)器,與正式服務(wù)器幾乎一致,只是沒(méi)有配置在負(fù)載均衡服務(wù)器上,外部用戶無(wú)法訪問(wèn);

  ④代碼控制:目前大多數(shù)網(wǎng)站采用SVN,分支開(kāi)發(fā),主干發(fā)布模式;另外,目前開(kāi)源社區(qū)廣泛采用Git作為版本控制工具,正逐步取代SVN的地位;

七、網(wǎng)站運(yùn)行監(jiān)控

”不允許沒(méi)有監(jiān)控的系統(tǒng)上線“

 ?。?)監(jiān)控?cái)?shù)據(jù)采集

  ①用戶行為日志收集:服務(wù)器端的日志收集和客戶端的日志收集;目前許多網(wǎng)站逐步開(kāi)發(fā)基于實(shí)時(shí)計(jì)算框架Storm的日志統(tǒng)計(jì)與分析工具;

 ?、诜?wù)器性能監(jiān)控:收集服務(wù)器性能指標(biāo),如系統(tǒng)Load、內(nèi)存占用、磁盤IO等,及時(shí)判斷,防患于未然;

  ③運(yùn)行數(shù)據(jù)報(bào)告:采集并報(bào)告,匯總后統(tǒng)一顯示,應(yīng)用程序需要在代碼中處理運(yùn)行數(shù)據(jù)采集的邏輯;

  (2)監(jiān)控管理

 ?、傧到y(tǒng)報(bào)警:配置報(bào)警閥值和值守人員聯(lián)系方式,系統(tǒng)發(fā)生報(bào)警時(shí),即使工程師在千里之外,也可以被及時(shí)通知;

 ?、谑мD(zhuǎn)移:監(jiān)控系統(tǒng)在發(fā)現(xiàn)故障時(shí),主動(dòng)通知應(yīng)用進(jìn)行失效轉(zhuǎn)移;

③自動(dòng)優(yōu)雅降級(jí):為了應(yīng)付網(wǎng)站訪問(wèn)高峰,主動(dòng)關(guān)閉部分功能,釋放部分系統(tǒng)資源,保證核心應(yīng)用服務(wù)的正常運(yùn)行;—>網(wǎng)站柔性架構(gòu)的理想狀態(tài)

八、學(xué)習(xí)小結(jié)

  本篇我們通過(guò)書籍學(xué)習(xí)了為了實(shí)現(xiàn)網(wǎng)站的高可用,可以使用的策略和模式。書中作者有一句話說(shuō)的十分好,”事務(wù)總是先求生存,然后求發(fā)展“。保證網(wǎng)站高可用,萬(wàn)無(wú)一失,任重而道遠(yuǎn)?。〗裉斓膶W(xué)習(xí)筆記就分享到這里,洗洗睡了,么么嗒!對(duì)了,今天去影院看了老男孩之猛龍過(guò)江,看二傻大鬧牛喲可(New York),聽(tīng)了小蘋果,頓時(shí)感覺(jué)自己萌萌噠,有木有?不談夢(mèng)想和劇情,里面的幾首歌還是蠻好聽(tīng)的。

參考文獻(xiàn)

  (1)李智慧,《大型網(wǎng)站技術(shù)架構(gòu)-核心原理與案例分析》,http://item.jd.com/11322972.html

本章思維導(dǎo)圖

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容