大型網站架構演化

頭像是我偶像發表於2017-06-14

一、大型網站軟體系統的特點

  • 高併發,大流量
  • 高可用
  • 海量資料
  • 使用者分佈廣泛,網路情況複雜
  • 安全環境惡劣
  • 需求快速變更,釋出頻繁
  • 漸進式發展

二、大型網站架構演化發展歷程

2.1 初始階段的網站架構

小型網站最開始時沒有太多人訪問,只需要一臺伺服器就綽綽有餘。這裡,應用程式,資料庫,檔案等所有的資源都在一臺伺服器上。通常伺服器作業系統使用Linux,應用程式使用PHP開發,然後部署在Apache伺服器上,資料庫使用Mysql,彙集各種免費開源軟體及一臺廉價伺服器就可以開始網站的發展之路了。

2.2 應用服務和資料服務分離

隨著網站業務的發展,一臺伺服器逐漸還能滿足需要:越來越多的使用者訪問導致效能越來越差,越來越多的資料導致儲存空間不足。這裡就需要將應用和資料分離。應用 和資料分離後整個網站使用三臺伺服器:應用伺服器,檔案伺服器和資料庫伺服器。

這三臺伺服器對硬體資源的要求各不相同:
* 應用伺服器需要處理大師的業務邏輯,因此需要更快更強大的CPU;
* 資料庫伺服器需要快速磁碟檢索和資料快取,因此需要更快的硬碟和更大的記憶體;
* 檔案伺服器需要儲存大量使用者上傳的檔案,因此需要更大的硬碟;
*

2.3 使用快取改善網站效能

網站訪問特點和現實世界的財富分配一樣遵循二八定律:80%的業務訪問集中在20%的資料上。如,淘寶買家瀏覽的埠集中在少部分成交數多,評價良好的商品上;百度搜尋關鍵詞集中在少部分熱門詞彙上。

既然大部分的業務訪問集中在一小部分資料上,那麼如果把這一小部分資料快取在記憶體中,可以減少資料庫的訪問壓力,提高整個網站的資料訪問數度,改變資料庫的寫入效能了。

網站快取可以分為兩種:快取在應用伺服器上的本地快取和快取在專門的健在式快取伺服器上的遠端快取。
* 本地快取的訪問速度更快一些,但是愛應用伺服器記憶體限制,其快取資料量有限,而且會出現和應用程式急用記憶體的情況。
* 遠端分散式快取可以使用叢集的方式,部署大記憶體的伺服器作為專門的快取伺服器,可以在理論上做到不受記憶體容量限制的快取服務。
*

2.4 使用應用伺服器叢集改善網站的併發處理能力

單一應用伺服器能夠處理的請求連線有限,在網站訪問高斯,應用伺服器成為整個網站的瓶頸。

使用叢集是網站解決高併發、海量資料問題的常用手段。對網站架構而言,只要能通過增加一隻伺服器的方式改善負載壓力,就可以以同樣的方式持續增加伺服器不斷改善系統效能,從而實現系統的可伸縮性。應用伺服器實現叢集是網站可伸縮叢集架構設計中較為簡單成熟的一種。

通過負載均衡除錯伺服器,可將來自使用者瀏覽器的訪問請求分發到應用伺服器叢集中的任何一臺伺服器上,如果有更多的使用者,就在叢集中加入更多的應用伺服器,使應用伺服器的負載壓力不再成為網站的瓶頸。

2.5 資料庫讀寫分離

網站在使用快取後,使絕大部分資料讀操作訪問都可以不通過資料庫就能完成,但仍有一部分讀操作(快取訪問不命中,或快取過期)和全部的寫操作需要訪問資料庫,在網站的使用者達到一定規模後資料庫因為負載壓力過高而成為網站的瓶頸。

目前大部分的主流資料庫都提供評價熱備功能,通過配置兩臺資料庫主從關係,可以將一臺資料庫伺服器的資料更新同步到另一臺資料庫上。網站利用資料庫的這一功能,實現資料庫讀寫分離,從而發病資料庫負載壓力。具體實現:

  • 應用伺服器在寫資料的時候,訪問主資料庫,主資料庫通過主從複製機制將資料更新同步到從資料庫,這樣當應用伺服器讀資料庫的時候,就可以通過從資料庫獲得資料。為了便於應用程式訪問讀寫分離後的資料庫,通常在應用伺服器端使用專門的資料庫訪問模組,使資料庫讀寫分離對應用透明。
  • *

2.6 使用反向代理和CDN回事網站響應

網站訪問延遲和使用者流失率正相關,為了提供更好的使用者體驗,網站需要加速網站訪問速度,主要手段有使用CDN和反向代理。
* CDN和反向代理的基本原理都是快取,區別在於CDN部署在網路提供商的機房,使使用者在請求網站時,可以從距離自己最近的網路提供商機房獲取資料;
* 反向代理則部署在網站的中心機房,當使用者請求到達中心機房後,首先訪問的伺服器是反向代理伺服器,如果反向代理伺服器中快取著使用者請求的資源,就將其直接返回給使用者。
* 使用CDN和反向代理的目的都是遲早返回資料給使用者,一方面加快使用者訪問速度,另一方面也減輕後端伺服器的負載壓力。
*

2.7 使用分散式檔案系統和分散式資料庫系統

任何強大的單一伺服器都滿足不也大型網站持續增長的業務需求。資料庫經過讀寫分離後,從一臺伺服器拆分成兩臺資料庫,但是隨著網站業務的發展依然還能滿足需求,這裡需要使用分散式資料庫。檔案系統也一樣,需要使用分散式檔案系統。

2.8 使用NoSQL和搜尋引擎

隨著網站業務越來越複雜,對資料儲存和檢索的需求也越來越複雜,網站需要採用一些非關聯式資料庫技術如NoSQL和非資料庫查詢技術如搜尋引擎。

NoSQL和搜尋引擎都是源自網際網路的技術手段,對可伸縮的分散式特性具有更好的支援。應用伺服器則通過一個統一資料訪問模組訪問各種資料,減輕應用程式管理諸多資料來源的麻煩。

2.9 業務拆分

大型網站為了應對日益複雜的業務場景,通過使用分而治之的手段將整個網站業務分成不同的產品線,如大型購物交易網站就會將首頁、商鋪、訂單、買家、賣家等拆分成不同的產品線,分歸不同的業務團隊負責。

具體到技術上,也會根據產品線劃分,將一個網站拆分成許多不同的應用,每個應用部署維護。應用之間可以通過一個超連結建立關係,也可以通過訊息佇列進行資料分發,當然最多的還是通過訪問同一個資料儲存系統來構成一個關聯的完整系統。

2.10 分散式服務

隨著業務拆分越來越小,儲存系統越來越大,應用系統的整體複雜度呈現指數級增加,部署維護越來越困難。由於所有應用要和所有資料庫系統連線,在數萬臺伺服器規模的網站中,這些連線的數目是伺服器規模的平方,相當龐大。

既然每一個應用系統都需要執行許多相同的業務操作,比如使用者管理,商品管理等,那麼可以將這些共用的業務提取出來,獨立部署。由這些可利用的業務連線資料庫,提供共用業務服務,而應用系統只需要管理使用者介面,通過分散式服務呼叫共用業務服務完成具體業務操作即可。

2.11 雲端計算的發展

既然大型網站架構解決了海量資料的管理和高併發事務的處理,那麼就可以把這些解決方案應用到網站自身以外的業務上去。

我們看到目前許多大型網站都建設了雲端計算平臺,將計算作為一種基礎資源出售,中小網站不需要再關心技術架構問題,只需要按需付費,就可以使網站隨著業務的增長逐漸獲得更大的儲存空間和更多的計算資源。

三、小結

  • 驅動大型網站技術發展的主要力量是網站的業務發展
  • 不要企圖用技術解決所有問題,能控制住併發訪問量,很多棘手的問題也就迎刃而解了。
  • 現在越來越多的小型網站從建立之初就是搭建在大型網站提供的雲端計算服務基礎之上,所需要一切技術資源:計算、儲存、網路都可以按需購買,線性伸縮,不需要自己一點一點地拼湊各種資源。

相關文章