大型分佈式電商系統架構

本文是學習大型分佈式網站架構的技術總結。對架構一個高性能、高可用、可伸縮及可擴展的分佈式網站進行了概要性描述,並給出一個架構參考。文中一部分爲讀書筆記,一部分是個人經驗總結,對大型分佈式網站架構有較好的參考價值。

一、大型分佈式網站架構技術

1、大型網站的特點

2、大型網站架構目標

 

3、大型網站架構模式

4、高性能架構

以用戶爲中心,提供快速的網頁訪問體驗。主要參數有較短的響應時間、較大的併發處理能力、較高的吞吐量與穩定的性能參數。

可分爲前端優化、應用層優化、代碼層優化與存儲層優化。

5、高可用架構

大型網站應該在任何時候都可以正常訪問,正常提供對外服務。因爲大型網站的複雜性,分佈式,廉價服務器,開源數據庫,操作系統等特點,要保證高可用是很困難的,也就是說網站的故障是不可避免的。

如何提高可用性,就是需要迫切解決的問題。首先,需要從架構級別考慮,在規劃的時候,就考慮可用性。行業內一般用幾個 9 表示可用性指標,比如四個 9(99.99),一年內允許的不可用時間是 53 分鐘。

不同層級使用的策略不同,一般採用冗餘備份和失效轉移解決高可用問題。

6、可伸縮架構

伸縮性是指在不改變原有架構設計的基礎上,通過添加 / 減少硬件(服務器)的方式,提高 / 降低系統的處理能力。

7、可擴展架構

可以方便地進行功能模塊的新增 / 移除,提供代碼 / 模塊級別良好的可擴展性。

8、安全架構

對已知問題有有效的解決方案,對未知 / 潛在問題建立發現和防禦機制。對於安全問題,首先要提高安全意識,建立一個安全的有效機制,從政策層面,組織層面進行保障,比如服務器密碼不能泄露,密碼每月更新,並且三次內不能重複;每週安全掃描等。以制度化的方式,加強安全體系的建設。同時,需要注意與安全有關的各個環節。安全問題不容忽視,包括基礎設施安全,應用系統安全,數據保密安全等。

常用的加解密算法(單項散列加密 [MD5、SHA],對稱加密[DES、3DES、RC]),非對稱加密[RSA] 等。

9、敏捷性

網站的架構設計,運維管理要適應變化,提供高伸縮性,高擴展性。方便的應對快速的業務發展,突增高流量訪問等要求。

除上面介紹的架構要素外,還需要引入敏捷管理,敏捷開發的思想。使業務,產品,技術,運維統一起來,隨需應變,快速響應。

10、大型架構舉例

 

以上採用七層邏輯架構,第一層客戶層,第二層前端優化層,第三層應用層,第四層服務層,第五層數據存儲層,第六層大數據存儲層,第七層大數據處理層。

二、大型電商網站系統架構演變過程

一個成熟的大型網站(如淘寶、天貓、騰訊等)的系統架構並不是一開始設計時就具備完整的高性能、高可用、高伸縮等特性的,它是隨着用戶量的增加,業務功能的擴展逐漸演變完善的,在這個過程中,開發模式、技術架構、設計思想也發生了很大的變化,就連技術人員也從幾個人發展到一個部門甚至一條產品線。

所以成熟的系統架構是隨着業務的擴展而逐步完善的,並不是一蹴而就;不同業務特徵的系統,會有各自的側重點,例如淘寶,要解決海量的商品信息的搜索、下單、支付;例如騰訊,要解決數億用戶的實時消息傳輸;百度它要處理海量的搜索請求。

他們都有各自的業務特性,系統架構也有所不同。儘管如此我們也可以從這些不同的網站背景中,找出其中共用的技術,這些技術和手段廣泛運用在大型網站系統的架構中,下面就通過介紹大型網站系統的演化過程,來認識這些技術和手段。

1、最開始的網站架構

最初的架構,應用程序、數據庫、文件都部署在一臺服務器上,如圖:

2、應用、數據、文件分離

隨着業務的擴展,一臺服務器已經不能滿足性能需求,故將應用程序、數據庫、文件各自部署在獨立的服務器上,並且根據服務器的用途配置不同的硬件,達到最佳的性能效果。

3、利用緩存改善網站性能

在硬件優化性能的同時,同時也通過軟件進行性能優化,在大部分的網站系統中,都會利用緩存技術改善系統的性能,使用緩存主要源於熱點數據的存在,大部分網站訪問都遵循 28 原則(即 80% 的訪問請求,最終落在 20% 的數據上),所以我們可以對熱點數據進行緩存,減少這些數據的訪問路徑,提高用戶體驗。

緩存實現常見的方式是本地緩存、分佈式緩存。當然還有 CDN、反向代理等,這個後面再講。本地緩存,顧名思義是將數據緩存在應用服務器本地,可以存在內存中,也可以存在文件,OSCache 就是常用的本地緩存組件。本地緩存的特點是速度快,但因爲本地空間有限所以緩存數據量也有限。分佈式緩存的特點是,可以緩存海量的數據,並且擴展非常容易,在門戶類網站中常常被使用,速度按理沒有本地緩存快,常用的分佈式緩存是 Memcached、Redis。

4、使用集羣改善應用服務器性能

應用服務器作爲網站的入口,會承擔大量的請求,我們往往通過應用服務器集羣來分擔請求數。應用服務器前面部署負載均衡服務器調度用戶請求,根據分發策略將請求分發到多個應用服務器節點。

常用的負載均衡技術硬件的有 F5,價格比較貴,軟件的有 LVS、Nginx、HAProxy。LVS 是四層負載均衡,根據目標地址和端口選擇內部服務器,Nginx 和 HAProxy 是七層負載均衡,可以根據報文內容選擇內部服務器,因此 LVS 分發路徑優於 Nginx 和 HAProxy,性能要高些,而 Nginx 和 HAProxy 則更具配置性,如可以用來做動靜分離(根據請求報文特徵,選擇靜態資源服務器還是應用服務器)。

5、數據庫讀寫分離和分庫分表

隨着用戶量的增加,數據庫成爲最大的瓶頸,改善數據庫性能常用的手段是進行讀寫分離以及分庫分表,讀寫分離顧名思義就是將數據庫分爲讀庫和寫庫,通過主備功能實現數據同步。分庫分表則分爲水平切分和垂直切分,水平切分則是對一個數據庫特大的表進行拆分,例如用戶表。垂直切分則是根據業務的不同來切分,如用戶業務、商品業務相關的表放在不同的數據庫中。

6、使用 CDN 和反向代理提高網站性能

假如我們的服務器都部署在成都的機房,對於四川的用戶來說訪問是較快的,而對於北京的用戶訪問是較慢的,這是由於四川和北京分別屬於電信和聯通的不同發達地區,北京用戶訪問需要通過互聯路由器經過較長的路徑才能訪問到成都的服務器,返回路徑也一樣,所以數據傳輸時間比較長。對於這種情況,常常使用 CDN 解決,CDN 將數據內容緩存到運營商的機房,用戶訪問時先從最近的運營商獲取數據,這樣大大減少了網絡訪問的路徑。比較專業的 CDN 運營商有藍汛、網宿。

而反向代理,則是部署在網站的機房,當用戶請求達到時首先訪問反向代理服務器,反向代理服務器將緩存的數據返回給用戶,如果沒有緩存數據纔會繼續訪問應用服務器獲取,這樣做減少了獲取數據的成本。反向代理有 Squid、Nginx。

7、使用分佈式文件系統

用戶一天天增加,業務量越來越大,產生的文件越來越多,單臺的文件服務器已經不能滿足需求,這時就需要分佈式文件系統的支撐。常用的分佈式文件系統有 GFS、HDFS、TFS。

8、使用 NoSQL 和搜索引擎

對於海量數據的查詢和分析,我們使用 NoSQL 數據庫加上搜索引擎可以達到更好的性能。並不是所有的數據都要放在關係型數據中。常用的 NoSQL 有 MongoDB、HBase、Redis,搜索引擎有 Lucene、Solr、Elasticsearch。

9、將應用服務器進行業務拆分

隨着業務進一步擴展,應用程序變得非常臃腫,這時我們需要將應用程序進行業務拆分,如百度分爲新聞、網頁、圖片等業務。每個業務應用負責相對獨立的業務運作。業務之間通過消息進行通信或者共享數據庫來實現。

10、搭建分佈式服務

這時我們發現各個業務應用都會使用到一些基本的業務服務,例如用戶服務、訂單服務、支付服務、安全服務,這些服務是支撐各業務應用的基本要素。我們將這些服務抽取出來利用分部式服務框架搭建分佈式服務。阿里的 Dubbo 是一個不錯的選擇。

三、一張圖說明電商架構

四、大型電商網站架構案例

1、電商案例的原因

分佈式大型網站,目前看主要有幾類:

大型門戶一般是新聞類信息,可以使用 CDN,靜態化等方式優化,開心網等交互性比較多,可能會引入更多的 NoSQL,分佈式緩存,使用高性能的通信框架等。電商網站具備以上兩類的特點,比如產品詳情可以採用 CDN,靜態化,交互性高的需要採用 NoSQL 等技術。因此,我們採用電商網站作爲案例,進行分析。
 

2、電商網站需求

客戶需求:

客戶就是客戶,不會告訴你具體要什麼,只會告訴你他想要什麼,我們很多時候要引導,挖掘客戶的需求。好在提供了明確的參考網站。因此,下一步要進行大量的分析,結合行業,以及參考網站,給客戶提供方案。

需求功能矩陣

需求管理傳統的做法,會使用用例圖或模塊圖(需求列表)進行需求的描述。這樣做常常忽視掉一個很重要的需求(非功能需求),因此推薦大家使用需求功能矩陣,進行需求描述。

本電商網站的需求矩陣如下:

3、網站初級架構

一般網站,剛開始的做法,是三臺服務器,一臺部署應用,一臺部署數據庫,一臺部署 NFS 文件系統。

這是前幾年比較傳統的做法,之前見到一個網站 10 萬多會員,垂直服裝設計門戶,N 多圖片。使用了一臺服務器部署了應用,數據庫以及圖片存儲。出現了很多性能問題。

如下圖:

 

但是,目前主流的網站架構已經發生了翻天覆地的變化。一般都會採用集羣的方式,進行高可用設計。至少是下面這個樣子:

 

4、系統容量預估

預估步驟:

根據客戶需求:3~5 年用戶數達到 1000 萬註冊用戶,可以做每秒併發數預估:

沒好好學數學後悔了吧?!(不知道以上算是否有錯誤,呵呵~~)

服務器預估:(以 tomcat 服務器舉例)

按一臺 web 服務器,支持每秒 300 個併發計算。平常需要 10 臺服務器(約等於);[tomcat 默認配置是 150],高峯期需要 30 臺服務器;

容量預估:70/90 原則

系統 CPU 一般維持在 70% 左右的水平,高峯期達到 90% 的水平,是不浪費資源,並比較穩定的。內存,IO 類似。

以上預估僅供參考,因爲服務器配置,業務邏輯複雜度等都有影響。在此 CPU,硬盤,網絡等不再進行評估。

5、網站架構分析

根據以上預估,有幾個問題:

大型網站一般需要做以下架構優化(優化是架構設計時,就要考慮的,一般從架構 / 代碼級別解決,調優主要是簡單參數的調整,比如 JVM 調優;如果調優涉及大量代碼改造,就不是調優了,屬於重構):

6、網站架構優化

6.1 業務拆分

根據業務屬性進行垂直切分,劃分爲產品子系統,購物子系統,支付子系統,評論子系統,客服子系統,接口子系統(對接如進銷存,短信等外部系統)。

根據業務子系統進行等級定義,可分爲核心系統和非核心繫統。核心系統:產品子系統,購物子系統,支付子系統;非核心:評論子系統,客服子系統,接口子系統。

拆分後的架構圖:

參考部署方案 2

如上圖每個應用單獨部署,核心系統和非核心繫統組合部署

6.2 應用集羣部署(分佈式,集羣,負載均衡)

集羣部署後架構圖:

6.3 多級緩存

緩存按照存放的位置一般可分爲兩類本地緩存和分佈式緩存。本案例採用二級緩存的方式,進行緩存的設計。一級緩存爲本地緩存,二級緩存爲分佈式緩存。(還有頁面緩存,片段緩存等,那是更細粒度的劃分)

一級緩存,緩存數據字典,和常用熱點數據等基本不可變 / 有規則變化的信息,二級緩存緩存需要的所有緩存。當一級緩存過期或不可用時,訪問二級緩存的數據。如果二級緩存也沒有,則訪問數據庫。

緩存的比例,一般 1:4,即可考慮使用緩存。(理論上是 1:2 即可)。

根據業務特性可使用以下緩存過期策略:

6.4 單點登錄(分佈式 Session)

系統分割爲多個子系統,獨立部署後,不可避免的會遇到會話管理的問題。一般可採用 Session 同步,Cookies,分佈式 Session 方式。電商網站一般採用分佈式 Session 實現。

再進一步可以根據分佈式 Session,建立完善的單點登錄或賬戶管理系統。

流程說明

結合 Cache 中間件,實現的分佈式 Session,可以很好的模擬 Session 會話。

6.5 數據庫集羣(讀寫分離,分庫分表)

大型網站需要存儲海量的數據,爲達到海量數據存儲,高可用,高性能一般採用冗餘的方式進行系統設計。一般有兩種方式讀寫分離和分庫分表。

讀寫分離:一般解決讀比例遠大於寫比例的場景,可採用一主一備,一主多備或多主多備方式。

本案例在業務拆分的基礎上,結合分庫分表和讀寫分離。如下圖:

相關中間件可參考 Cobar(阿里,目前已不在維護),TDDL(阿里),Atlas(奇虎 360),MyCat。

分庫分表後序列的問題,JOIN,事務的問題,會在分庫分表主題分享中,介紹。

6.6 服務化

將多個子系統公用的功能 / 模塊,進行抽取,作爲公用服務使用。比如本案例的會員子系統就可以抽取爲公用的服務。

6.7 消息隊列

消息隊列可以解決子系統 / 模塊之間的耦合,實現異步,高可用,高性能的系統。是分佈式系統的標準配置。本案例中,消息隊列主要應用在購物,配送環節。

目前使用較多的 MQ 有 Active MQ、Rabbit MQ、Zero MQ、MS MQ 等,需要根據具體的業務場景進行選擇。建議可以研究下 Rabbit MQ。

6.8 其他架構(技術)

除了以上介紹的業務拆分,應用集羣,多級緩存,單點登錄,數據庫集羣,服務化,消息隊列外。還有 CDN,反向代理,分佈式文件系統,大數據處理等系統。

此處不詳細介紹,大家可以問度娘 / Google,有機會的話也可以分享給大家。

7、架構彙總

大型網站的架構是根據業務需求不斷完善的,根據不同的業務特徵會做特定的設計和考慮,本文只是講述一個常規大型網站會涉及的一些技術和手段,希望能給大家帶來啓發。

**作者介紹
**

爛豬皮,十餘年工作經驗,曾在 Google 等外企工作過幾年,精通 Java、分佈式架構、微服務架構以及數據庫,最近正在研究大數據以及區塊鏈,希望能突破到更高的境界

作者:爛豬皮

來源:https://my.oschina.net/editorial-story/blog/1808757

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/lc5wRt5wgiB_CcKzf-PRhg