一個較為合理的網站架構,通常會對整個架構進行分層設計。這樣的好處是分散伺服器的壓力,不至於由於單台伺服器壓力過大宕機而停止提供服務。在架構設計中,我覺得有2個黃金準則。一個是“所有的問題,都往前面推”,另一個是“避免單點故障”。這兩點實際上也就保證了系統架構的高可用、可擴充性和可靠性。
下面簡單的畫一個圖,來說明一下,就我的理解,一個網站的架構大概可以分為以下四層:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131227/1G1535602-0.jpg" title="一般網路架構.jpg" />
從底層開始,分別是共用儲存層,伺服器層,緩衝加速層,負載平衡層等4層。
共用儲存層:提供儲存空間,由於上面一層多台伺服器都串連到共用存放裝置這裡來,這樣就保證了資料的一致性。當然共用存放裝置的價格還是相當昂貴的,並不是所有公司,所有業務都承受得起。在沒有這種條件的情況下,就只能使用一台有較大硬碟空間的伺服器,作為存放裝置,並在上層伺服器上,通過NFS 掛載該裝置。
這一層所涉及的技術或工具有:Distributed File System,NFS,DRBD,RAID陣列等。
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131227/1G1531618-1.gif" />相關連結:
DRBD+HeartBeat+NFS 架構 http://pmghong.blog.51cto.com/3221425/1261349
鏡像技術DRBD http://pmghong.blog.51cto.com/3221425/1260138
磁碟鏡像技術 DRBD 原理簡介 http://pmghong.blog.51cto.com/3221425/1259488
伺服器層:顧名思義,這一層伺服器主要提供相關的業務支援,例如這是一個網站架構,則這裡提供的主要是web服務和mysql資料庫的服務。多台伺服器組成的一個集合叫做“伺服器集區”,當使用者請求分配過來後,系統將從伺服器集區中挑選出其中一台服務,並由分配到的這台伺服器真正的提供服務。當業務擴充,伺服器壓力過大,可以往該伺服器集區中添加新的伺服器,共同分攤壓力,從而減小單台機器的壓力,提高效率。
這一層涉及的軟體:apache、nginx、lighthttpd等。其中以nginx的效能為優,它支援高並發,而且資源消耗少,配置簡單。
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131227/1G1531618-1.gif" />相關連結:
nginx+tomcat 跑jsp http://pmghong.blog.51cto.com/3221425/1218497
apache+nginx 實現動靜分離 http://pmghong.blog.51cto.com/3221425/1217151
搭建lemp環境http://pmghong.blog.51cto.com/3221425/1178603
緩衝層:這一層實際上並不是必須的,但業務較小的時候,可以先不考慮這一層的設計。緩衝層顧名思義,就是通過緩衝靜態檔案,從而達到加速的功能。設定了緩衝層之後,當使用者第一次請求訪問的時候,快取服務器會到底層走一遍,將使用者請求資料拿過來,發送給使用者並在本地儲存一份資料。但第二次,使用者請求相同的內容的時候,快取服務器還是會到底層跑一遍,但是它只做一個校正,已確保緩衝中的資料是否與底層伺服器上的資料一致。如果一致,則快取服務器會將緩衝中的資料直接返回給使用者,從而提高使用者體驗。
這一層涉及的軟體:squid,nginx
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131227/1G1531618-1.gif" />相關連結:
nginx 實現反向 Proxy http://pmghong.blog.51cto.com/3221425/1244223
負載平衡層:這一層的伺服器作為先鋒置於最前端,使用者請求最先到達),需要相當的處理和負載能力,因為它本身充當的就是一個調度器的作用,需要扛住大量的使用者訪問所造成的壓力。因此這一層的伺服器往往要求高CPU,高記憶體和高頻寬等。另外這一層作為整個架構的最前端,相當於整個架構的統帥,一旦這一層停止提供服務,底層伺服器將全部停止提供服務(確切的講,是沒辦法被分配到任務)所以,應該足夠重視這一層伺服器的設定,可通過一些機制、技術來確保其可靠性。不至於單台伺服器宕機,則造成整個系統的癱瘓。
這一層涉及的軟體和技術:haproxy、keepalived、nginx、lvs等
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131227/1G1531618-1.gif" />相關連結:
nginx+keepalived 負載平衡架構 http://pmghong.blog.51cto.com/3221425/1264947
Haproxy+keepalived實現高可用負載平衡 http://pmghong.blog.51cto.com/3221425/1262741
lvs+keepalive 實現高可用叢集 http://pmghong.blog.51cto.com/3221425/1201533
LVS_TUN http://pmghong.blog.51cto.com/3221425/1195695
LVS_DR http://pmghong.blog.51cto.com/3221425/1195686
LVS_NAT http://pmghong.blog.51cto.com/3221425/1192543
補充一下:
實際上,在架構的設計中,還有兩點需要考慮進去,一個就是資料庫的設計。對於一個大型網站來說,資料庫的設計尤為重要,它可能對網站的整體響應速度上,起著至關重要的作用。例如,當資料量大的時候,應該如何對資料進行“切割”,如何提高查詢速度,這些都是我們需要考慮的。(這裡只考慮mysql)
相關技術和要點:
mysql分表(垂直分表,水平分表)、mysql分區、mysql慢查詢、sql語句最佳化、參數最佳化、索引、Database Backup等。
主要的架構有:主從複製、mysql叢集
另一方面就是監控系統。在事故發生的第一時間趕赴現場並及時處理問題,是我們營運人員義不容辭的。我們不可能7*24 小時對著監控螢幕看伺服器是否出現問題,這時我們便需要一個工具來幫我們“看著”我們的伺服器,那就是監控系統。
這裡說的監控系統,其實可大可小,具體應該根據業務需求來確定,可以簡單的通過shell,python等指令碼來實現監控並警示。也可以通過其他開源軟體來完成,這裡主要推薦以下三款:
nagios、cacti和zabbix,這三者各有優缺點,這裡就不展開了,有需要的可以自行去瞭解。
以上觀點,均為個人所見,鑒於本人學識淺薄,可能很多方面都沒考慮到,還請大家多多指教。有什麼補充的,也歡迎大家提出來,完善一下!謝謝