大型分佈式網站架構實戰項目分析

1、分佈式系統是什麼?

一、定義web

distributed system is one in which components located at networked computers communicate and coordinate their actions only by passing messages(分佈式系統是指位於網絡計算機的組件僅經過傳遞消息來通訊和協調其行爲的系統。)數據庫

因此,從這能夠總結出這幾個重點:瀏覽器

一、組件是分佈在網絡計算機上
二、組件之間僅僅經過消息傳遞來通訊而且協調工做緩存

clipboard.png

二、特性tomcat

2.一、副本
(Replica)是分佈式系統最多見的概念之一,指分佈式系統對數據和服務提供的一種冗餘方式。在常見的分佈式系統中,爲了對外提供高可用的服務,咱們每每會對數據和服務進行副本處理。

1)數據副本指在不一樣節點上持久同一份數據,當某一個節點上存儲的數據丟失時,能夠從副本上讀取到該數據,這是解決分佈式系統數據丟失問題的有效手段。性能優化

2)服務副本指多個節點提供一樣的服務,每一個節點都有能力接受來自外部的請求並進行相應的處理。服務器

2.二、併發性

在程序運行過程當中的併發性操做是很是常見的行爲,例如同一個分佈式系統中的多個節點,可能會併發地操做一些共享的資源,如何準確並高效的協調分佈式併發操做也成爲了分佈式系統架構與設計中最大的挑戰之一。網絡

2.三、全局時鐘

分佈式系統是有一系列在空間上隨意分佈的多個進程組成的,在這些進程之間經過交換消息來進行相互通訊。所以,在分佈式系統中,很難定義兩個事件究竟誰先誰後,緣由就是分佈式系統缺少一個全局的時鐘序列控制。架構

2.四、故障總會發生

任何在設計階段考慮到的異常狀況,必定會在系統實際運行中發生,而且,在系統實際運行過程當中還會遇到不少在設計時未能考慮到的異常故障。因此,除非需求指標容許,在系統設計時不能放過任何異常狀況。併發

三、分佈式環境的各類問題

3.一、通訊異常

網絡自己的不可靠性,各節點之間的網絡通訊可以正常進行,其延時也會遠大於單機操做。單機內存訪問的延時在納秒數量級(一般是10ns左右),而正常的一次網絡通訊的延遲在0.1~1ms左右,巨大的延時差異,會影響消息的收發的過程,所以消息丟失和消息延遲變得很是廣泛。

3.二、網絡分區

當網絡因爲發生異常狀況,致使分佈式系統中部分節點之間的網絡延時不斷增大,最終致使組成分佈式系統的左右節點中,只有部分節點可以進行正常通訊,而另外一些節點則不能,這個現象成爲網絡分區,俗稱「鬧裂」。當網絡分區出現時,分佈式系統就出現局部小集羣,在極端狀況下,這些小集羣會獨立完成本來須要整個分佈式系統才能完成的功能,包括對數據的事務處理,這對分佈式一致性提出了很是大的挑戰。

3.三、三態

在分佈式環境下,網絡可能出現各式各樣的問題,所以分佈式系統的每一次請求與響應,存在特有的三態概念,即成功、失敗與超時。超時現象一般有一下兩種狀況:

1)因爲網絡緣由,該請求(消息)並無被成功發送到接收方,而是在發送過程就發生了消息丟失現象。

2)該請求(消息)成功的被接收方接受後,並進行了處理,可是在將響應反饋給發送方的過程當中,發生了消息丟失現象。

當出現這樣的超時現象時,網絡通訊的發起方是沒法肯定當前請求是否被成功處理的。

3.四、節點故障

分佈式系統下比較常見的問題,指組成分佈式系統的服務器節點出現宕機或僵死現象。

2、怎麼去定義大型網站

知足一個大型網站的基本因素:

  • 訪問量

  • 業務複雜度

  • 數據量

3、大型網站經常使用到的技術框架

初始階段的網站架構

通常來說,大型網站都是從小型網站發展而來,一開始的架構都比較簡單,隨着業務複雜和用戶量的激增,纔開始作不少架構上的改進。當它仍是小型網站的時候,沒有太多訪客,通常來說只須要一臺服務器就夠了,這時應用程序、數據庫、文件等全部資源都在一臺服務器上,網站架構以下圖所示:

clipboard.png

應用服務和數據服務分離

隨着網站業務的發展和用戶量的增長,一臺服務器就沒法再知足需求了。大量用戶訪問致使訪問速度愈來愈慢,而逐漸增長的數據也會致使存儲空間不足。這時就須要將應用和數據分離,應用和數據分離後整個網站使用 3 臺服務器:應用服務器、文件服務器和數據庫服務器。這 3 臺服務器對硬件資源的要求各不相同:

  • 應用服務器業務邏輯,須要強大的CPU

  • 數據庫服務器對磁盤讀寫操做不少,須要更快的磁盤和更大的內存

  • 文件服務器存儲用戶上傳的文件,所以須要更大的磁盤空間

此時,網站系統的架構以下圖所示:

clipboard.png

使用緩存改善網站性能

隨着用戶再增長,網站又會一次面臨挑戰:數據庫壓力太大致使整站訪問效率再此降低,用戶體驗受到影響。一個網站,每每 80% 的業務訪問集中在 20% 的數據上,好比微博請求量最多的確定是那些千萬級粉絲的大 V 的微博,而幾乎沒有人關注的你的首頁,除了本身想起來以外根本不會被打開。既然大部分業務訪問集中在一小部分數據上,那就把這一小部分數據先提早緩存在內存中,而不是每次都去數據庫讀取,這樣就能夠減小數據庫的訪問壓力,從而提升整個網站的訪問速度。

網站使用的緩存通常分爲緩存到應用服務器或者緩存在專門的分佈式緩存服務器。緩存到應用服務器本身的訪問速度快不少,可是受自身內存限制,每每不太適用。遠程分佈式緩存使用一個集羣專門負責緩存服務,當內存不夠還能夠輕鬆得動態擴容。

clipboard.png

使用應用服務器集羣改善網站的併發處理能力

使用緩存後,數據訪問壓力獲得了緩解,可是單一應用服務器可以處理的請求鏈接有限,在網站訪問高峯期,應用服務器就成了整個網站的效率瓶頸。使用分佈式集羣是網站解決高併發、海量數據問題的經常使用手段。當一臺服務器的處理能力和存儲空間不足時,不要嘗試去更換更強大的服務器,對大型網站而言,多麼強大的服務器,都知足不了網站持續增加的業務需求。這種狀況下,更恰當的作法是增長一臺服務器分擔原有服務器的訪問及存儲壓力。 對網站架構而言,只要能經過增長一臺服務器的方式改善負載壓力,就能夠以一樣的方式持續增長服務器不斷改善系統性能,從而實現系統的可伸縮性。應用服務器實現集羣是網站可伸縮架構設計中較爲簡單成熟的一種,以下圖所示:

clipboard.png經過負載均衡調度服務器,能夠未來自用戶瀏覽器的訪問請求分發到應用服務器集羣中的任何一臺服務器上,若是有更多用戶,就在集羣中加入更多的應用服務器,使應用服務器的壓力再也不成爲整個網站的瓶頸。

數據庫讀寫分離

網站在使用緩存後,使對大部分數據讀操做訪問均可以不經過數據庫就能完成,可是仍有一部分讀操做(緩存訪問不命中、緩存過時)和所有的寫操做都須要訪問數據庫,在網站的用戶達到必定規模後,數據庫由於負載壓力太高而成爲網站的瓶頸。 目前大部分的主流數據庫都提供主從熱備功能,經過配置兩臺數據庫主從關係,能夠將一臺數據庫服務器的數據更新同步到另外一臺服務器上。網站利用數據庫的這一功能,實現數據庫讀寫分離,從而改善數據庫負載壓力。以下圖所示:

clipboard.png應用服務器在寫數據的時候,訪問主數據庫,主數據庫經過主從複製機制將數據更新同步到從數據庫,這樣當應用服務器讀數據的時候,就能夠經過從數據庫得到數據。爲了便於應用程序訪問讀寫分離後的數據庫,一般在應用服務器端使用專門的數據訪問模塊,使數據庫讀寫分離對應用透明。

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

隨着網站業務不斷髮展,用戶規模愈來愈大,因爲中國複雜的網絡環境,不一樣地區的用戶訪問網站時,速度差異也極大。有研究代表,網站訪問延遲和用戶流失率正相關,網站訪問越慢,用戶越容易失去耐心而離開。爲了提供更好的用戶體驗,留住用戶,網站須要加速網站訪問速度。主要手段有使用 CDN 和反向代理。以下圖所示:

clipboard.png

使用分佈式文件系統和分佈式數據庫系統

任何強大的單一服務器都知足不了大型網站持續增加的業務需求。數據庫通過讀寫分離後,從一臺服務器拆分紅兩臺服務器,可是隨着網站業務的發展依然不能知足需求,這時須要使用分佈式數據庫。文件系統也同樣,須要使用分佈式文件系統。以下圖所示:

clipboard.png

分佈式數據庫是網站數據庫拆分的最後手段,只有在單表數據規模很是龐大的時候才使用。不到不得已時,網站更經常使用的數據庫拆分手段是業務分庫,將不一樣業務的數據部署在不一樣的物理服務器上。

使用 NoSQL 和搜索引擎

隨着網站業務愈來愈複雜,對數據存儲和檢索的需求也愈來愈複雜,網站須要採用一些非關係數據庫技術如 NoSQL 和非數據庫查詢技術如搜索引擎。以下圖所示:

clipboard.png

NoSQL 和搜索引擎都是源自互聯網的技術手段,對可伸縮的分佈式特性具備更好的支持。應用服務器則經過一個統一數據訪問模塊訪問各類數據,減輕應用程序管理諸多數據源的麻煩。

業務拆分

大型網站爲了應對日益複雜的業務場景,經過使用分而治之的手段將整個網站業務分紅不一樣的產品線。如大型購物交易網站都會將首頁、商鋪、訂單、買家、賣家等拆分紅不一樣的產品線,分歸不一樣的業務團隊負責。

具體到技術上,也會根據產品線劃分,將一個網站拆分紅許多不一樣的應用,每一個應用獨立部署。應用之間能夠經過一個超連接創建關係(在首頁上的導航連接每一個都指向不一樣的應用地址),也能夠經過消息隊列進行數據分發,固然最多的仍是經過訪問同一個數據存儲系統來構成一個關聯的完整系統,以下圖所示:

clipboard.png

分佈式服務

隨着業務拆分愈來愈小,存儲系統愈來愈龐大,應用系統的總體複雜度呈指數級增長,部署維護愈來愈困難。因爲全部應用要和全部數據庫系統鏈接,在數萬臺服務器規模的網站中,這些鏈接的數目是服務器規模的平方,致使數據庫鏈接資源不足,拒絕服務。

既然每個應用系統都須要執行許多相同的業務操做,好比用戶管理、商品管理等,那麼能夠將這些共用的業務提取出來,獨立部署。由這些可複用的業務鏈接數據庫,提供共用業務服務,而應用系統只須要管理用戶界面,經過分佈式服務調用共用業務服務完成具體業務操做。以下圖所示:

clipboard.png

在此我向你們推薦一個架構學習交流羣。交流學習羣號:575745314 裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構等這些成爲架構師必備的知識體系。還能領取免費的學習資源,目前受益良多


4、電商網站架構案例

一、電商案例的緣由

分佈式大型網站,目前看主要有幾類1.大型門戶,好比網易,新浪等;2.SNS網站,好比校內,開心網等;3.電商網站:好比阿里巴巴,京東商城,國美在線,汽車之家等。大型門戶通常是新聞類信息,可使用CDN,靜態化等方式優化,開心網等交互性比較多,可能會引入更多的NOSQL,分佈式緩存,使用高性能的通訊框架等。電商網站具有以上兩類的特色,好比產品詳情能夠採用CDN,靜態化,交互性高的須要採用NOSQL等技術。所以,咱們採用電商網站做爲案例,進行分析。

二、電商網站需求

客戶需求:

  • 創建一個全品類的電子商務網站(B2C),用戶能夠在線購買商品,能夠在線支付,也能夠貨到付款;

  • 用戶購買時能夠在線與客服溝通;

  • 用戶收到商品後,能夠給商品打分,評價;

  • 目前有成熟的進銷存系統;須要與網站對接;

  • 但願可以支持3~5年,業務的發展;

  • 預計3~5年用戶數達到1000萬;

  • 按期舉辦雙11,雙12,三八男人節等活動;

  • 其餘的功能參考京東或國美在線等網站。

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

其餘的略

~

需求功能矩陣

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

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

clipboard.png以上是對電商網站需求的簡單舉例,目的是說明(1)需求分析的時候,要全面,大型分佈式系統重點考慮非功能需求;(2)描述一個簡單的電商需求場景,使你們對下一步的分析設計有個依據。

三、網站初級架構

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

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

以下圖:

clipboard.png

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

clipboard.png

使用集羣對應用服務器進行冗餘,實現高可用;(負載均衡設備可與應用一塊部署)使用數據庫主備模式,實現數據備份和高可用;

四、系統容量預估

預估步驟:

(1) 註冊用戶數-日均UV量-每日的PV量-天天的併發量;

(2) 峯值預估:日常量的2~3倍;

(3) 根據併發量(併發,事務數),存儲容量計算系統容量。

(4 ) 客戶需求:3~5年用戶數達到1000萬註冊用戶;

每秒併發數預估:

(1) 天天的UV爲200萬(二八原則);

(2) 每日天天點擊瀏覽30次;

(3) PV量:200*30=6000萬;

(4) 集中訪問量:24

0.2=4.8小時會有6000萬
0.8=4800萬(二八原則);

(5) 每分併發量:4.8*60=288分鐘,每分鐘訪問4800/288=16.7萬(約等於);

(6) 每秒併發量:16.7萬/60=2780(約等於);

(7) 假設:高峯期爲日常值的三倍,則每秒的併發數能夠達到8340次。

(8) 1毫秒=1.3次訪問;

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

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

(2) 高峯期:須要30臺服務器;

容量預估:70/90原則

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

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

電網網站架構案例系列的第二篇文章。主要講解網站架構分析,網站架構優化,業務拆分,應用集羣架構,多級緩存,分佈式Session。

五、網站架構分析

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

  • 須要部署大量的服務器,高峯期計算,可能要部署30臺Web服務器。而且這三十臺服務器,只有秒殺,活動時纔會用到,存在大量的浪費。

  • 全部的應用部署在同一臺服務器,應用之間耦合嚴重。須要進行垂直切分和水平切分。

  • 大量應用存在冗餘代碼

  • 服務器SESSION同步耗費大量內存和網絡帶寬

  • 數據須要頻繁訪問數據庫,數據庫訪問壓力巨大。

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

  • 業務拆分

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

  • 多級緩存

  • 單點登陸(分佈式Session)

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

  • 服務化

  • 消息隊列

  • 其餘技術

5、網站架構優化

一、業務拆分

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

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

業務拆分做用:提高爲子系統可由專門的團隊和部門負責,專業的人作專業的事,解決模塊之間耦合以及擴展性問題;每一個子系統單獨部署,避免集中部署致使一個應用掛了,所有應用不可用的問題。

等級定義做用:用於流量突發時,對關鍵應用進行保護,實現優雅降級;保護關鍵應用不受到影響。

拆分後的架構圖:

clipboard.png

參考部署方案2

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

  • 分佈式部署:將業務拆分後的應用單獨部署,應用直接經過RPC進行遠程通訊;

  • 集羣部署:電商網站的高可用要求,每一個應用至少部署兩臺服務器進行集羣部署;

  • 負載均衡:是高可用系統必須的,通常應用經過負載均衡實現高可用,分佈式服務經過內置的負載均衡實現高可用,關係型數據庫經過主備方式實現高可用。

集羣部署後架構圖:

clipboard.png

三、 多級緩存

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

一級緩存,緩存數據字典,和經常使用熱點數據等基本不可變/有規則變化的信息,二級緩存緩存須要的全部緩存。當一級緩存過時或不可用時,訪問二級緩存的數據。若是二級緩存也沒有,則訪問數據庫。

緩存的比例,通常1:4,便可考慮使用緩存。(理論上是1:2便可)。

clipboard.png

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

(1) 緩存自動過時;

(2) 緩存觸發過時;

四、單點登陸(分佈式Session)

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

再進一步能夠根據分佈式Session,創建完善的單點登陸或帳戶管理系統。

clipboard.png

流程說明

1) 用戶第一次登陸時,將會話信息(用戶Id和用戶信息),好比以用戶Id爲Key,寫入分佈式Session;

(2) 用戶再次登陸時,獲取分佈式Session,是否有會話信息,若是沒有則調到登陸頁;

(3) 通常採用Cache中間件實現,建議使用Redis,所以它有持久化功能,方便分佈式Session宕機後,能夠從持久化存儲中加載會話信息;

(4) 存入會話時,能夠設置會話保持的時間,好比15分鐘,超事後自動超時;

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

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

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

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

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

clipboard.png

(1) 業務拆分後:每一個子系統須要單獨的庫;

(2) 若是單獨的庫太大,能夠根據業務特性,進行再次分庫,好比商品分類庫,產品庫;

(3) 分庫後,若是表中有數據量很大的,則進行分表,通常能夠按照Id,時間等進行分表;(高級的用法是一致性Hash)

(4) 在分庫,分表的基礎上,進行讀寫分離;

相關中間件可參考Cobar(阿里,目前已不在維護),TDDL(阿里),Atlas(奇虎360),MyCat(在Cobar基礎上,國內不少牛人,號稱國內第一開源項目)。

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

六、服務化

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

clipboard.png

七、消息隊列

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

(1) 用戶下單後,寫入消息隊列,後直接返回客戶端;

(2) 庫存子系統:讀取消息隊列信息,完成減庫存;

(3) 配送子系統:讀取消息隊列信息,進行配送;

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

八、其餘架構(技術)

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

此處不詳細介紹,你們能夠問度娘/Google,有機會的話也能夠分享給你們。

在此我向你們推薦一個架構學習交流羣。交流學習羣號:575745314 裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構等這些成爲架構師必備的知識體系。還能領取免費的學習資源,目前受益良多

6、架構總結

clipboard.png

以上是本次分享的架構總結,其中細節可參考前面分享的內容。其中還有不少能夠優化和細化的地方,由於是案例分享,主要針對重要部分作了介紹,工做中須要你們根據具體的業務場景進行架構設計。

相關文章
相關標籤/搜索