其實要設(shè)計一個高可用、高負(fù)載的系統(tǒng)還是有一定的規(guī)矩可循的,其手段無外乎向上擴(kuò)展(Sacle Up 硬件擴(kuò)展)或者向外擴(kuò)展(Scale Out 軟件擴(kuò)展),這兩種方案在某一階段時期,會顯著改善網(wǎng)站的性能,但不久之后,問題依舊。本文參考網(wǎng)上相關(guān)資料,試圖提供一個可行的 "有限" 解決方案。
早期
1. 對業(yè)務(wù)應(yīng)用進(jìn)行垂直分割,將不同的業(yè)務(wù)邊界劃分出來。程序員常說的 "多層體系" 只是縱向解決了不同編程層次的劃分,相對于業(yè)務(wù)而言,并沒有做出什么處理。現(xiàn)在 SOA 大行其道,除了人們認(rèn)識到面向服務(wù)帶來的互聯(lián)、擴(kuò)展性以外,它也將不同服務(wù)的變化區(qū)分開來,各自擁有獨立的實現(xiàn)和存儲機(jī)制。每個服務(wù)使用不同的數(shù)據(jù)庫或數(shù)據(jù)表,從一定程度上減輕了以往單個數(shù)據(jù)庫頻繁造成的 "鎖" 和 I/O 瓶頸問題。
2. 將網(wǎng)站系統(tǒng)中的動態(tài)內(nèi)容和靜態(tài)資源分離出來,使用單獨的更加高效的服務(wù)器(諸如 Apache + Linux)提供靜態(tài)信息。多數(shù)情況下,流量的極大部分來源于圖片、視頻等,用多臺服務(wù)器同時提供頁面顯示除了可以提高頁面響應(yīng)和現(xiàn)實速度外,同時他將流量分解到多臺服務(wù)器上。另外,我們應(yīng)該避免使用動態(tài)解析 (ASPNET_ISAPI.dll / HttpModule / HttpHandler) 來處理靜態(tài)數(shù)據(jù)的過濾和路徑重寫。
3. 使用緩存機(jī)制,包括使用諸如 ASP.NET Cache、PageCache、創(chuàng)建靜態(tài)頁面等手段。設(shè)計良好的緩存機(jī)制能極大提高系統(tǒng)性能和響應(yīng)速度。
4. 使用 64 位數(shù)據(jù)庫系統(tǒng)。SQL Server 2005 在 64 位系統(tǒng)上可以使用更多的內(nèi)存(最高64GB),而且在多 CPU 下也擁有更好的性能。有了更大的內(nèi)存,我們甚至可以將某些常用且極少變化的表(比如分類目錄表等)設(shè)置為內(nèi)存表以提高響應(yīng)速度。
5. 關(guān)閉操作系統(tǒng)的某些安全設(shè)置,比如 Windows 2003 預(yù)防 DDOS 攻擊的一些設(shè)置,也可以避免一些意外的訪問瓶頸。
運行期
6. 建立多數(shù)據(jù)庫體系。使用單個或多個用于數(shù)據(jù)更新的數(shù)據(jù)庫服務(wù)器,然后利用數(shù)據(jù)庫的復(fù)制和訂閱功能同步到其他多臺專門用于顯示的數(shù)據(jù)庫服務(wù)器上,這樣可以有效減少因為更新帶來的數(shù)據(jù)庫訪問等待。當(dāng)然,這種體系并不適用所有的業(yè)務(wù)。
7. 對大數(shù)據(jù)表進(jìn)行分區(qū)。現(xiàn)在的主流數(shù)據(jù)庫基本都支持?jǐn)?shù)據(jù)表分區(qū)功能,我們可以橫向分區(qū),將不同時期的數(shù)據(jù)存放到多個分區(qū)表中;也可以縱向分區(qū),將不常用的字段放到其他分區(qū)表中。分區(qū)表并不會影響到我們的開發(fā)模式,無須對代碼進(jìn)行調(diào)整,但數(shù)據(jù)表尺寸從 TB 減小到 GB 所帶來的好處是無法忽略的。
8. 使用負(fù)載均衡等手段提升性能。包括DNS負(fù)載均衡、代理服務(wù)器負(fù)載均衡、地址轉(zhuǎn)換網(wǎng)關(guān)負(fù)載均衡、協(xié)議內(nèi)部支持負(fù)載均衡、NAT負(fù)載均衡、反向代理負(fù)載均衡等,負(fù)載均衡作為最常用的上擴(kuò)手段,其效果也非常明顯。
9. 使用 SAN 等專用的存儲系統(tǒng)來提高 I/O 性能。SAN 使用光纖通道連接多個存儲設(shè)備,可以改善多個服務(wù)器硬盤之間使用網(wǎng)線傳輸數(shù)據(jù)的性能問題。此外,SAN 還可以動態(tài)調(diào)整存儲容量,更加有利于系統(tǒng)備份和恢復(fù)。
10. 電力備份。如果是自主機(jī)房,除了配置 UPS 電源外,最好擁有獨立的發(fā)電設(shè)備。當(dāng)然,對中小型網(wǎng)站而言,這過于奢侈了些。