1. 程式人生 > >處理高併發、大資料儲存的網站技術架構

處理高併發、大資料儲存的網站技術架構

本文轉載自: https://zhuanlan.zhihu.com/p/24669514     

大型網站技術架構剖析

  • 高併發,大流量 40億。PV。page view。3.5億,IP。
  • 高可用,高可用MySQL。7*24小時不間斷執行。
  • 海量資料
  • 使用者分佈廣泛,網路情況複雜
  • 安全環境惡劣
  • 需求快速變更,釋出頻繁
  • 漸進式發展

網站架構演化發展歷程

初始階段的網站(特點:沒人)

應用程式、資料庫、檔案都在一個伺服器上

應用服務和資料服務分離

隨著網站業務的發展,一臺伺服器逐漸不能滿足需求:效能越來越差,儲存空間不足。這是就需要應用和資料分離。

應用伺服器

  • 處理大量的業務
  • 需要更快更強的CPU

資料庫伺服器

  • 需要快速磁碟檢索和資料快取
  • 需要更快的硬碟和更大的記憶體

檔案伺服器

  • 要存大量的使用者上傳檔案
  • 需要更大的硬碟

使用快取改善網站效能

網站訪問的特點和二八定律一樣:80%的業務訪問集中在20%的資料上。所以如果把這一小部分資料快取在記憶體中,可以減少資料庫的訪問壓力,提高整個網站的資料訪問速度,改善資料庫的寫入效能。

網站使用的快取可以分為兩種:快取在應用伺服器上的本地快取和快取在專門的分佈快取伺服器上的遠端快取。

本地快取的訪問快一些,但受應用伺服器記憶體限制,快取資料量有限,遠端分散式快取可以使用叢集的方式,部署大記憶體的伺服器作為專門的快取伺服器,理論上做到不受記憶體容量的限制的快取服務。


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

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

使用叢集是網站解決高併發,海量資料問題的常用手段。通過負載均衡排程伺服器,可將來自使用者瀏覽器的訪問請求分發到應用伺服器叢集中的任何一臺伺服器上。如果有更多使用者,就是叢集中加入更多的應用伺服器,使應用伺服器的負載壓力不再成為整個網站的瓶頸


資料庫讀寫分離

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

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


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

隨著網站業務不斷髮展,使用者規模越來越大,由於中國複雜的網路環境,不同地區的使用者訪問網站時,速度差別也極大,為了提供更好的使用者體驗,留住使用者,網站需要加速網站訪問速度,主要手段有使用CDN的反向代理。

CDN的反向代理的基本原理都是快取,區別在於CDN佈署在網路提供商的機房;而反向代理則部署在網站的中心機房,當用戶請求到達中心機房後,首先訪問的伺服器是反向代理伺服器,如果反向代理中快取著使用者請求的資源,就將其直接返回組使用者。

使用CDN的反向代理的目的都是儘早的返回資料給使用者,一方面加快使用者的訪問速度,另一方面也減輕後端伺服器的負載壓力。


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

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

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


使用NoSQL和搜尋引擎

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

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


業務拆分

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

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


分散式服務

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

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



網站架構設計誤區

1.一味追隨大公司的解決方案

2.為了技術而技術

3.企圖用技術解決所有問題

大型網站架構模式


為了解決大型網站面臨的高併發訪問、海量資料處理、高可靠執行等一系列問題與挑戰,大型網際網路公司在實踐中提出了許多解決方案,以實現網站高效能、高可用、易伸縮、可擴充套件、安全等各種技術架構目標。這些解決方案又被更多網站重複使用,從而逐漸形成大型網站架構模式。

網站架構模式

1.分層

分層是企業應用系統中最常見的一種架構模式,將系統在橫向維度上切分成幾個部分,每個部分負責一部分相對比較單一的職責,然後通過上層對下層的依賴和呼叫組成一個完整的系統。

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


2.分割

網站越大,功能越複雜,服務和資料處理的種類也越多,將這些不同的功能和服務分割開來,包裝成高內聚低耦合的模組單元,一方面有助於軟體的開發和維護;另一方面,便於不同模組的分散式部署,提高網站的併發處理能力和功能擴充套件能力。

大型網站分割的粒度可能會很小。比如在應用層,將不同業務進行分割,例如將購物、論壇、搜尋、廣告分割成不同的應用,由獨立的團隊負責,部署在不同的伺服器上;在同一個應用內部,如果規模龐大業務複雜,會繼續進行分割,比如購物業務,可以進一步分割成機票酒店業務、3C 業務,小商品業務等更細小的粒度。而即使在這個粒度上,還是可以繼續分割成首頁、搜尋列表、商品詳情等模組,這些模組不管在邏輯上還是物理部署上,都可以是獨立的。同樣在服務層也可以根據需要將服務分割成合適的模組。

3.分散式

對於大型網站,分層和分割的一個主要目的是為了切分後的模組便於分散式部署,即將不同模組部署在不同的伺服器上,通過遠端呼叫協同工作。分散式意味著可以使用更多的計算機完成同樣的功能,計算機越多,CPU、記憶體、儲存資源也就越多,能夠處理的併發訪問和資料量就越大,進而能夠為更多的使用者提供服務。

常用的分散式方案

1.分散式應用和服務

2.分散式靜態資源

3.分散式資料和儲存

4.分散式計算

5.分散式配置

6.分散式檔案系統

4.叢集

使用分散式雖然已經將分層和分割後的模組獨立部署,但是對於使用者訪問集中的模組(比如網站的首頁),還需要將獨立部署的伺服器叢集化,即多臺伺服器部署相同應用構成一個叢集,通過負載均衡裝置共同對外提供服務。

因為伺服器叢集有更多伺服器提供相同服務,因此可以提供更好的併發特性,當有更多使用者訪問的時候,只需要向叢集中加入新的機器即可。同時因為一個應用由多臺伺服器提供,當某臺伺服器發生故障時,負載均衡裝置或者系統的失效轉移機制會將請求轉發到叢集中其他伺服器上,使伺服器故障不影響使用者使用。所以在網站應用中,即使是訪問量很小的分散式應用和服務,也至少要部署兩臺伺服器構成一個小的叢集,目的就是提高系統的可用性。

5.快取

快取就是將資料存放在距離計算最近的位置以加快處理速度。快取是改善軟體效能的第一手段,現代CPU 越來越快的一個重要因素就是使用了更多的快取,在複雜的軟體設計中,快取幾乎無處不在。大型網站架構設計在很多方面都使用了快取設計。

快取技術:

內容分發網路(CDN) 反向代理

本地快取 分散式快取

使用前題:

1.資料訪問熱點不均衡

2.是資料在某個時間段內有效,不會很快過期

6.非同步

大型網站架構中,系統解耦合的手段除了前面提到的分層、分割、分佈等,還有一個重要手段是非同步,業務之間的訊息傳遞不是同步呼叫,而是將一個業務操作分成多個階段,每個階段之間通過共享資料的方式非同步執行進行協作。

單伺服器:

通過多執行緒共享記憶體佇列的方式實現非同步,處在業務操作前面的執行緒將輸出寫入到佇列,後面的執行緒從佇列中讀取資料進行處理

分散式系統:

多個伺服器叢集通過分散式訊息佇列實現非同步,分散式訊息佇列可以看作記憶體佇列的分散式部署。

特性:

只要保持資料結構不變,彼此功能實現可以隨意變化而不互相影響.

提高系統可用性

加快網站響應速度

消除併發訪問高峰

7.冗餘

網站需要 7X24 小時連續執行,但是伺服器隨時可能出現故障,特別是伺服器規模比較大時,出現某臺伺服器宕機是必然事件。要想保證在伺服器宕機的情況下網站依然可以繼續服務,不丟失資料,就需要一定程度的伺服器冗餘執行,資料冗餘備份,這樣當某臺伺服器宕機時,可以將其上的服務和資料訪問轉移到其他機器上。

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

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

8.自動化

在無人值守的情況下網站可以正常執行,一切都可以自動化是網站的理想狀態。目前大型網站的自動化架構設計主要集中在釋出運維方面。

網站在執行過程中可能會遇到各種問題:伺服器宕機、程式Bug、儲存空間不足、突然爆發的訪問高峰。網站需要對線上生產環境進行自動化監控,對伺服器進行心跳檢測,並監控其各項效能指標和應用程式的關鍵資料指標。如果發現異常、超出預設的閾值,就進行自動化報警,向相關人員傳送報警資訊,警告故障可能會發生。在檢測到故障發生後,系統會進行自動化失效轉移,將失效的伺服器從叢集中隔離出去,不再處理系統中的應用請求。待故障消除後,系統進行自動化失效恢復,重新啟動服務,同步資料保證資料的一致性。在網站遇到訪問高峰,超出網站最大處理能力時,為了保證整個網站的安全可用,還會進行自動化降級,通過拒絕部分請求及關閉部分不重要的服務將系統負載降至一個安全的水平,必要時,還需要自動化分配資源,將空閒資源分配給重要的服務,擴大其部署規模。

9.安全

網際網路的開放特性使得從誕生起就面對巨大的安全挑戰,網站在安全架構方面也積累了許多模式:通過密碼和手機校驗碼進行身份認證;登入、交易等操作需要對網路通訊進行加密,網站伺服器上儲存的敏感資料如使用者資訊等也進行加密處理;為了防止機器人程式濫用網路資源攻擊網站,網站使用驗證碼進行識別;對於常見的用於攻擊網站的XSS攻擊、SQL注入、進行編碼轉換等相應處理;對於垃圾資訊、敏感進行過濾;對交易轉賬等重要操作根據交易模式和交易資訊進行風險控制