1. 程式人生 > >大型網站架構發展歷程

大型網站架構發展歷程

前言

大型網站的技術挑戰主要來自於龐大的使用者,高併發的訪問和海量的資料,任何簡單的業務一旦需要處理數以 P 計的海量資料和麵對數以億計的使用者,問題就會變得很棘手。大型網站架構主要就是要解決這類問題。

初始階段的網路結構

大型網站都是由小型網站發展而來,網路結構也是一樣。小型網站一開始沒有太多人訪問,只需要一臺伺服器就綽綽有餘,這時的網站架構如下的所示。
這裡寫圖片描述
應用程式、資料庫、檔案等所有的資源都在一臺伺服器上。通常伺服器作業系統使用Linux,資料庫使用MySQL,彙集各種免費開源軟體以及一臺廉價伺服器就可以開始網站的發展之路了。

應用服務與資料服務分離

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


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

使用快取改善網站效能

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

既然大部分的業務訪問集中在一小部分的資料上,那麼如果把這小部分資料快取在記憶體中,是不是就可以減少資料庫的訪問壓力了,提升整個網站的資料訪問速度,改善資料庫的讀寫效能了呢?

網站使用快取可以分為兩種:快取在應用伺服器上的本地快取和快取在分散式快取伺服器上的遠端快取。本地快取的訪問速度更快一些但是受應用伺服器的記憶體限制,其快取的資料量有限,而且會出現和應用程式掙用記憶體的現象,影響應用程式執行速度,甚至造成伺服器宕機。遠端分散式快取可以使用叢集的方式,部署大記憶體的伺服器作為專門的快取伺服器,理論上可以無限擴容,如下圖所示。
這裡寫圖片描述

使用快取後,資料訪問壓力得到有效緩解,但是單一的應用伺服器能夠處理的請求連線有限,在網站訪問高峰期,應用伺服器成為整個網站的的瓶頸。

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

使用叢集是網站解決高併發、海量資料的常用手段。當一臺伺服器的處理能力、儲存空間不足時,可以在增加一臺伺服器分擔原有伺服器的訪問及儲存壓力。

對於網站架構而言,只需要通過增加一臺伺服器的方式改善負載壓力,就可以以同樣的方式持續增加伺服器不斷改善系統性能,總而實現系統的可伸縮性。應用伺服器實現叢集是網站可伸縮叢集架構設計最為簡單成熟的一種,如下圖所示。
這裡寫圖片描述
通過負載均衡排程伺服器,可將來自使用者瀏覽器的訪問請求分發到應用伺服器幾群的任何一臺機器上,如果有更多的使用者,就在叢集中加入更多的應用伺服器,使應用伺服器的負載不再成為整個網站的瓶頸。

資料庫讀寫分離

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

目前大部分的主流資料庫都提供主從熱備功能,通過配置兩臺資料庫的主從關係,可以將一臺資料庫伺服器上的資料更新同步帶另一臺伺服器上。網站利用資料庫這一功能,實現資料庫讀寫分離,從而改善資料庫負載壓力,如下圖所示。
這裡寫圖片描述
應用服務在寫資料的時候,訪問主資料庫,主資料庫通過主從複製機智將資料庫更新同步到從資料庫。這樣當應用伺服器讀資料的時候,就可以通過從資料庫獲得資料。為了便於應用程式訪問讀寫分離後的資料庫,通常在應用伺服器端使用專門的資料庫服務模組,使資料庫讀寫分離對應用透明。

使用反向代理和CDN加速網站響應

隨著網站業務不斷髮展,使用者規模越來越大,由於中國網路環境複雜,不同地區的使用者訪問網路時,速度差別極大,有研究表明,網站訪問延遲和使用者流失率正相關,網站訪問越慢,使用者越容易失去耐心而離開。為了提供更好的使用者體驗,留住使用者,網站需要加速網站訪問速度。主要手段有使用CDN和反向代理,如下圖。
這裡寫圖片描述
CDN和反向代理的基本原理都是快取,區別在於CDN部署在網路提供商的機房,使使用者在請求網站服務時,可以從距離自己最近的網路提供商機房獲取資料;而反向代理則部署在網站的中心機房,當用戶請求到達中心機房後,首先訪問的伺服器是方向代理伺服器,如果反向代理伺服器中快取著使用者請求的資源將直接返回給使用者。
使用CDN和反向代理的目的都是儘早返回資料給使用者,一方面加快使用者訪問速度,另一方面也減輕後端伺服器的負載壓力。

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

任何強大的單一伺服器都滿足不了大型網站持續增長的業務需求。資料庫經過讀寫分離後,從單一伺服器拆分成兩臺伺服器,但隨著網站業務的發展依然不能滿足需求,這時就需要使用分散式資料庫。檔案系統也是一樣,需要使用分散式檔案系統,如下圖。
這裡寫圖片描述
分散式資料庫是網站資料庫拆分的最後手段,只有在單表資料規模分廠龐大的時候才使用。不到不得已時,網站更常用的資料庫拆分手段是業務分庫,將不同業務的資料庫部署在不同的物理伺服器上。

使用搜索引擎和NOSQL

隨著網站業務越來越複雜,對資料儲存和檢索的需求也越來越複雜,網站需要採用一些非關係型資料庫技術如 NOSQL 和非資料庫查詢技術如搜尋引擎,如下圖。
這裡寫圖片描述
NOSQL 和搜尋引擎都是源於網際網路的技術手段,對可伸縮的分散式特性具有更好的支援。應用伺服器則通過一個統一資料訪問模組訪問各種資料,減輕應用程式管理諸多資料來源的麻煩。

業務拆分

大型網站為了應對日益複雜的業務場景,通過使用分而治之的手段將整個網站業務分成不同的產品線,如 P2P 理財網站會將風控、銀行存管、投資人、借款人、標的、資產打包和拆分分成不同的產品線,分歸不同的業務團隊負責。每個應用部署在獨立的伺服器上。應用之間可以通過訊息中介軟體或者介面的方式建立連線,通過訪問同一個資料儲存系統來構成一個關聯的完整系統。如下圖。
這裡寫圖片描述

分散式服務

隨著業務拆分越來越小,儲存系統越來越龐大,應用系統的整體複雜度呈指數級增加,部署維護越來越困難。由於所有應用要和所有資料庫系統連線,在數萬臺伺服器規模的網站中,這些連線的數目是伺服器規模的平方,導致資料庫連線資源不足,拒絕服務。
既然每一個應用系統都執行許多相同的業務操作,比如使用者管理、商品管理等,那麼可以將這些共用的業務提取出來,獨立部署。由這些可複用的業務連線資料庫,提供共用業務服務,而應用系統只需要管理使用者介面,通過分散式服務呼叫共用業務服務完成具體業務操作,如下圖。
這裡寫圖片描述

大型網站架構發站歷程講到這裡,接下來的文章將圍繞著本篇所涉及到的技術展開,詳細講述大型網站核心技術以及一些業務場景下的最終解決方案。