大型網際網路架構概述,看完文章又漲知識了

李紅歐巴發表於2019-04-28

1. 大型網站系統的特點

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

2. 大型網站架構演化歷程

2.1. 初始階段架構

問題:網站運營初期,訪問使用者少,一臺伺服器綽綽有餘。

特徵:應用程式、資料庫、檔案等所有的資源都在一臺伺服器上。

描述:通常伺服器作業系統使用 linux,應用程式使用 PHP 開發,然後部署在 Apache 上,資料庫使用 Mysql,通俗稱為 LAMP。彙集各種免費開源軟體以及一臺廉價伺服器就可以開始系統的發展之路了。

大型網際網路架構概述,看完文章又漲知識了

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

問題:越來越多的使用者訪問導致效能越來越差,越來越多的資料導致儲存空間不足,一臺伺服器已不足以支撐。

特徵:應用伺服器、資料庫伺服器、檔案伺服器分別獨立部署。

描述:三臺伺服器對效能要求各不相同:應用伺服器要處理大量業務邏輯,因此需要更快更強大的 CPU;資料庫伺服器需要快速磁碟檢索和資料快取,因此需要更快的硬碟和更大的記憶體;檔案伺服器需要儲存大量檔案,因此需要更大容量的硬碟。

大型網際網路架構概述,看完文章又漲知識了

2.3. 使用快取改善效能

問題:隨著使用者逐漸增多,資料庫壓力太大導致訪問延遲。

特徵:由於網站訪問和財富分配一樣遵循二八定律:80% 的業務訪問集中在 20% 的資料上。將資料庫中訪問較集中的少部分資料快取在記憶體中,可以減少資料庫的訪問次數,降低資料庫的訪問壓力。

描述:快取分為兩種:應用伺服器上的本地快取和分散式快取伺服器上的遠端快取,本地快取訪問速度更快,但快取資料量有限,同時存在與應用程式爭用記憶體的情況。分散式快取可以採用叢集方式,理論上可以做到不受記憶體容量限制的快取服務。

大型網際網路架構概述,看完文章又漲知識了

2.4. 使用應用伺服器叢集

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

特徵:多臺伺服器通過負載均衡同時向外部提供服務,解決單一伺服器處理能力和儲存空間不足的問題。

描述:使用叢集是系統解決高併發、海量資料問題的常用手段。通過向叢集中追加資源,提升系統的併發處理能力,使得伺服器的負載壓力不再成為整個系統的瓶頸。

大型網際網路架構概述,看完文章又漲知識了

2.5. 資料庫讀寫分離

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

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

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

大型網際網路架構概述,看完文章又漲知識了

2.6. 反向代理和 CDN 加速

問題:中國網路環境複雜,不同地區的使用者訪問網站時,速度差別也極大。

特徵:採用 CDN 和反向代理加快系統的靜態資源訪問速度。

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

大型網際網路架構概述,看完文章又漲知識了

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

問題:隨著大型網站業務持續增長,資料庫經過讀寫分離,從一臺伺服器拆分為兩臺伺服器,依然不能滿足需求。

特徵:資料庫採用分散式資料庫,檔案系統採用分散式檔案系統。

描述:分散式資料庫是資料庫拆分的最後方法,只有在單表資料規模非常龐大的時候才使用。不到不得已時,更常用的資料庫拆分手段是業務分庫,將不同的業務資料庫部署在不同的物理伺服器上。

大型網際網路架構概述,看完文章又漲知識了

2.8. 使用 NoSQL 和搜尋引擎

問題:隨著網站業務越來越複雜,對資料儲存和檢索的需求也越來越複雜。

特徵:系統引入 NoSQL 資料庫及搜尋引擎。

描述:NoSQL 資料庫及搜尋引擎對可伸縮的分散式特性具有更好的支援。應用伺服器通過統一資料訪問模組訪問各種資料,減輕應用程式管理諸多資料來源的麻煩。

大型網際網路架構概述,看完文章又漲知識了

2.9. 業務拆分

問題:大型網站的業務場景日益複雜,分為多個產品線。

特徵:採用分而治之的手段將整個網站業務分成不同的產品線。系統上按照業務進行拆分改造,應用伺服器按照業務區分進行分別部署。

描述:應用之間可以通過超連結建立關係,也可以通過訊息佇列進行資料分發,當然更多的還是通過訪問同一個資料儲存系統來構成一個關聯的完整系統。

縱向拆分:將一個大應用拆分為多個小應用,如果新業務較為獨立,那麼就直接將其設計部署為一個獨立的 Web 應用系統。縱向拆分相對較為簡單,通過梳理業務,將較少相關的業務剝離即可。

橫向拆分:將複用的業務拆分出來,獨立部署為分散式服務,新增業務只需要呼叫這些分散式服務橫向拆分需要識別可複用的業務,設計服務介面,規範服務依賴關係。

大型網際網路架構概述,看完文章又漲知識了

2.10. 分散式服務

問題:隨著業務越拆越小,儲存系統越來越龐大,應用系統整體複雜程度呈指數級上升,部署維護越來越困難。由於所有應用要和所有資料庫系統連線,最終導致資料庫連線資源不足,拒絕服務。

特徵:公共業務提取出來,獨立部署。由這些可複用的業務連線資料庫,通過分散式服務提供共用業務服務。

大型網際網路架構概述,看完文章又漲知識了

3. 大型網站架構模式

3.1. 分層

大型網站架構中常採用分層結構,將軟體系統分為應用層、服務層、資料層:

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

分層架構的約束:禁止跨層次的呼叫(應用層直接呼叫資料層)及逆向呼叫(資料層呼叫服務層,或者服務層呼叫應用層)。

分層結構內部還可以繼續分層,如應用可以再細分為檢視層和業務邏輯層;服務層也可以細分為資料介面層和邏輯處理層。

3.2. 分割

將不同的功能和服務分割開來,包裝成高內聚低耦合的模組單元。這有助於軟體的開發和維護,便於不同模組的分散式部署,提高網站的併發處理能力和功能擴充套件能力。

3.3. 分散式

大於大型網站,分層和分割的一個主要目的是為了切分後的模組便於分散式部署,即將不同模組部署在不同的伺服器上,通過遠端呼叫協同工作。

分散式意味可以用更多的機器工作,那麼 CPU、記憶體、儲存資源也就更豐富,能夠處理的併發訪問和資料量就越大,進而能夠為更多的使用者提供服務。

分散式也引入了一些問題:

  • 服務呼叫必須通過網路,網路延遲會影響效能
  • 伺服器越多,當機概率也越大,是可用性降低
  • 資料一致性非常困難,分散式事務也難以保證
  • 網站依賴錯綜複雜,開發管理維護困難

常用的分散式方案:

  • 分散式應用和服務
  • 分散式靜態資源
  • 分散式資料和儲存
  • 分散式計算

3.4. 叢集

叢集即多臺伺服器部署相同應用構成一個叢集,通過負載均衡裝置共同對外提供服務。

叢集需要具備伸縮性和故障轉移機制:伸縮性是指可以根據使用者訪問量向叢集新增或減少機器;故障轉移是指,當某臺機器出現故障時,負載均衡裝置或失效轉移機制將請求轉發到叢集中的其他機器上,從而不影響使用者使用。

3.5. 快取

快取就是將資料存放在距離最近的位置以加快處理速度。快取是改善軟體效能的第一手段。

網站應用中,快取除了可以加快資料訪問速度以外,還可以減輕後端應用和資料儲存的負載壓力。

常見快取手段:

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

使用快取有兩個前提:

  • 資料訪問熱點不均勻,頻繁訪問的資料應該放在快取中
  • 資料在某個時間段有效,不過很快過期,否則快取資料會因已經失效而產生髒讀

3.6. 非同步

軟體發展的一個重要目標和驅動力是降低軟體耦合性。事物之間直接關係越少,彼此影響就越小,也就更容易獨立發展。

大型網站架構中,系統解耦的手段除了分層、分割、分散式等,還有一個重要手段——非同步。

業務間的訊息傳遞不是同步呼叫,而是將一個業務操作拆分成多階段,每個階段間通過共享資料的方式非同步執行進行協作。

  • 在單一伺服器內部可通過多執行緒共享記憶體佇列的方式實現非同步,處在業務操作前面的執行緒將操作輸出到佇列,後面的執行緒從佇列中讀取資料進行處理;
  • 在分散式系統中,多個伺服器叢集通過分散式訊息佇列實現非同步。

非同步架構是典型的生產者消費模式,二者不存在直接呼叫。非同步訊息佇列還有如下特性:

  • 提高系統可用性
  • 加快響應速度
  • 消除併發訪問高峰

3.7. 冗餘

大型網站,出現伺服器當機是必然事件。要保證部分伺服器當機的情況下網站依然可以繼續服務,不丟失資料,就需要一定程度的伺服器冗餘執行,資料冗餘備份。這樣當某臺伺服器當機是,可以將其上的服務和資料訪問轉移到其他機器上。

訪問和負載很小的服務也必須部署 至少兩臺伺服器構成一個叢集,目的就是通過冗餘實現服務高可用。資料除了定期備份,存檔儲存,實現 冷備份 外;為了保證線上業務高可用,還需要對資料庫進行主從分離,實時同步實現 熱備份

為了抵禦地震、海嘯等不可抗因素導致的網站完全癱瘓,某些大型網站會對整個資料中心進行備份,全球範圍內部署 災備資料中心。網站程式和資料實時同步到多個災備資料中心。

3.8. 自動化

大型網站架構的自動化架構設計主要集中在釋出運維方面:

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

3.9. 安全

  • 密碼手機校驗碼 進行身份認證
  • 登入、交易等重要操作需要對網路通訊進行 加密,儲存的敏感資料如使用者資訊等也進行加密處理
  • 防止機器人程式攻擊網站,使用 驗證碼 進行識別
  • 對常見用於 攻擊 網站的 XSS 攻擊、SQL 注入、進行編碼轉換等相應處理
  • 對垃圾資訊、敏感資訊進行 過濾
  • 對交易轉賬等重要操作根據交易模式和交易資訊進行 風險控制

4. 大型網站核心架構要素

架構 的一種通俗說法是:最高層次的規劃,難以改變的決定。

除了系統功能需求外,架構還需要關注以下架構要素:

4.1. 效能

效能問題無處不在,所以網站效能優化手段也十分繁多:

  • 前端
    • 瀏覽器快取
    • 靜態資源壓縮
    • 合理佈局頁面
    • 減少 cookie 傳輸
    • CDN
  • 應用伺服器
    • 本地快取
    • 分散式快取
    • 非同步訊息佇列
    • 叢集
    • 程式碼層面:使用多執行緒、改善記憶體管理
  • 資料庫
    • 索引
    • 資料庫快取
    • SQL 優化

4.2. 可用性

可用性指部分伺服器出現故障時,還能否對使用者提供服務

  • 冗餘
    • 通過負載均衡裝置建立叢集共同對外提供服務
    • 資料儲存在多臺伺服器,互相備份
  • 自動化:通過預釋出驗證、自動化測試、自動化釋出、灰度釋出等手段,減少將故障引入線上環境的可能

4.3. 伸縮性

衡量伸縮的標準就是是否可以用多臺伺服器構建叢集,是否容易向叢集中增刪伺服器節點。增刪伺服器節點後是否可以提供和之前無差別的服務。叢集中可容納的總伺服器數是否有限制。

  • 應用伺服器叢集 - 只要伺服器上儲存資料,則所有伺服器都是對等的,通過負載均衡裝置向叢集中不斷加入伺服器即可
  • 快取伺服器叢集 - 加入新的伺服器可能會導致快取路由失效,進而導致叢集中的大部分快取資料都無法訪問。雖然快取資料可以通過資料庫重新載入,但是如果應用嚴重依賴快取,可能會導致網站崩潰。需要改進快取路由演算法保證快取資料的可訪問性。
  • 關係型資料庫叢集 - 關係型資料庫雖然支援資料複製,主從熱備等機制,但是很難做到大規模叢集的可伸縮性,因此關係型資料庫的叢集伸縮性方案必須在資料庫之外實現,通過路由分割槽等手段將部署有多個資料庫的伺服器組成一個叢集。
  • NOSql 資料庫叢集 - 由於先天就是為了應對海量資料而產生,因此對伸縮性的支援通常都非常好。

4.4. 擴充套件性

衡量擴充套件性的標準就是增加新的業務產品時,是否可以實現對現有產品透明無影響,不需要任何改動或很少改動,既有功能就可以上線新產品。主要手段有:事件驅動架構和分散式服務。

4.5. 安全性

安全性保護網站不受惡意攻擊,保護網站重要資料不被竊取。

【部落格福利】Java高階資料免費免費領取,需要的自己領取,一共30G。
傳送門: mp.weixin.qq.com/s/JzddfH-7y…

大型網際網路架構概述,看完文章又漲知識了

相關文章