目錄
1 大型網(wǎng)站架構(gòu)演化
2 大型網(wǎng)站架構(gòu)模式
3 大型網(wǎng)站核心架構(gòu)要素
4 瞬時響應(yīng):網(wǎng)站的高性能架構(gòu)
5 萬無一失:網(wǎng)站的高可用架構(gòu)
6 永無止境:網(wǎng)站的伸縮性架構(gòu)
7 隨需應(yīng)變:網(wǎng)站的可擴展架構(gòu)
8 固若金湯:網(wǎng)站的安全架構(gòu)
參考資料
· 《大型網(wǎng)站技術(shù)架構(gòu)-核心原理與案例分析》
1 大型網(wǎng)站架構(gòu)演化
(1)初始階段
只需一臺服務(wù)器就綽綽有余。通常服務(wù)器操作系統(tǒng)使用Linux、應(yīng)用程序使用PHP開發(fā)、然后部署再Apache上,數(shù)據(jù)庫使用MySQL。典型的LAMP開發(fā)。

(2)應(yīng)用服務(wù)和數(shù)據(jù)服務(wù)分離
- 背景:用戶訪問的增長,訪問和存儲空間導(dǎo)致很多問題,將應(yīng)用和數(shù)據(jù)分離使得整個網(wǎng)站使用三臺服務(wù)器:應(yīng)用服務(wù)器、文件服務(wù)器和數(shù)據(jù)庫服務(wù)器。
-
不同特性的服務(wù)器承擔(dān)不同的服務(wù)角色。
(3)使用緩存改善網(wǎng)站性能
- 背景:二八定律:80%的業(yè)務(wù)訪問集中再20%的數(shù)據(jù)上。
- 緩存分為:本地緩存和遠程分布式緩存。前者受應(yīng)用服務(wù)器內(nèi)存和性能的限制,后者有更好的性能。
- 使用緩存將熱點數(shù)據(jù)緩存

(4)使用應(yīng)用服務(wù)器集群改善網(wǎng)站的并發(fā)處理能力
- 背景: 使用集群是網(wǎng)站解決高并發(fā)、海量數(shù)據(jù)問題的常用手段。
- 通過負載均衡調(diào)度器將用戶請求分發(fā)到應(yīng)用服務(wù)器集群中的任何一臺服務(wù)器上,使得應(yīng)用服務(wù)器的負載壓力不在是瓶頸。

(5)數(shù)據(jù)庫讀寫分離
- 背景:仍然有一部分讀操作(未命中緩存)和全部寫操作到達數(shù)據(jù)庫,隨著用戶的增長,數(shù)據(jù)庫業(yè)務(wù)負載壓力過高而成為瓶頸。
- 主從熱備、讀寫分離,從而改善數(shù)據(jù)庫負載壓力。

(6)使用反向代理和CDN加速網(wǎng)站響應(yīng)
- 背景:隨著用戶規(guī)模的擴大,不同地區(qū)訪問網(wǎng)站速度差別極大。為了提供更好的用戶體驗,留住用戶,需要加速網(wǎng)站訪問速度。
- 主要手段有兩個,基本的原理都是緩存
-CDN:部署在網(wǎng)絡(luò)提供商的機房,使得用戶在請求網(wǎng)站服務(wù)時,可以從距離子句最近的網(wǎng)絡(luò)提供商機房獲取數(shù)據(jù)。
-反向代理:部署在網(wǎng)站的中心機房,用戶請求首先訪問的服務(wù)器是反向代理服務(wù)器,如果反向代理服務(wù)器中緩存著用戶請求的資源,就直接返回給用戶。 - 優(yōu)點:在加快用戶訪問速度的同時,也減輕后端服務(wù)器的負載壓力。

(7)使用分布式文件系統(tǒng)和分布式數(shù)據(jù)庫系統(tǒng)
- 背景: 數(shù)據(jù)庫和文件系統(tǒng)不能滿足持續(xù)增長的業(yè)務(wù)需求
- 分布式數(shù)據(jù)庫是網(wǎng)站數(shù)據(jù)庫拆分的最后手段,只有在單表數(shù)據(jù)規(guī)模非常龐大的時候才使用。不到不得已時,網(wǎng)站更常用的數(shù)據(jù)庫拆分手段是業(yè)務(wù)分庫,將不同業(yè)務(wù)的數(shù)據(jù)庫部署再不同的物理服務(wù)器上。

(8)使用NoSQL和搜素引擎
- 背景: 隨著網(wǎng)站業(yè)務(wù)越來越復(fù)雜,對數(shù)據(jù)存儲和檢索的需求越來越復(fù)雜,網(wǎng)站需要采用一些非關(guān)系數(shù)據(jù)庫技術(shù)如NOSQL和非數(shù)據(jù)庫查詢技術(shù)如搜索引擎。
(9)業(yè)務(wù)拆分
- 背景:業(yè)務(wù)場景日益復(fù)雜,需要將業(yè)務(wù)分成不同的產(chǎn)品線,不同產(chǎn)品線將網(wǎng)站拆分為不同的應(yīng)用,每個應(yīng)用單獨部署和維護。
- 應(yīng)用可以通過超鏈接、消息隊列或者數(shù)據(jù)存儲系統(tǒng)建立為完整的系統(tǒng)

(10)分布式服務(wù)
- 背景:業(yè)務(wù)拆分越來越小,應(yīng)用系統(tǒng)的整體復(fù)雜度呈指數(shù)級增加,部署維護越來越困難。
- 將共同的業(yè)務(wù)提取出來,獨立部署。應(yīng)用系統(tǒng)通過分布式服務(wù)調(diào)用共同業(yè)務(wù)服務(wù)完成具體業(yè)務(wù)操作。

2 大型網(wǎng)站架構(gòu)模式
2.1 什么是模式?
每一個模式描述了一個在外面周圍不斷重復(fù)發(fā)生的問題及該問題解決方案的核心,這樣,你就能一次又一次地使用該方案而不必做重復(fù)工作。
2.2 分層
- 是企業(yè)應(yīng)用系統(tǒng)中最常見的一種架構(gòu)模式,將系統(tǒng)在橫向維度上切分成幾個部分,每個部分負責(zé)一部分相對單一的職責(zé),然后通過上層對下層的依賴和調(diào)用組成一個完整的系統(tǒng)。
- 常見的,MVC模式的分層
- 一些注意點:必須合理規(guī)劃層次邊界和接口,在開發(fā)過程中,嚴(yán)格遵循分層架構(gòu)的約束,禁止跨層次的調(diào)用(應(yīng)用層直接調(diào)用數(shù)據(jù)層)及逆向調(diào)用(數(shù)據(jù)層調(diào)用服務(wù)層,或者服務(wù)層調(diào)用應(yīng)用層)。
- 意義:分層結(jié)構(gòu)對網(wǎng)站支持高并發(fā)向分布式方向發(fā)展至關(guān)重要。
2.3 分割
- 在縱向方面對軟件進行切分。
在應(yīng)用層,將不同業(yè)務(wù)分割,如論壇、廣告分割成不同的應(yīng)用;
在每個應(yīng)用可以進行更小粒度的分割,如首頁、商品詳情等模塊。
2.4 分布式
將上述分層和分割后的不同模塊部署在不同的服務(wù)器上,通過遠程調(diào)用協(xié)同工作。分布式意味著可以使用更多的計算機完成同樣的功能,計算機越多,CPU、內(nèi)存、存儲資源也就越多,能夠處理的并發(fā)訪問和數(shù)據(jù)量就越大,進而能夠為更多用戶提供服務(wù)。
帶來的問題:
通過網(wǎng)絡(luò)進行機器通信,性能有影響
數(shù)據(jù)一致性問題
機器宕機概率增大
。。。常見的分布式方案:
分布式應(yīng)用和服務(wù):服務(wù)模塊分布式部署
分布式靜態(tài)資源:靜態(tài)資源分布式部署,獨立域名(動靜分離)
分布式數(shù)據(jù)和存儲:海量數(shù)據(jù)的分布式存儲
分布式計算:目前網(wǎng)站普遍使用Hadoop及其MapReduce分布式計算框架進行此類批處理計算。
分布式配置
分布式鎖
分布式文件系統(tǒng)
2.5 集群
- 多臺服務(wù)器部署相同應(yīng)用構(gòu)成一個集群,通過負載均衡設(shè)備共同對外提供服務(wù)
- 即使是訪問量很小的分布式應(yīng)用和服務(wù),也至少要部署兩臺服務(wù)器構(gòu)成一個小的集群,目的就是提高系統(tǒng)的可用性。
2.6 緩存
- 緩存就是將數(shù)據(jù)存放在距離計算最近的位置以加快處理速度
- 緩存是改善軟件性能的第一手段,緩存無處不在
- 常見緩存方案:
CDN:內(nèi)容分發(fā)網(wǎng)絡(luò)
反向代理
本地緩存:在應(yīng)用服務(wù)器本地緩存著熱點數(shù)據(jù),在內(nèi)存中,無需訪問數(shù)據(jù)庫
分布式緩存:海量需要緩存的數(shù)據(jù),單機不夠,通過分布式緩存解決 - 使用緩存的前提條件:
- 數(shù)據(jù)訪問熱點不均衡,某些數(shù)據(jù)會被更頻繁的訪問,這些數(shù)據(jù)應(yīng)該在緩存中
- 數(shù)據(jù)在某個時間段內(nèi)有效,不會很快過期,否則緩存的數(shù)據(jù)就會因已經(jīng)失效而產(chǎn)生臟讀,影響結(jié)果的正確性。
2.7 異步
- 計算機軟件發(fā)展的一個重要目標(biāo)和驅(qū)動力是降低軟件耦合性。
- 異步,即業(yè)務(wù)之間的消息傳遞不是同步調(diào)用,而是將一個業(yè)務(wù)操作分成多個階段,每個階段之間通過共享數(shù)據(jù)的方式異步執(zhí)行進行協(xié)作。
- 實現(xiàn)方式:
單一服務(wù)器內(nèi):通過多線程共享內(nèi)存隊列的方式實現(xiàn)異步
分布式系統(tǒng)中:分布式消息隊列實現(xiàn)異步。 - 異步消息隊列的特性:
- 典型的生產(chǎn)著消費者模式
- 提高系統(tǒng)的可用性:消費者宕機重啟后繼續(xù)處理消息隊列中的數(shù)據(jù)
- 加快網(wǎng)站響應(yīng)速度:前端不等待結(jié)果處理,直接返回給客戶端
- 消除并發(fā)訪問高峰
2.8 冗余
- 要想保證在服務(wù)器宕機的情況下網(wǎng)站依然可以繼續(xù)服務(wù),不丟失數(shù)據(jù),就需要一定程度的服務(wù)器冗余運行,數(shù)據(jù)冗余備份,這樣當(dāng)某臺服務(wù)器宕機時,可以將其上的服務(wù)和數(shù)據(jù)訪問轉(zhuǎn)移到其他機器上。
- 冷備份與熱備份:數(shù)據(jù)庫定期備份,存檔保存,進行冷備份;為了保證在線業(yè)務(wù)高可用,需要進行主從分離,實時同步實現(xiàn)熱備份。
- 全球范圍內(nèi)部署災(zāi)備數(shù)據(jù)中心。
2.9 自動化
- 在無人值守的情況下網(wǎng)站可以正常運行,一切都可以自動化是網(wǎng)站的理想狀態(tài)。目前大型網(wǎng)站的自動化架構(gòu)設(shè)計主要集中在發(fā)布運維方面。
- 發(fā)布網(wǎng)站過程中:發(fā)布過程自動化、自動化代碼管理、自動化測試、自動化安全檢測和自動化部署
- 網(wǎng)站運行過程中:自動化監(jiān)控、自動化報警、自動化失效轉(zhuǎn)移、自動化失效恢復(fù)、自動化降級、自動化分配資源。
2.10 安全
- 通過密碼和手機校驗碼進行身份認證
- 登錄、交易操作進行網(wǎng)絡(luò)通信加密
- 防止機器人攻擊網(wǎng)絡(luò),使用驗證碼進行識別
- 對XSS攻擊和SQL注入進行編碼轉(zhuǎn)換
- 對垃圾信息、敏感信息過濾
- 交易過程的風(fēng)險控制
3 大型網(wǎng)站核心架構(gòu)要素
3.1 性能
3.1.1 衡量網(wǎng)站性能的指標(biāo)
- 響應(yīng)時間
- TPS
- 系統(tǒng)性能計數(shù)器
- .....
3.1.2 優(yōu)化性能的手段
- 瀏覽器端,通過瀏覽器緩存、頁面壓縮、減少Cookie傳輸?shù)雀纳?/li>
- CDN
- 服務(wù)端,使用本地緩存和分布式緩存
- 異步
- 集群
- 代碼層面,使用多線程、改善內(nèi)存管理等
- 數(shù)據(jù)庫端,索引、緩存、SQL優(yōu)化等
- NOSQL
3.2 可用性
- 用幾個9來衡量,常見的是4個9的可用性,即99.99%
- 衡量一個系統(tǒng)架構(gòu)設(shè)計是否滿足可用的目標(biāo),就是假設(shè)系統(tǒng)中任何一臺或者多臺服務(wù)器宕機時,以及出現(xiàn)各種不可預(yù)期的問題時,系統(tǒng)整體是否依然可用。
- 網(wǎng)站高可用的主要手段:冗余
3.3 伸縮性
- 伸縮性是指:通過不斷向集群中加入服務(wù)器的手段來緩解不斷上升的用戶并發(fā)訪問壓力和不斷增長的數(shù)據(jù)存儲需求。
- 分類:
- 應(yīng)用服務(wù)器的伸縮性:服務(wù)器對等
- 緩存服務(wù)器的伸縮性:修改緩存裸路由算法
- 關(guān)系數(shù)據(jù)庫的伸縮性:通過路由分區(qū)等手段將有多個數(shù)據(jù)庫的服務(wù)器組成一個集群
- NOSQL產(chǎn)品的伸縮性:天生為海量數(shù)據(jù)而生,可以實現(xiàn)集群規(guī)模的線性伸縮
3.4 擴展性
- 擴展性是指:網(wǎng)站快速發(fā)展,功能不斷擴展,如何設(shè)計網(wǎng)站的架構(gòu)使其能夠快速響應(yīng)需求變化,是網(wǎng)站可擴展架構(gòu)主要的目的
- 衡量網(wǎng)站架構(gòu)擴展性好壞的主要標(biāo)準(zhǔn)就是:在網(wǎng)站增加新的業(yè)務(wù)產(chǎn)品時,是否可以實現(xiàn)對現(xiàn)有產(chǎn)品透明無影響。不需要任何改動或者很少改動既有業(yè)務(wù)功能就可以上線新產(chǎn)品。
- 主要手段:
- 事件驅(qū)動架構(gòu):利用消息隊列實現(xiàn)
- 分布式服務(wù):將業(yè)務(wù)和可復(fù)用服務(wù)分離開來,通過分布式服務(wù)框架調(diào)用。
3.5 安全性
- 衡量網(wǎng)站安全架構(gòu)的標(biāo)準(zhǔn)就是:針對現(xiàn)存和潛在的各種攻擊與竊密手段,是否有可靠的應(yīng)對策略。
4 瞬時響應(yīng):網(wǎng)站的高性能架構(gòu)
4.1 網(wǎng)站性能測試
4.1.1 性能測試指標(biāo)
(1)響應(yīng)時間
- 指應(yīng)用執(zhí)行一個操作需要的時間,包括從發(fā)出請求開始到收到最后響應(yīng)數(shù)據(jù)所需要的時間。
- 響應(yīng)時間測試方法:重復(fù)請求。比如一個請求操作重復(fù)執(zhí)行一萬次,測試一萬次執(zhí)行需要的總響應(yīng)時間之和,然后除以一萬,得到單次請求的響應(yīng)時間。
(2)并發(fā)數(shù)
- 指系統(tǒng)能夠同時處理請求的數(shù)目。
- 網(wǎng)站系統(tǒng)用戶數(shù) >= 網(wǎng)站在線用戶數(shù) >= 網(wǎng)站并發(fā)用戶數(shù)
- 并發(fā)數(shù)測試方法:通過多線程模擬并發(fā)用戶的辦法來測試系統(tǒng)的并發(fā)處理能力。
(3)吞吐量
- 指單位時間內(nèi)系統(tǒng)處理的請求數(shù)量,體現(xiàn)系統(tǒng)的整體處理能力。
- TPS(每秒事務(wù)數(shù))、HPS(每秒HTTP請求數(shù))和QPS(每秒查詢數(shù))。
(4)性能計數(shù)器
- 它是描述服務(wù)器或操作系統(tǒng)性能的一些數(shù)據(jù)指標(biāo)。包括System Load、對象與線程數(shù)、內(nèi)存使用、CPU使用、磁盤與網(wǎng)絡(luò)I/O等指標(biāo)。
4.1.2 性能測試方法
- 性能測試
- 負載測試
- 壓力測試
- 穩(wěn)定性測試
4.1.3 性能優(yōu)化策略
(1)性能分析
- 檢查請求處理的各個環(huán)節(jié)的日志,分析哪個環(huán)節(jié)響應(yīng)時間不合理、超過預(yù)期;
- 然后檢查監(jiān)控數(shù)據(jù),分析影響性能的主要因素是內(nèi)存、磁盤、網(wǎng)絡(luò)、還是CPU,是代碼問題還是架構(gòu)設(shè)計不合理,或者系統(tǒng)資源確實不足。
(2)性能優(yōu)化
- Web前端性能優(yōu)化
- 應(yīng)用服務(wù)器性能優(yōu)化
- 存儲服務(wù)器性能優(yōu)化
4.2 Web前端性能優(yōu)化
4.2.1 瀏覽器訪問優(yōu)化
- 減少HTTP請求
合并CSS、合并JavaScript、合并圖片。將瀏覽器一次訪問需要的JavaScript、CSS合并成一個文件,這樣瀏覽器就只需要一次請求 - 使用瀏覽器緩存
-設(shè)置瀏覽器緩存更新頻率較低的靜態(tài)資源,可以設(shè)置HTTP頭中Cache-Control和Expires屬性
-使用瀏覽器緩存策略的網(wǎng)站在更新靜態(tài)資源時,應(yīng)采用逐量更新的方法,以免用戶瀏覽器突然大量緩存失效,集中更新緩存,造成服務(wù)器負載驟增、網(wǎng)絡(luò)堵塞的情況。 - 啟用壓縮
HTML、CSS、JavaScript文件啟用GZip壓縮,減少通信傳輸?shù)臄?shù)據(jù)量 - CSS放在頁面最上面、JavaScript放在頁面最下面
-瀏覽器會在下載完全部CSS之后才對整個頁面進行渲染,因此最好的做法是將CSS放在頁面最上面,讓瀏覽器盡快下載CSS
-瀏覽器在加載JavaScript后立即執(zhí)行,有可能會阻塞整個頁面,造成頁面顯示緩慢,因此JavaScript最好放在頁面最下面 - 減少Cookie傳輸
4.2.2 CND加速

CDN能夠緩存的一般是靜態(tài)資源,如圖片、文件、CSS、Script腳本、靜態(tài)網(wǎng)頁等。
4.2.3 反向代理
來自互聯(lián)網(wǎng)的訪問請求,必須經(jīng)過代理服務(wù)器,相當(dāng)于在web服務(wù)器和可能的網(wǎng)絡(luò)攻擊之間建立了一個屏障。
也可以配置緩存功能加速Web請求
4.3 應(yīng)用服務(wù)器性能優(yōu)化
4.3.1 分布式緩存
緩存原理
緩存的本質(zhì)是一個內(nèi)存Hash表,網(wǎng)站應(yīng)用中,數(shù)據(jù)緩存以一對Key、Value的形式存儲在內(nèi)存Hash表中。合理使用緩存
頻繁修改的數(shù)據(jù),徒增系統(tǒng)負擔(dān)。一般,數(shù)據(jù)的讀寫比在2:1以上,緩存才有意義
沒有熱點的訪問,如果系統(tǒng)的訪問,不符合二八定律,則沒有必要使用緩存
數(shù)據(jù)不一致與臟讀
緩存可用性,使用集群改善。
緩存預(yù)熱,LRU算法執(zhí)行uxuyao時間,可用在緩存系統(tǒng)啟動時,就把熱點數(shù)據(jù)加載好。
緩存穿透分布式緩存架構(gòu)
-分布式緩存指部署再多個服務(wù)器組成的集群中,以集群方式提供緩存服務(wù)。應(yīng)用程序通過一致性Hash等路由算法選擇緩存服務(wù)器遠程訪問緩存數(shù)據(jù)。
-架構(gòu)方式有兩種:JBoss Cache為代表的需要更新同步的分布式緩存;以Memcached為代表的不互相通信的分布式緩存。
4.3.2 異步操作
- 使用消息隊列將調(diào)用異步化,可改善網(wǎng)站的擴展性,也可以改善網(wǎng)站系統(tǒng)的性能
- 在使用消息隊列后,用戶請求的數(shù)據(jù)發(fā)送給消息隊列后立即返回,再由消息隊列的消費者進程(通過情況下,該進程通常獨立部署在專門的服務(wù)器集群上)從消息隊列中獲取數(shù)據(jù),異步寫入數(shù)據(jù)庫。
4.3.3 使用集群
使用負載均衡技術(shù)為一個應(yīng)用構(gòu)建一個由多臺服務(wù)器組成的服務(wù)器集群,將并發(fā)訪問請求分發(fā)到多臺服務(wù)器上處理,避免單一服務(wù)器因負載壓力過大而響應(yīng)緩慢,使用戶請求具有更好的響應(yīng)延遲特性。
4.3.4 代碼優(yōu)化
-
多線程
- 使用多線程的原因:IO阻塞與多CPU,更好的利用資源。
- 服務(wù)器上執(zhí)行形同類型的任務(wù),針對該任務(wù)可以啟動的線程數(shù):
啟動線程數(shù)=[任務(wù)執(zhí)行時間/(任務(wù)執(zhí)行時間 - IO等待時間)] * CPU 內(nèi)核數(shù)
資源復(fù)用
主要有兩種模式:單例(Singleton)和對象池(Object Pool)數(shù)據(jù)結(jié)構(gòu)
-
垃圾回收
再回顧一下GC步驟:- 新建對象總是再Eden區(qū)中被創(chuàng)建,當(dāng)Eden區(qū)空間已滿,就出發(fā)一次Young GC,將還被使用的對象復(fù)制到From區(qū),這樣整個Eden區(qū)被清空
- 當(dāng)Eden區(qū)再次用完,再觸發(fā)一次Young GC,將Eden區(qū)和From區(qū)還在被使用的對象復(fù)制到To區(qū),下一次Young GC將是Eden區(qū)和To區(qū)還被使用的對象復(fù)制到From區(qū)。
- 當(dāng)多次Young GC后,如果超過某個閾值對象還未被釋放,則將該對象復(fù)制到Old Generation。
- 如果Old Generation空間也已用完,那么就會觸發(fā)Full GC,即全量回收。
4.4 存儲性能優(yōu)化
- 機械硬盤和固體硬盤
- B+樹和LSM樹
5 萬無一失:網(wǎng)站的高可用架構(gòu)
實現(xiàn)高可用架構(gòu)的主要手段是:數(shù)據(jù)和服務(wù)的冗余備份及失效轉(zhuǎn)移。
5.1 高可用的應(yīng)用
應(yīng)用層的一個顯著的特點是應(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)移
負載均衡服務(wù)器通過心跳檢測機制發(fā)現(xiàn)該服務(wù)器失去響應(yīng),就會把它從服務(wù)器列表中刪除,而將請求發(fā)送到其他服務(wù)器上。 - 應(yīng)用服務(wù)器集群的Session管理
集群環(huán)境下,Session管理主要有一下幾種手段:- Session復(fù)制
服務(wù)器開啟Web容器的Session復(fù)制功能,在集群中的幾臺服務(wù)器之間同步Session對象,使得每臺服務(wù)器上都保存所有用戶的Session信息。 - Session綁定(不符合高可用的要求)
利用負載均衡的原地址Hash算法實現(xiàn)。負載均衡器總是將來源于同一IP的請求分發(fā)到同一臺服務(wù)器上。 - 利用Cookie記錄Session
- Session服務(wù)器
利用獨立部署的Session服務(wù)器(集群)統(tǒng)一管理Session,應(yīng)用服務(wù)器每次讀寫Session時,都訪問Session服務(wù)器。
- Session復(fù)制
5.2 高可用的服務(wù)
-
分級管理
- 核心應(yīng)用和服務(wù)有限使用更好的硬件
- 服務(wù)部署上需要進行必要的隔離,避免故障的連鎖反應(yīng)。
超時設(shè)置
-
異步調(diào)用
- 應(yīng)用對服務(wù)的調(diào)用通過消息隊列等異步方式完成,避免一個服務(wù)失敗導(dǎo)致整個應(yīng)用請求失敗的情況。
- 當(dāng)然,不是所有服務(wù)調(diào)用都可以異步調(diào)用,對于獲取用戶信息這類調(diào)用,采用異步方式會延長響應(yīng)時間,得不償失。對于那些必須確認服務(wù)調(diào)用成功才能繼續(xù)下一步操作的應(yīng)用,也不適合使用異步調(diào)用。
服務(wù)降級
冪等性設(shè)計
5.3 高可用的數(shù)據(jù)
不同于高可用的應(yīng)用和服務(wù),由于數(shù)據(jù)存儲服務(wù)器上保存的數(shù)據(jù)不同,當(dāng)某臺服務(wù)器宕機的時候,數(shù)據(jù)訪問請求不能任意切換到集群中其他的機器上。
根據(jù)CAP原理,為了保證數(shù)據(jù)的高可用,網(wǎng)站通常會犧牲另一個也很重要的指標(biāo):數(shù)據(jù)一致性。
數(shù)據(jù)備份
數(shù)據(jù)熱備分為兩種:異步熱備方式和同步熱備方式-
失效轉(zhuǎn)移
若數(shù)據(jù)服務(wù)器集群中任何一臺服務(wù)器宕機,那么應(yīng)用程序針對這臺服務(wù)器的所有讀寫操作都需要重新路由到其他服務(wù)器,保證數(shù)據(jù)訪問不會失敗,這個過程叫做失效轉(zhuǎn)移。- 失效確認
通過心跳檢測和應(yīng)用程序訪問失敗報告 - 訪問轉(zhuǎn)移
確認宕機后,需要將數(shù)據(jù)讀寫訪問重新路由到其他服務(wù)器上。 - 數(shù)據(jù)恢復(fù)
從健康的服務(wù)器復(fù)制數(shù)據(jù),將數(shù)據(jù)副本數(shù)目恢復(fù)到設(shè)定值
- 失效確認
5.4 高可用網(wǎng)站的軟件質(zhì)量保證
(1)網(wǎng)站發(fā)布

發(fā)布過程中,每次關(guān)閉的服務(wù)器都是集群中的一小部分,并在發(fā)布完成后立即可以訪問,因此整個發(fā)布過程不影響用戶使用。
(2)自動化測試
大部分網(wǎng)站采用Web自動化測試技術(shù),比較流行的測試工具是Selenium。
(3)預(yù)發(fā)布驗證
網(wǎng)站發(fā)布時,先發(fā)布到預(yù)發(fā)布服務(wù)器上,開發(fā)和測試工程師進行預(yù)發(fā)布驗證,執(zhí)行一些典型的業(yè)務(wù)流程,確認系統(tǒng)沒有問題后才正式發(fā)布。
(4)代碼控制
- 有“主干開發(fā)、分支發(fā)布”和“分支開發(fā),主干發(fā)布”兩種
- 目前網(wǎng)站主要使用“分支開發(fā),主干發(fā)布”。
(5)自動化發(fā)布 - 很多網(wǎng)站選擇周四作為發(fā)布日
- 采用“火車發(fā)布模型”,開發(fā)一個自動化發(fā)布的工具。
(6)灰度發(fā)布 - 背景:服務(wù)器集群規(guī)模龐大,一旦發(fā)現(xiàn)故障,即使想要回滾,也需要很長時間才能完成。
-
灰度發(fā)布模式:將集群服務(wù)器分成若干份,每天只發(fā)布一部分服務(wù)器,觀察運行穩(wěn)定沒有故障,第二天繼續(xù)發(fā)布一部分服務(wù)器, 持續(xù)幾天才能把整個集群全部發(fā)布完畢,期間如果發(fā)現(xiàn)問題,只需要回滾已發(fā)布的一部分服務(wù)器即可。
6 永無止境:網(wǎng)站的伸縮性架構(gòu)
6.1 分類
- 不同功能進行物理分離實現(xiàn)伸縮(不同的服務(wù)器部署不同的服務(wù),提供不同的功能)
橫向分離
縱向分離 - 單一功能通過集群規(guī)模實現(xiàn)伸縮(集群內(nèi)的多臺服務(wù)器部署相同的服務(wù),提供相同的功能)
應(yīng)用服務(wù)器集群伸縮性
數(shù)據(jù)服務(wù)器集群伸縮:緩存數(shù)據(jù)服務(wù)器集群、存儲數(shù)據(jù)服務(wù)器集群
6.2 應(yīng)用服務(wù)器集群伸縮性
如果HTTP請求分發(fā)裝置(負載均衡服務(wù)器)可以感知或者可以配置集群的服務(wù)器數(shù)量,可以及時發(fā)現(xiàn)集群中新上線或下線的服務(wù)器,并能向新上線的服務(wù)器分發(fā)請求,停止向已下線的服務(wù)器分發(fā)請求,那么就實現(xiàn)了應(yīng)用服務(wù)器集群的伸縮性。
- HTTP重定向負載均衡
HTTP重定向服務(wù)器,將其一臺真實的Web服務(wù)器地址寫入HTTP重定向響應(yīng)中(響應(yīng)狀態(tài)碼302)返回給用戶瀏覽器。
由于需要兩次請求服務(wù)器才能完成一次訪問,性能較差,使用這種方案不多 - DNS域名解析負載均衡
每次域名解析請求都會根據(jù)負載均衡算法計算一個不同的IP地址返回。
事實上,大型網(wǎng)站總是部分使用DNS域名解析,利用域名解析作為第一級負載均衡手段,即域名解析得到的一組服務(wù)器并不是實際提供Web服務(wù)的物理服務(wù)器,而是同樣提供負載均衡服務(wù)的內(nèi)部服務(wù)器,這組內(nèi)部服務(wù)器再進行負載均衡。 - 反向代理負載均衡(應(yīng)用層負載均衡)
- IP負載均衡
- 數(shù)據(jù)鏈路層負載均衡
- 是指在通信協(xié)議的數(shù)據(jù)鏈路層修改mac地址進行負載均衡。
- 又稱為三角傳輸模式:負載均衡數(shù)據(jù)分發(fā)過程中不修改IP地址,只修改目的mac地址。由于實際處理請求的真實物理服務(wù)器IP和數(shù)據(jù)請求目的IP一致,不需要通過負載均衡服務(wù)器進行地址轉(zhuǎn)換,可將響應(yīng)數(shù)據(jù)包直接返回給用戶瀏覽器,避免負載均衡服務(wù)器網(wǎng)卡帶寬成為瓶頸。(直接路由方式DR)
- 這是目前大型網(wǎng)站使用最廣的一種負載均衡手段。

6.3 分布式緩存集群的伸縮性
- 主要目標(biāo):必須讓新上線的緩存服務(wù)器對整個分布式緩存集群影響最小,也就是說新加入緩存服務(wù)器后應(yīng)使整個緩存服務(wù)器集群中已經(jīng)緩存的數(shù)據(jù)盡可能還被訪問到,這是分布式緩存集群伸縮性設(shè)計的最主要目標(biāo)
- 一致性Hash算法
- 具體使用二叉查找樹實現(xiàn),Hash查找過程實際上是在二叉查找樹中查找不小于查找數(shù)的最小數(shù)值。
- 通過虛擬節(jié)點解決負載不均衡的問題。
6.4 數(shù)據(jù)存儲服務(wù)器集群的伸縮性
-
關(guān)系數(shù)據(jù)庫集群的伸縮性設(shè)計
- 讀寫分離
- 數(shù)據(jù)分庫:不同業(yè)務(wù)數(shù)據(jù)表部署在不同的數(shù)據(jù)庫集群上
數(shù)據(jù)庫中間件,可以很好的支持數(shù)據(jù)分片。
- 應(yīng)用程序通過JDBC驅(qū)動訪問中間件集群,中間件服務(wù)器根據(jù)SQL和分庫規(guī)則分解SQL,分發(fā)到MySQL集群不同的數(shù)據(jù)庫實例上執(zhí)行(每個MySQL實例都部署從節(jié)點,保證高可用)。
- 在做集群的伸縮時,數(shù)據(jù)庫中間件可以使用負載均衡手段實現(xiàn);而MySQL中存儲這數(shù)據(jù),必須要做數(shù)據(jù)遷移,將集群中原來機器中的數(shù)據(jù)遷移到新添加的機器中。
NoSQL數(shù)據(jù)庫的伸縮性設(shè)計
HBase為可伸縮海量數(shù)據(jù)存儲而設(shè)計,主要依賴其可分裂的HRegion及可伸縮的分布式文件系統(tǒng)HDFS實現(xiàn)。
7 隨需應(yīng)變:網(wǎng)站的可擴展架構(gòu)
開發(fā)底耦合系統(tǒng)是軟件設(shè)計的終極目標(biāo)之一
模塊分布式部署后,具體聚合方式主要有分布式消息隊列和分布式服務(wù)
-
利用分布式消息隊列降低系統(tǒng)耦合性
- 事件驅(qū)動架構(gòu)(EDA)
通過在低耦合的模塊之間傳輸事件消息,以保持模塊的松散耦合,并借助事件消息的通信完成模塊間合作。典型的EDA架構(gòu)就是操作系統(tǒng)中常見的生產(chǎn)者消費者模式,最常用的是分布式消息隊列。 - 分布式消息隊列
-消息隊列服務(wù)器將消息寫入本地內(nèi)存隊列后立即返回成功響應(yīng)給消息生產(chǎn)者。
-伸縮性:將新服務(wù)器加入分布式消息隊列集群中,通知生產(chǎn)者服務(wù)器更改消息隊列服務(wù)器列表即可。
-可用性:如果內(nèi)存隊列已滿,會將消息寫入磁盤。
-為了避免消息隊列服務(wù)器宕機造成消息丟失,會將消息成功發(fā)送到消息隊列的消息存儲在消息生產(chǎn)者服務(wù)器,等消息真正被消息消費者服務(wù)器處理后才刪除消息。
- 事件驅(qū)動架構(gòu)(EDA)
利用分布式服務(wù)打造可復(fù)用的業(yè)務(wù)平臺
拆分服務(wù),使用分布式服務(wù)框架構(gòu)建其SOA(面向服務(wù)的體系架構(gòu))可擴展的數(shù)據(jù)結(jié)構(gòu)
需要實現(xiàn),無需修改表結(jié)構(gòu)就可以新增字段
許多NoSQL數(shù)據(jù)庫使用的ColumnFamily(列簇)設(shè)計就是一個解決方案。
8 固若金湯:網(wǎng)站的安全架構(gòu)
8.1 網(wǎng)站的攻擊和防御
(1)XSS攻擊
概念
跨站點腳本攻擊,指黑客通過篡改網(wǎng)頁,注入惡意HTML腳本,在用戶瀏覽網(wǎng)頁時,控制用戶瀏覽器進行惡意操作的一種攻擊方式。-
常見攻擊類型
- 反射型,攻擊者誘使用戶點擊一個嵌入惡意腳本的鏈接,達到攻擊的目的
- 持久型,黑客提交含有惡意腳本的請求,保存在被攻擊的Web站點的數(shù)據(jù)庫中,用戶瀏覽網(wǎng)頁時,惡意腳本被包含在正常頁面中,達到攻擊目的
-
防御手段
- 消毒。對某些html危險字符轉(zhuǎn)義,如">"轉(zhuǎn)義為">"、"<"轉(zhuǎn)義為"<"等。
- HttpOnly。瀏覽器機制頁面JavaScript訪問帶有HttpOnly屬性的Cookie。HttpOnly并不是直接對抗XSS攻擊,而是防止XSS攻擊竊取Cookie。
(2)注入攻擊
- 主要有兩種形式:SQL注入攻擊和OS注入攻擊。
- SQL注入原理:攻擊者在HTTP請求中注入惡意SQL命令(
http://www.a.com?user=frank';drop table users;--';),服務(wù)器用請求參數(shù)構(gòu)造數(shù)據(jù)庫SQL命令時,惡意SQL被一起構(gòu)造,并在數(shù)據(jù)庫執(zhí)行。 - 防御SQL注入首先要避免被攻擊者猜測到表名等數(shù)據(jù)庫表結(jié)構(gòu)信息,主要手段有:
- 消毒:通過正則匹配,過濾請求數(shù)據(jù)中可能注入的SQL
- 參數(shù)綁定:是最好的防SQL注入方法。ORM實現(xiàn)SQL預(yù)編譯和參數(shù)綁定,攻擊者的惡意SQL會被當(dāng)做SQL的參數(shù),而不是SQL命令執(zhí)行。
(3)CSRF攻擊
- 跨站點請求偽造。攻擊者通過跨站請求,以合法用戶的身份進行非法操作,如轉(zhuǎn)賬等。
- 其核心是利用了瀏覽器Cookie或者服務(wù)器Session策略,盜取用戶身份。
- 主要防御手段
- 表單Token。在頁面表單中增加一個隨機數(shù)作為Token,每次響應(yīng)頁面的Token不相同,偽造的請求無法獲取該值
- 驗證碼
- Referer check。檢查HTTP請求頭的Referer域,檢查來源是否合法。(可以利用這個配置防盜鏈)
8.2 信息加密技術(shù)及密鑰安全管理
一些信息加密技術(shù):
-
單向散列加密
- 通過對不同輸入長度的信息進行散列計算,得到固定長度的輸出。這個散列計算過程是單向的。
- 為了加強安全性,還會給散列算法加鹽(salt),salt相當(dāng)于加密的密鑰,增加破解的難度
- 常用單向散列算法:MD5、SHA
對稱加密
非對稱加密
密鑰的安全管理:
- 密鑰和算法放在一個獨立的服務(wù)器上,應(yīng)用系統(tǒng)調(diào)用這個服務(wù),實現(xiàn)數(shù)據(jù)的加解密
- 將加解密算法防砸應(yīng)用系統(tǒng)中,密鑰則放在獨立的服務(wù)器中,密鑰還可以分片保存。
8.3 信息過濾與反垃圾
常用的信息過濾與反垃圾手段:
- 文本匹配
常見的算法有:Trie樹變種、多級Hash表。 - 分類算法
常見的算法:貝葉斯分類算法 - 黑名單
可以通過Hash表實現(xiàn),但是當(dāng)黑名單列表非常大時,Hash表需要占據(jù)極大的內(nèi)存空間。
當(dāng)Hash表占內(nèi)存過大時,在對過濾需求不完全精確的場景下,可用布隆過濾器代替Hash表。


