文章來自:PHP自學中心
大型電商系統或社交網站的系統架構從一開始就沒有設計具有完整的高效能,高可用性,高可伸縮性等特性的。它是隨著使用者的增加和業務功能的擴充套件,逐步演變和完善起來的。
在此過程中,開發模式,技術體系結構和設計思想都發生了很大的變化。因此,隨著業務的擴充套件,成熟的系統體系結構將逐漸得到改善。
例如淘寶,解決海量商品資訊的搜尋,訂購和支付問題;例如騰訊,解決了億萬使用者的實時訊息傳輸。百度處理大量搜尋請求。
他們都有各自的業務特性,系統架構也有所不同。不過我們也可以從這些不同的網站背景中,找出其中廣泛運用在這些系統裡共用的技術手段
下面我們可以通過介紹大型網站系統的演化過程,來認識這些技術。
1 最開始的網站架構
一個網站的最初開始,每個開發者都接觸過。每個應用程式,資料庫,靜態檔案等都會部署在一個伺服器裡。流量基本很小的網站,比如個人網站,部落格等就可以這樣部署。如圖:
2 應用、資料、檔案分離
業務的擴充套件與需要,訪問流量多了一點,一臺伺服器已經不能滿足效能需求,這個時候我們就要把應用程式,資料庫,檔案等各自部署到獨立的伺服器上各自管理。並且根據用途配置不同的硬體。
這樣就達到了滿足效能需求的最佳效果了。基本小型企業,業務每天流量不到1w的都可以算是最佳的。如圖:
3 快取改善網站效能
每個開發者在遇到效能瓶頸或者硬體效能有效的時候基本都會想到用快取改善網站效能,經常用到的Nosql如:Memcached
,Redis
。
使用快取主要源於熱點資料的存在,為了減少熱點資料的訪問路徑與提高使用者體驗,我們可以對熱點資料進行快取,提高網站效能。
快取實現的方式有:本地快取,分散式快取,還有 CDN、反向代理。
1 本地快取:速度快,根據本地空間快取資料量。
2 分散式快取:Memcached、Redis
4 使用叢集改善應用伺服器效能
叢集就是同一個業務,部署在多個伺服器上(不同的伺服器執行同樣的程式碼,幹同一件事),那我們就可以用負載均衡來解決相應的問題,提高效能。
方式:常用的負載均衡技術硬體的有 F5,價格比較貴,軟體的有 LVS、Nginx、HAProxy。
LVS 是四層負載均衡,根據目標地址和埠選擇內部伺服器,Nginx 和 HAProxy 是七層負載均衡,可以根據報文內容選擇內部伺服器。
因此 LVS 分發路徑優於 Nginx 和 HAProxy,效能要高。而 Nginx 和 HAProxy 則更具配置性,如可以用來做動靜分離,比如根據請求報文特徵,來選擇靜態資源伺服器還是應用伺服器。
應用伺服器是網站的入口,會承載大量的請求,我們就在應用伺服器前面部署負載均衡伺服器排程使用者請求,根據分發策略將請求分發到多個應用伺服器節點。如圖:
5 資料庫讀寫分離和分庫分表
這個相信大家都聽過,但是會不會就不知道了。詳細可以檢視這篇文章:【進階】Mysql分庫分表方案,如何分,怎樣分?
分庫分表分為水平切分和垂直切分兩種。
1 水平切分是對一個資料庫特大的表進行拆分,例如使用者表。
2 垂直切分則是根據業務的不同來切分,比如使用者業務、商品業務相關的表放在不同的資料庫中。
一個網站的流量的增加,也就是使用者訪問量的增加,訪問量的增加則資料庫就會成為最大的瓶頸。
然而改善資料庫的效能,我們常用的手段是對資料庫進行讀寫分離和分庫分表。實現資料同步從而改善資料庫效能。如圖
6 使用分散式檔案系統
什麼是分散式檔案系統:分散式檔案系統的全部不在同一臺計算機,而是分散佈置在多臺計算機上。所以多個分散的小檔案系統組合在一起,形成一個完整的檔案系統。
分散式的特點:分散式網路儲存系統採用可擴充套件的系統結構,利用多臺儲存伺服器分擔儲存負荷,利用位置伺服器定位儲存資訊,它不但提高了系統的可靠性、可用性和存取效率,還易於擴充套件。
這裡使用到分散式檔案系統,想想就知道了,使用者每天都在增加,業務量越來越大,而產生的檔案越來越多,單臺的檔案伺服器已經不能滿足需求,這時就需要分散式檔案系統的支撐。常用的分散式檔案系統有 GFS、HDFS、TFS。具體就不介紹了。看圖:
7 使用 CDN 和反向代理提高網站效能
這一點也是很重要的。假如我們的伺服器都部署在廣州的機房,對於廣東的使用者來說訪問是非常快的,而對於北京的使用者訪問就是較慢的了。
北京使用者訪問需要通過互聯路由器經過較長的路徑才能訪問到廣州的伺服器,返回路徑也一樣,所以資料傳輸時間比較長。這個時候我們想到的就是:使用CDN解決。
CDN的特點就是將資料內容快取到運營商的機房,使用者訪問時先從最近的運營商獲取資料,大減少了網路訪問的路徑。從而提高訪問速度。
反向代理是部署在網站的機房,當使用者請求達到時首先訪問反向代理伺服器,反向代理伺服器將快取的資料返回給使用者。
如果沒有快取資料才會繼續訪問應用伺服器獲取,這樣做減少了獲取資料的成本。反向代理的話我們經常用到Nginx。
配置與部署具體可以檢視文章:PHP使用Nginx實現反向代理,學一學吧
8 將應用伺服器進行業務拆分
隨著業務進一步擴充套件,應用程式變得非常臃腫,我們就要將應用程式進行業務拆分。看到這裡,小編建議你去看看:叢集,分散式與微服務有什麼區別。
為了應對日益複雜的業務場景,將整個系統業務分成不同的應用模組,應用之間通過超連結建立關係,業務之間通過訊息進行通訊或者共享資料庫來實現。
縱向拆分:
將一個大應用拆分為多個小應用,如果新業務較為獨立,那麼就直接將其設計部署為一個獨立的Web應用系統;
縱向拆分相對較為簡單,通過梳理業務,將較少相關的業務剝離即可。
橫向拆分:
將複用的業務拆分出來,獨立部署為分散式服務,新增業務只需要呼叫這些分散式服務;
橫向拆分需要識別可複用的業務,設計服務介面,規範服務依賴關係。
9 業務拆分後演變為分散式服務
根據上面對應用程式進行橫向拆分後,各個業務應用就獨立部署起來了。各個應用都有獨自的業務服務,而這些業務服務抽取出來利用分步式服務框架搭建分散式服務。
舉例:分散式服務有:使用者服務,商品服務,購物車,訂單服務,支付與安全服務等。
總結一下
隨著網站的架構的設計,業務功能的擴充套件,最後演變成一個高效能,高可用,高伸縮,可擴充套件,可維護的分散式系統。
逐漸運用到的技能基本都涉及到了:檔案分離,分散式快取,負載均衡,叢集,資料庫讀寫分離,分庫分表,分散式檔案系統,反向代理,業務拆分,微服務等。
我想說的是一個高階程式設計師就必須具備這些技能吧。
本作品採用《CC 協議》,轉載必須註明作者和本文連結