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