大型網站的技術挑戰主要來自于龐大的網絡使用者,高并發的通路和海量資料,任何簡單的業務一旦需要處理數以P計的資料和面對數以億計的使用者,問題就會變得非常棘手。大型網站架構主要就是解決這類問題。
1.1初始階段的網站架構:
大型網站都是從小型網站發展而來,網站架構也是一樣,就從小型網站架構逐漸演化而來。小型網站在開始的時候沒有太多的人通路,隻需要一台伺服器就綽綽有餘,這時候網站架構如圖1-1所示:

應用程式,資料庫,檔案等所有的資源都放在一台伺服器上。通常伺服器作業系統使用Linux,應用程式使用php開發,然後部署在Apache上,資料庫使用mysql,彙集各種免費開源軟體及一台廉價伺服器就可以開始網站的發展之路。
1.2應用伺服器和資料服務分離
随着網站業務的發展,一台伺服器逐漸不能滿足需求:越來越多的使用者通路導緻性能越來越差,越來越多的資料導緻存儲控件不足,這時候就需要将應用和資料分離,應用和資料分離後整個網站使用3台伺服器,如下圖所示,這三台伺服器對硬體資源的要求各不相同,應用伺服器需要處理大量的業務邏輯資源,是以需要強大的CPU:資料庫伺服器需要快速磁盤檢索和資料緩存,是以需要更快的硬碟和更大的記憶體;檔案伺服器需要存儲大量使用者上傳的檔案,是以需要更大的硬碟。
應用和資料分離後,不同的伺服器承擔着不同的服務角色,網站的并發處理能力和資料存儲空間得到了很大的改善,支援網站業務也不斷發展。但是随着使用者逐漸增多,網站有一次面臨挑戰;資料壓力太大導緻通路延遲,進而影響整個網站的性能,使用者體驗收到影響,這時需要對網站架構進行進一步優化。
1.3使用緩存改善網站性能
網站的通路特點與現實世界的财富配置設定一樣遵循二八定律:80%的業務通路集中在20%的資料上。淘寶買家浏覽的商品集中在少部分成交數多、評價良好的商品上:商品搜尋關鍵詞集中在少部分熱門詞彙上。
既然大部分的業務集中在一小部分資料上,那麼如果把這一小部分緩存在記憶體中,是不是就可以減少資料庫的通路壓力,提高整個網站的資料通路速度,改善資料庫的寫入性能呢?
網站使用的緩存可以分為兩種,緩存在應用伺服器上的本地緩存和緩存在專門的分布式緩存伺服器上的遠端緩存。本地緩存的通路速度會快一些,但是收到應用伺服器記憶體限制,其緩存資料量有限,而且會出現和應用程式征用記憶體的情況。遠端分布式可以使用叢集的方式,部署大記憶體的伺服器最為專門的緩存的、伺服器,可以在理論上做到不受記憶體容量限制的緩存服務,如下圖所示:
使用緩存後通路壓力得到有效的緩解,但單一應用伺服器能夠處理的請求連接配接有限,在網站通路高峰期,應用伺服器成為整個網站的瓶頸。
1.4使用伺服器叢集改善網站的并發處理能力
使用叢集是網站解決高并發、海量資料問題的常用手段。當一台伺服器的處理能力存儲空間不足時,不要企圖去換更大的伺服器,對于大型網站而言,不管多麼強大的伺服器,都滿足不了網站持續增長的業務需求。在這用情況下,更恰當的做法是增加一台伺服器分擔原有伺服器的通路及存儲壓力。
對于網站架構而言,隻要通過一台伺服器的方式改善負載壓力,就可以以同樣的方式持續增加伺服器不斷改善系統性能,進而實作系統的可伸縮性。應用伺服器實作叢集是網站可伸縮叢集架構設計中比較成熟的一種,如圖所示:
通過負載均衡排程伺服器,可将來自使用者浏覽器的通路請求分發到應用伺服器叢集中的任何一台伺服器上,如果有更多的使用者,就在叢集中加入更多的應用伺服器,使應用伺服器的負載壓力不再成為整個網站的瓶頸。
1.5資料庫讀寫分離
網站使用緩存後,使絕大部分資料讀寫操作通路都不通過資料庫就能完成,但仍有一部分讀操作(緩存通路不命中、緩存過期)和全部的寫操作需要通路資料庫,在網站的使用者達到一定規模後,資料庫因為負載壓力過高而成為網站的瓶頸。
目前大部分主流資料庫都提供主從熱備功能,通過配置兩台資料庫主從關系,可以将一台資料庫伺服器的資料更新同步到另一台伺服器上。網站利用資料庫這一共功能,實作資料庫讀寫分離,進而改善資料庫負載壓力。
應用伺服器在寫資料的時候,通路主資料庫,主資料庫通過主從複制機制将資料更新同步到從資料庫,這樣當應用伺服器讀資料的時候,就可以通過從資料庫獲得資料,通常在應用伺服器端使用專門的資料通路子產品,是資料庫讀寫分離對應透明。