1. 程式人生 > >大型網站的架構

大型網站的架構

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

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

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

1、初始階段的網站架構

最開始網站的應用程式、資料庫、檔案等所有的資源都在一臺伺服器上。最典型的就是LAMP技術了:伺服器作業系統使用Linux,應用程式使用PHP開發,資料庫使用MySQL,然後部署在Apache上。

2、應用服務和資料服務分離

隨著網站業務的發展,一臺伺服器的效能和儲存空間逐漸不能滿足需求,這時就將應用和資料分離,整個網站使用三臺伺服器:應用伺服器、檔案伺服器和資料庫伺服器。三臺伺服器對硬體資源的要求也各不相同:應用伺服器需要更快更強大的CPU,資料庫伺服器需要更快的硬碟的更大的記憶體,檔案伺服器需要更大的硬碟。

3、使用快取改善網站效能

網站訪問特點和現實世界的財富分配一樣遵循二八定律:80%的業務訪問集中在20%的資料上。把大部分業務訪問的小部分資料快取在記憶體中,可以減少資料庫的訪問壓力,提高整個網站的資料訪問速度。

快取可以分為兩種:應用伺服器上的本地快取和分散式快取伺服器上的遠端快取。本地快取訪問速度更快,但快取資料有限,而且會出現和應用程式爭用記憶體的情況。遠端快取可以使用叢集的方式,理論上可以做到不受記憶體容量的限制。

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

一臺應用伺服器所能處理的請求有限(一臺Tomcat大概六七百),企圖去換更強大的伺服器也終究會滿足不了持續增長的業務需求,而且網站有訪問高峰期和低谷期,擴充套件性也不好。使用叢集是網站解決高併發、海量資料問題的常用手段。通過負載均衡排程伺服器,可將來自使用者瀏覽器的訪問請求分發到應用伺服器叢集中的任何一臺伺服器上。

5、資料庫讀寫分離

使用快取後,仍有一部分讀操作(快取訪問不命中、快取過期)和全部的寫操作需要訪問資料庫。資料庫伺服器也終究會因為負載壓力過高而成為網站的瓶頸。

目前大部分的主流資料庫都提供主從熱備功能,通過配置兩臺資料庫主從關係,可以將一臺資料庫伺服器的資料更新同步到另一臺資料庫伺服器。

應用伺服器在寫資料的時候,訪問主資料庫,主資料庫通過主從複製機制將資料更新同步到從資料庫,這樣當應用伺服器讀資料的時候,就可以通過從資料庫獲得資料。

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

CDN和反向代理的基本原理都是快取,區別在於CDN部署在網路提供商的機房,使使用者在請求網站服務時,可以從距離自己最近的網路提供商機房獲取資料;而反向代理則部署在網站的中心機房,當用戶請求到達中心機房後,首先訪問的伺服器是反向代理伺服器,如果反向代理伺服器中快取著使用者請求的資源,就將其直接返回給使用者。

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

只有在單表資料規模非常龐大的時候才使用分散式資料庫。網站更常用的資料庫拆分手段是業務分庫。

8、使用NoSQL和搜尋引擎

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

9、業務拆分

大型網站為了應對日益複雜的業務場景,通過使用分而治之的手段將整個網站按業務拆分,如購物系統將首頁、商鋪、訂單、購物車、支付等分成不同模組,分歸不同的團隊負責,作為不同的應用獨立開發和獨立部署。用得最多的是各應用通過訪問同一個資料儲存系統來構成一個關聯的完整系統。

10、分散式服務

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

三、大型網站的架構模式

1、分層

對網站軟體系統在橫向方面進行切分,分為應用層、服務層、資料層。

  • 應用層:負責具體業務和檢視展示,如網站首頁及搜尋輸入和結果展示。
  • 服務層:為應用層提供服務支援,如使用者管理服務、購物車服務等。
  • 資料層:提供資料儲存訪問服務,如資料庫、快取、檔案、搜尋引擎等。

2、分割

在縱向方向對軟體進行切分,將網站按不同的功能和服務分割,包裝成高內聚低耦合的模組單元。一方面有助於軟體的開發和維護,另一方面便於不同模組的分散式部署,提高網站的併發處理能力和功能擴充套件能力。比如將軟體系統的購物、論壇、搜尋、廣告分割成不同的應用。

3、分散式

在網站應用中,常用的分散式方案有以下幾種。

  • 分散式應用和服務:將分層和分割後的應用和服務模組分散式部署。
  • 分散式靜態資源:網站的靜態資源如JS、CSS、Logo圖片等資源獨立分散式部署。
  • 分散式資料和儲存:為網站應用而生的各種NoSQL產品幾乎都是分散式的。
  • 分散式計算:Hadoop及其MapReduce分散式計算框架,移動計算而不是移動資料。
  • 分散式配置:支援網站線上伺服器配置實時更新。
  • 分散式鎖:分散式環境下實現併發和協同。
  • 分散式檔案系統:FastDFS、HDFS。

4、叢集

提高網站高併發和高可用的能力。

5、快取

提高資料訪問速度。

  • CDN
  • 反向代理
  • 本地快取
  • 分散式快取

6、非同步

  • 降低軟體耦合性。
  • 提高系統可用性。
  • 加快網站相應速度。
  • 消除併發訪問高峰。

7、冗餘

伺服器故障時保證資料不丟失。

8、自動化

  • 釋出過程自動化
  • 自動化程式碼管理
  • 自動化測試
  • 自動化安全檢測
  • 自動化部署
  • 自動化監控
  • 自動化報警
  • 自動化失效轉移
  • 自動化失效恢復
  • 自動化降級
  • 自動化分配資源

9、安全

  • 通過密碼和手機驗證碼進行身份認證。
  • 對網路傳輸資料進行加密。
  • 使用驗證碼識別機器人程式濫用網路資源攻擊網站。
  • 攻擊網站的XSS攻擊、SQL注入進行編碼轉換。
  • 垃圾資訊、敏感資訊的過濾。
  • 交易轉賬等重要操作的風險控制。

四、大型網站的架構技術一覽

1、前端架構

  • 瀏覽器優化技術
  • CDN
  • 動靜分離,靜態資源獨立部署
  • 圖片服務
  • 反向代理
  • DNS

2、應用層架構

  • 開發框架
  • 頁面渲染
  • 負載均衡
  • Session管理
  • 動態頁面靜態化
  • 業務拆分
  • 虛擬化伺服器

3、服務層架構

  • 分散式訊息
  • 分散式服務
  • 分散式快取
  • 分散式配置

4、儲存層架構

  • 分散式檔案
  • 關係資料庫
  • NoSQL資料庫
  • 資料同步

5、後臺架構

  • 搜尋引擎
  • 資料倉庫
  • 推薦系統

6、資料採集與監控

  • 瀏覽器資料採集
  • 伺服器業務資料採集
  • 伺服器效能資料採集
  • 系統監控
  • 系統報警

7、安全架構

  • Web攻擊
  • 資料保護

8、資料中心機房架構

  • 機房架構
  • 機櫃架構 
  • 伺服器架構

本文主要摘自 阿里大牛 李智慧 寫的《大型網站技術架構·核心原理與案例分析》。