網(wǎng)站的可用就是指網(wǎng)站可以進行有效訪問,不可用就是服務(wù)器掛了,無法訪問了,稱為網(wǎng)站故障。
通常用多少個9來衡量網(wǎng)站的可用性。
如QQ的可用性為4個9,即99.99%,那么QQ一年之中不可用時間為:365×24×60×(1-99.99%)≈ 53分鐘。
不可用的主要原因:
a.服務(wù)器硬件故障;
b.網(wǎng)站升級發(fā)布引起的宕機;
一個典型的網(wǎng)站設(shè)計基本分層架構(gòu):
應(yīng)用層:不同業(yè)務(wù)產(chǎn)品,主要處理網(wǎng)站應(yīng)用的業(yè)務(wù)邏輯;
服務(wù)層:共同的復(fù)用業(yè)務(wù),如登錄服務(wù)、賬戶管理等;
數(shù)據(jù)層:數(shù)據(jù)庫服務(wù)、文件服務(wù)、緩存服務(wù)、搜索服務(wù)等
構(gòu)建高可用架構(gòu)的網(wǎng)站,主要從以上三個方面進行。
一、高可用的應(yīng)用
分兩種情況:應(yīng)用無狀態(tài)和應(yīng)用有狀態(tài)
1.1 應(yīng)用無狀態(tài)
所謂無狀態(tài)的應(yīng)用是指應(yīng)用服務(wù)器不保存業(yè)務(wù)的上下文信息,而僅根據(jù)每次請求提交的數(shù)據(jù)進行相應(yīng)的業(yè)務(wù)邏輯處理,多個服務(wù)實例(服務(wù)器)之間完全對等 ,請求提交到任意服務(wù)器,處理結(jié)果都是完全一樣的。
使用負載均衡進行無狀態(tài)服務(wù)的失效轉(zhuǎn)移
負載均衡是指將流量和數(shù)據(jù)分?jǐn)偟揭粋€集群組成的多臺服務(wù)器上,提高整體的負載處理能力。當(dāng)任意一臺服務(wù)器宕機時,負載均衡服務(wù)器通過心跳監(jiān)測機制發(fā)現(xiàn)該服務(wù)失去響應(yīng),就會把它從服務(wù)器列表中刪除,而將請求發(fā)送到其他服務(wù)器上。為了保證系統(tǒng)的高可用,即使流量很小的應(yīng)用,也應(yīng)該至少部署兩臺應(yīng)用服務(wù)器,使用負載均衡技術(shù)構(gòu)建一個小型的集群。
負載均衡可以通過開源的免費軟件或負載均衡硬件實現(xiàn),都提供失效轉(zhuǎn)移功能。
1.2 應(yīng)用有狀態(tài)
由于業(yè)務(wù)總是有狀態(tài)的,常常將這些狀態(tài)(上下文對象)保存在會話(Session)中。此時面臨的主要問題就是應(yīng)用服務(wù)器集群的Session管理。
集群環(huán)境下,Session管理主要有以下幾種方案:
Session復(fù)制
定義:應(yīng)用服務(wù)器開啟Web容器的Session復(fù)制功能,集群中的幾臺服務(wù)器之間進行同步Session對象,使得每臺服務(wù)器上都保存所有用戶的Session信息。
優(yōu)點:任何一臺服務(wù)器宕機都不會導(dǎo)致Session的丟失,而服務(wù)器使用Session時,只需要從本機獲取即可。
缺點:Session復(fù)制時的同步操作,會占用服務(wù)器和網(wǎng)絡(luò)資源;每個服務(wù)器上都保存所有Session,在大量用戶訪問時,Session會占用大量內(nèi)存,甚至超出服務(wù)器內(nèi)存。Session綁定
定義:負載均衡服務(wù)器利用源地址Hash算法,將來自同一IP的請求分發(fā)到同一臺服務(wù)器上,這種方法又叫會話黏滯。
缺點:不符合高可用的要求,一旦某臺應(yīng)用服務(wù)器宕機,那么該機上的Session就會丟失,用戶請求切換到其他服務(wù)器上就會因為沒有Session而無法完成業(yè)務(wù)。很少采用該方式。利用Cookie記錄Session
定義:將Session通過Cookie保存在瀏覽器,每次請求時,將Session放在請求中發(fā)送給服務(wù)器,服務(wù)器處理完請求后,再將修改過的Session通過Cookie響應(yīng)給瀏覽器。
缺點:每次都傳輸Cookie,影響性能;如果用戶關(guān)閉Cookie,訪問就會不正常;Cookie大小有限制,能記錄的信息有限。
優(yōu)點:簡單易用,支持應(yīng)用服務(wù)器的線性伸縮,許多網(wǎng)站或多或少都會使用Cookie記錄Session。Session服務(wù)器
定義:獨立部署Session服務(wù)器,統(tǒng)一管理Session,應(yīng)用服務(wù)器每次讀寫Session時,都訪問Session服務(wù)器。
實現(xiàn):一種簡單的方法是利用分布式緩存、數(shù)據(jù)庫等,在這些產(chǎn)品的基礎(chǔ)上進行包裝,使其符合Session的存儲和訪問要求。如果業(yè)務(wù)場景對Session管理有比較高的要求,比如利用Session服務(wù)集成單點登錄(SSO)、用戶服務(wù)等,則需要開發(fā)專門的Session服務(wù)管理平臺。
二、高可用的服務(wù)
可復(fù)用的服務(wù)模塊為業(yè)務(wù)產(chǎn)品提供基礎(chǔ)公共服務(wù),大型網(wǎng)站中這些服務(wù)通常都獨立分布式部署,被具體應(yīng)用遠程調(diào)用。是一種無狀態(tài)的服務(wù),可以使用類似負載均衡的失效轉(zhuǎn)移策略實現(xiàn)高可用。
此外,具體實踐中,還有以下幾點高可用的服務(wù)策略:
- 分級管理
核心應(yīng)用和服務(wù)、優(yōu)先級低的服務(wù)區(qū)別分配不同的資源 - 超時設(shè)置
在應(yīng)用程序中設(shè)置服務(wù)調(diào)用的超時時間,一旦超時,通信框架就拋出異常,應(yīng)用程序根據(jù)服務(wù)調(diào)度策略,可選擇繼續(xù)重試或者將請求轉(zhuǎn)移到提供相同服務(wù)的其他服務(wù)器上。 - 異步調(diào)用
應(yīng)用服務(wù)通過消息隊列等異步方式進行調(diào)用,避免一個服務(wù)失敗導(dǎo)致整個請求失敗的情況。但對于必須確認服務(wù)調(diào)用成功才能進行下一步操作的應(yīng)用不適合使用異步調(diào)用。 - 服務(wù)降級
在訪問高峰期,為保證核心應(yīng)用和功能的正常,對服務(wù)降級 - 拒絕服務(wù):拒絕低優(yōu)先級應(yīng)用的調(diào)用,減少服務(wù)調(diào)用的并發(fā)數(shù)或隨機拒絕部分調(diào)用請求
- 關(guān)閉功能:關(guān)閉部分不重要的服務(wù)或非核心服務(wù)
- 冪等級設(shè)計
在服務(wù)層必須保證服務(wù)重復(fù)調(diào)用和一次調(diào)用產(chǎn)生的結(jié)果相同,即服務(wù)具有冪等性。
三、高可用的數(shù)據(jù)
主要是指數(shù)據(jù)存儲的高可用(不包含緩存數(shù)據(jù)的高可用),主要手段是數(shù)據(jù)備份和失效轉(zhuǎn)移。
CAP原理
CAP原理認為,一個提供數(shù)據(jù)服務(wù)的存儲系統(tǒng)無法同時滿足數(shù)據(jù)一致性(Consistency)、數(shù)據(jù)可用性(Avalibaility)、分區(qū)耐受性(Partition Tolerance,系統(tǒng)具有跨網(wǎng)絡(luò)分區(qū)的伸縮性)這三個條件。大型網(wǎng)站通常選擇選擇強化可用性和伸縮性,而在一定程度上犧牲一致性。
</br>數(shù)據(jù)一致性分類
數(shù)據(jù)強一致:各個副本的數(shù)據(jù)在物理存儲中總是一致的;數(shù)據(jù)更新操作和操作響應(yīng)總是一致的。
數(shù)據(jù)用戶一致:數(shù)據(jù)在物理存儲的各個副本的數(shù)據(jù)可能是不一致的,但是終端用戶訪問時,通過糾錯和校驗機制,可以確定一個一致的且正確的數(shù)據(jù)返回給用戶。網(wǎng)站通常達到這一級別的一致性。
數(shù)據(jù)最終一致性:一致性最弱的一種,即物理存儲的數(shù)據(jù)可能是不一致的,不同用戶同時訪問的結(jié)果返回也可能不一致,但系統(tǒng)經(jīng)過一段時間的自我恢復(fù)和修正,數(shù)據(jù)會達到最終一致。
數(shù)據(jù)備份
主要分為數(shù)據(jù)冷備份和熱備份。冷備份是指定期將數(shù)據(jù)復(fù)制到某種存儲介質(zhì)。這種方式不能保證數(shù)據(jù)最終一致和數(shù)據(jù)可用,只是作為一種傳統(tǒng)數(shù)據(jù)保護手段使用。熱備份則是指對數(shù)據(jù)實時備份,分為異步熱備和同步熱備。異步熱備份
將服務(wù)器分為主、從服務(wù)器,數(shù)據(jù)寫入時,由主服務(wù)器的寫操作代理模塊將數(shù)據(jù)寫入本機存儲系統(tǒng)后立即返回寫操作成功的響應(yīng),然后通過異步線程將寫操作同步到從服務(wù)器。同步熱備份
在應(yīng)用程序客戶端并發(fā)向多個存儲服務(wù)器同時寫入數(shù)據(jù),然后等待所有存儲服務(wù)器都返回操作成功的響應(yīng)后,再通知應(yīng)用程序?qū)懖僮鞒晒?。這種情況下,沒有主從之分,完全對等,便于管理和維護。由于并發(fā)寫,所以性能和異步熱備份差不多。
關(guān)系型數(shù)據(jù)庫的Master-Slave同步機制不但解決了數(shù)據(jù)備份問題,還改善了性能:使用讀寫分離方式,寫在Master,讀在Slaver。
NoSQL都提供完備的實時備份機制。
- 失效轉(zhuǎn)移
某臺服務(wù)器宕機后,將讀寫操作轉(zhuǎn)移到其他服務(wù)器上。失效轉(zhuǎn)移操作主要由三部分組成:失效確認、訪問轉(zhuǎn)移、數(shù)據(jù)恢復(fù) - 失效確認:心跳監(jiān)測和應(yīng)用程序的訪問失敗報告
- 訪問轉(zhuǎn)移:對于完全對等的服務(wù)器,直接切換到對等的服務(wù)器上即可。如果存儲不對等,就要重新計算路由,選擇存儲服務(wù)器。
- 數(shù)據(jù)恢復(fù):將數(shù)據(jù)副本數(shù)目恢復(fù)到設(shè)定值
四、軟件質(zhì)量保證
- 網(wǎng)站發(fā)布:使用發(fā)布腳本完成,逐步更新
- 自動化測試
- 預(yù)發(fā)布驗證:先把代碼發(fā)到預(yù)發(fā)布服務(wù)器上進行驗證,預(yù)發(fā)布服務(wù)器與正式服務(wù)器所有環(huán)境均一致,只是外部無法訪問。
- 代碼控制:一般采用分支開發(fā),主干發(fā)布
- 自動化發(fā)布
- 灰度發(fā)布
五、網(wǎng)站運行監(jiān)控
- 監(jiān)控數(shù)據(jù)采集
- 用戶行為日志收集:主要有①服務(wù)器端收集②客戶端瀏覽器通過嵌入專門的JavaScript收集;由于日志數(shù)據(jù)量巨大,很多網(wǎng)站逐步開發(fā)基于實時計算框架Storm的日志統(tǒng)計與分析工具。
- 服務(wù)器性能監(jiān)控:如系統(tǒng)Load、內(nèi)存占用、硬盤IO、網(wǎng)絡(luò)IO等,使用較多的工具是Ganglia
- 運行數(shù)據(jù)報告:監(jiān)控一些與具體業(yè)務(wù)相關(guān)的技術(shù)和業(yè)務(wù)指標(biāo),比如緩沖命中率、平均響應(yīng)延時時間等
- 監(jiān)控管理
- 系統(tǒng)報警
- 失效轉(zhuǎn)移
- 自動降級