大型分布式電商系統(tǒng)架構(gòu)是如何從0開始演進的?

本文是學習大型分布式網(wǎng)站架構(gòu)的技術(shù)總結(jié)浇揩。對架構(gòu)一個高性能仪壮、高可用、可伸縮及可擴展的分布式網(wǎng)站進行了概要性描述胳徽,并給出一個架構(gòu)參考积锅。文中一部分為讀書筆記爽彤,一部分是個人經(jīng)驗總結(jié),對大型分布式網(wǎng)站架構(gòu)有較好的參考價值乏沸。

一淫茵、大型分布式網(wǎng)站架構(gòu)技術(shù)

1、大型網(wǎng)站的特點

用戶多蹬跃,分布廣泛

大流量匙瘪,高并發(fā)

海量數(shù)據(jù),服務(wù)高可用

安全環(huán)境惡劣蝶缀,易受網(wǎng)絡(luò)攻擊

功能多丹喻,變更快,頻繁發(fā)布

從小到大翁都,漸進發(fā)展

以用戶為中心

免費服務(wù)碍论,付費體驗

2、大型網(wǎng)站架構(gòu)目標

高性能:提供快速的訪問體驗柄慰。

高可用:網(wǎng)站服務(wù)一直可以正常訪問鳍悠。

可伸縮:通過硬件增加/減少,提高/降低處理能力坐搔。

安全性:提供網(wǎng)站安全訪問和數(shù)據(jù)加密藏研、安全存儲等策略。

擴展性:方便地通過新增/移除方式概行,增加/減少新的功能/模塊蠢挡。

敏捷性:隨需應(yīng)變,快速響應(yīng)凳忙;

3业踏、大型網(wǎng)站架構(gòu)模式

分層:一般可分為應(yīng)用層、服務(wù)層涧卵、數(shù)據(jù)層勤家、管理層與分析層;

分割:一般按照業(yè)務(wù)/模塊/功能特點進行劃分柳恐,比如應(yīng)用層分為首頁却紧、用戶中心。

分布式:將應(yīng)用分開部署(比如多臺物理機)胎撤,通過遠程調(diào)用協(xié)同工作。

集群:一個應(yīng)用/模塊/功能部署多份(如:多臺物理機)断凶,通過負載均衡共同提供對外訪問伤提。

緩存:將數(shù)據(jù)放在距離應(yīng)用或用戶最近的位置,加快訪問速度认烁。

異步:將同步的操作異步化肿男〗樾冢客戶端發(fā)出請求,不等待服務(wù)端響應(yīng)舶沛,等服務(wù)端處理完畢后嘹承,使用通知或輪詢的方式告知請求方。一般指:請求——響應(yīng)——通知模式如庭。

冗余:增加副本,提高可用性、安全性與性能塘幅。

安全:對已知問題有有效的解決方案蛾派,對未知/潛在問題建立發(fā)現(xiàn)和防御機制。

自動化:將重復(fù)的往毡、不需要人工參與的事情蒙揣,通過工具的方式,使用機器完成开瞭。

敏捷性:積極接受需求變更懒震,快速響應(yīng)業(yè)務(wù)發(fā)展需求。

4嗤详、高性能架構(gòu)

以用戶為中心个扰,提供快速的網(wǎng)頁訪問體驗。主要參數(shù)有較短的響應(yīng)時間断楷、較大的并發(fā)處理能力锨匆、較高的吞吐量與穩(wěn)定的性能參數(shù)

可分為前端優(yōu)化冬筒、應(yīng)用層優(yōu)化恐锣、代碼層優(yōu)化與存儲層優(yōu)化。

前端優(yōu)化:網(wǎng)站業(yè)務(wù)邏輯之前的部分舞痰;

瀏覽器優(yōu)化:減少HTTP請求數(shù)土榴,使用瀏覽器緩存,啟用壓縮响牛,CSS JS位置玷禽,JS異步,減少Cookie傳輸呀打;CDN加速矢赁,反向代理;

應(yīng)用層優(yōu)化:處理網(wǎng)站業(yè)務(wù)的服務(wù)器贬丛。使用緩存撩银,異步,集群

代碼優(yōu)化:合理的架構(gòu)豺憔,多線程额获,資源復(fù)用(對象池够庙,線程池等),良好的數(shù)據(jù)結(jié)構(gòu)抄邀,JVM調(diào)優(yōu)耘眨,單例,Cache等境肾;

存儲優(yōu)化:緩存剔难、固態(tài)硬盤、光纖傳輸准夷、優(yōu)化讀寫钥飞、磁盤冗余、分布式存儲(HDFS)衫嵌、NoSQL等读宙。

5、高可用架構(gòu)

大型網(wǎng)站應(yīng)該在任何時候都可以正常訪問楔绞,正常提供對外服務(wù)结闸。因為大型網(wǎng)站的復(fù)雜性,分布式酒朵,廉價服務(wù)器桦锄,開源數(shù)據(jù)庫,操作系統(tǒng)等特點蔫耽,要保證高可用是很困難的结耀,也就是說網(wǎng)站的故障是不可避免的。

如何提高可用性匙铡,就是需要迫切解決的問題图甜。首先,需要從架構(gòu)級別考慮鳖眼,在規(guī)劃的時候黑毅,就考慮可用性。行業(yè)內(nèi)一般用幾個9表示可用性指標钦讳,比如四個9(99.99)矿瘦,一年內(nèi)允許的不可用時間是53分鐘。

不同層級使用的策略不同愿卒,一般采用冗余備份和失效轉(zhuǎn)移解決高可用問題缚去。

應(yīng)用層:一般設(shè)計為無狀態(tài)的,對于每次請求琼开,使用哪一臺服務(wù)器處理是沒有影響的病游。一般使用負載均衡技術(shù)(需要解決Session同步問題)實現(xiàn)高可用。

服務(wù)層:負載均衡,分級管理衬衬,快速失敗(超時設(shè)置)改橘,異步調(diào)用滋尉,服務(wù)降級,冪等設(shè)計等飞主。

數(shù)據(jù)層:冗余備份(冷狮惜,熱備[同步,異步]碌识,溫備)碾篡,失效轉(zhuǎn)移(確認,轉(zhuǎn)移筏餐,恢復(fù))开泽。數(shù)據(jù)高可用方面著名的理論基礎(chǔ)是CAP理論(持久性,可用性魁瞪,數(shù)據(jù)一致性[強一致穆律,用戶一致,最終一致])

6导俘、可伸縮架構(gòu)

伸縮性是指在不改變原有架構(gòu)設(shè)計的基礎(chǔ)上峦耘,通過添加/減少硬件(服務(wù)器)的方式,提高/降低系統(tǒng)的處理能力旅薄。

應(yīng)用層:對應(yīng)用進行垂直或水平切分辅髓。然后針對單一功能進行負載均衡(DNS、HTTP[反向代理]少梁、IP洛口、鏈路層)。

服務(wù)層:與應(yīng)用層類似猎莲;

數(shù)據(jù)層:分庫绍弟、分表、NoSQL等著洼;常用算法Hash樟遣,一致性Hash。

7身笤、可擴展架構(gòu)

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

模塊化液荸,組件化:高內(nèi)聚瞻佛,低耦合,提高復(fù)用性,擴展性伤柄。

穩(wěn)定接口:定義穩(wěn)定的接口绊困,在接口不變的情況下,內(nèi)部結(jié)構(gòu)可以“隨意”變化适刀。

設(shè)計模式:應(yīng)用面向?qū)ο笏枷氤永剩瓌t,使用設(shè)計模式笔喉,進行代碼層面的設(shè)計取视。

消息隊列:模塊化的系統(tǒng),通過消息隊列進行交互常挚,使模塊之間的依賴解耦作谭。

分布式服務(wù):公用模塊服務(wù)化,提供其他系統(tǒng)使用奄毡,提高可重用性折欠,擴展性。

8秧倾、安全架構(gòu)

對已知問題有有效的解決方案怨酝,對未知/潛在問題建立發(fā)現(xiàn)和防御機制。對于安全問題那先,首先要提高安全意識农猬,建立一個安全的有效機制,從政策層面售淡,組織層面進行保障斤葱,比如服務(wù)器密碼不能泄露,密碼每月更新揖闸,并且三次內(nèi)不能重復(fù)揍堕;每周安全掃描等。以制度化的方式汤纸,加強安全體系的建設(shè)衩茸。同時,需要注意與安全有關(guān)的各個環(huán)節(jié)贮泞。安全問題不容忽視楞慈,包括基礎(chǔ)設(shè)施安全,應(yīng)用系統(tǒng)安全啃擦,數(shù)據(jù)保密安全等囊蓝。

基礎(chǔ)設(shè)施安全:硬件采購,操作系統(tǒng)令蛉,網(wǎng)絡(luò)環(huán)境方面的安全聚霜。一般采用正規(guī)渠道購買高質(zhì)量的產(chǎn)品,選擇安全的操作系統(tǒng),及時修補漏洞蝎宇,安裝殺毒軟件防火墻弟劲。防范病毒,后門姥芥。設(shè)置防火墻策略函卒,建立DDOS防御系統(tǒng),使用攻擊檢測系統(tǒng)撇眯,進行子網(wǎng)隔離等手段。

應(yīng)用系統(tǒng)安全:在程序開發(fā)時虱咧,對已知常用問題熊榛,使用正確的方式,在代碼層面解決掉腕巡。防止跨站腳本攻擊(XSS)玄坦,注入攻擊,跨站請求偽造(CSRF)绘沉,錯誤信息煎楣,HTML注釋,文件上傳车伞,路徑遍歷等择懂。還可以使用Web應(yīng)用防火墻(比如:ModSecurity),進行安全漏洞掃描等措施另玖,加強應(yīng)用級別的安全困曙。

數(shù)據(jù)保密安全:存儲安全(存儲在可靠的設(shè)備,實時谦去,定時備份)慷丽,保存安全(重要的信息加密保存,選擇合適的人員復(fù)雜保存和檢測等)鳄哭,傳輸安全(防止數(shù)據(jù)竊取和數(shù)據(jù)篡改)要糊;

常用的加解密算法(單項散列加密[MD5、SHA]妆丘,對稱加密[DES锄俄、3DES、RC])飘痛,非對稱加密[RSA]等珊膜。

9、敏捷性

網(wǎng)站的架構(gòu)設(shè)計宣脉,運維管理要適應(yīng)變化车柠,提供高伸縮性,高擴展性。方便的應(yīng)對快速的業(yè)務(wù)發(fā)展竹祷,突增高流量訪問等要求谈跛。

除上面介紹的架構(gòu)要素外,還需要引入敏捷管理塑陵,敏捷開發(fā)的思想感憾。使業(yè)務(wù),產(chǎn)品令花,技術(shù)阻桅,運維統(tǒng)一起來,隨需應(yīng)變兼都,快速響應(yīng)嫂沉。

10、大型架構(gòu)舉例

以上采用七層邏輯架構(gòu)扮碧,第一層客戶層趟章,第二層前端優(yōu)化層,第三層應(yīng)用層慎王,第四層服務(wù)層蚓土,第五層數(shù)據(jù)存儲層,第六層大數(shù)據(jù)存儲層赖淤,第七層大數(shù)據(jù)處理層蜀漆。

客戶層:支持PC瀏覽器和手機APP。差別是手機APP可以直接通過IP訪問漫蛔,反向代理服務(wù)器嗜愈。

前端層:使用DNS負載均衡,CDN本地加速以及反向代理服務(wù)莽龟;

應(yīng)用層:網(wǎng)站應(yīng)用集群蠕嫁;按照業(yè)務(wù)進行垂直拆分,比如商品應(yīng)用毯盈,會員中心等剃毒;

服務(wù)層:提供公用服務(wù),比如用戶服務(wù)搂赋,訂單服務(wù)赘阀,支付服務(wù)等;

數(shù)據(jù)層:支持關(guān)系型數(shù)據(jù)庫集群(支持讀寫分離)脑奠,NOSQL集群基公,分布式文件系統(tǒng)集群;以及分布式Cache宋欺;

大數(shù)據(jù)存儲層:支持應(yīng)用層和服務(wù)層的日志數(shù)據(jù)收集轰豆,關(guān)系數(shù)據(jù)庫和NOSQL數(shù)據(jù)庫的結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù)收集胰伍;

大數(shù)據(jù)處理層:通過Mapreduce進行離線數(shù)據(jù)分析或Storm實時數(shù)據(jù)分析,并將處理后的數(shù)據(jù)存入關(guān)系型數(shù)據(jù)庫酸休。(實際使用中骂租,離線數(shù)據(jù)和實時數(shù)據(jù)會按照業(yè)務(wù)要求進行分類處理,并存入不同的數(shù)據(jù)庫中斑司,供應(yīng)用層或服務(wù)層使用)渗饮。

二、大型電商網(wǎng)站系統(tǒng)架構(gòu)演變過程

一個成熟的大型網(wǎng)站(如淘寶宿刮、天貓互站、騰訊等)的系統(tǒng)架構(gòu)并不是一開始設(shè)計時就具備完整的高性能、高可用僵缺、高伸縮等特性的云茸,它是隨著用戶量的增加,業(yè)務(wù)功能的擴展逐漸演變完善的谤饭,在這個過程中,開發(fā)模式懊纳、技術(shù)架構(gòu)揉抵、設(shè)計思想也發(fā)生了很大的變化,就連技術(shù)人員也從幾個人發(fā)展到一個部門甚至一條產(chǎn)品線嗤疯。

所以成熟的系統(tǒng)架構(gòu)是隨著業(yè)務(wù)的擴展而逐步完善的冤今,并不是一蹴而就;不同業(yè)務(wù)特征的系統(tǒng)茂缚,會有各自的側(cè)重點戏罢,例如淘寶,要解決海量的商品信息的搜索脚囊、下單龟糕、支付;例如騰訊悔耘,要解決數(shù)億用戶的實時消息傳輸讲岁;百度它要處理海量的搜索請求。

他們都有各自的業(yè)務(wù)特性衬以,系統(tǒng)架構(gòu)也有所不同缓艳。盡管如此我們也可以從這些不同的網(wǎng)站背景中,找出其中共用的技術(shù)看峻,這些技術(shù)和手段廣泛運用在大型網(wǎng)站系統(tǒng)的架構(gòu)中阶淘,下面就通過介紹大型網(wǎng)站系統(tǒng)的演化過程,來認識這些技術(shù)和手段互妓。

1溪窒、最開始的網(wǎng)站架構(gòu)

最初的架構(gòu)坤塞,應(yīng)用程序、數(shù)據(jù)庫霉猛、文件都部署在一臺服務(wù)器上尺锚,如圖:

2、應(yīng)用惜浅、數(shù)據(jù)瘫辩、文件分離

隨著業(yè)務(wù)的擴展,一臺服務(wù)器已經(jīng)不能滿足性能需求坛悉,故將應(yīng)用程序伐厌、數(shù)據(jù)庫、文件各自部署在獨立的服務(wù)器上裸影,并且根據(jù)服務(wù)器的用途配置不同的硬件挣轨,達到最佳的性能效果。

3轩猩、利用緩存改善網(wǎng)站性能

在硬件優(yōu)化性能的同時卷扮,同時也通過軟件進行性能優(yōu)化,在大部分的網(wǎng)站系統(tǒng)中均践,都會利用緩存技術(shù)改善系統(tǒng)的性能晤锹,使用緩存主要源于熱點數(shù)據(jù)的存在,大部分網(wǎng)站訪問都遵循28原則(即80%的訪問請求彤委,最終落在20%的數(shù)據(jù)上)鞭铆,所以我們可以對熱點數(shù)據(jù)進行緩存,減少這些數(shù)據(jù)的訪問路徑焦影,提高用戶體驗车遂。

緩存實現(xiàn)常見的方式是本地緩存、分布式緩存斯辰。當然還有CDN舶担、反向代理等,這個后面再講彬呻。本地緩存柄沮,顧名思義是將數(shù)據(jù)緩存在應(yīng)用服務(wù)器本地,可以存在內(nèi)存中废岂,也可以存在文件祖搓,OSCache就是常用的本地緩存組件。本地緩存的特點是速度快湖苞,但因為本地空間有限所以緩存數(shù)據(jù)量也有限拯欧。分布式緩存的特點是,可

以緩存海量的數(shù)據(jù)财骨,并且擴展非常容易镐作,在門戶類網(wǎng)站中常常被使用藏姐,速度按理沒有本地緩存快,常用的分布式緩存是Memcached该贾、Redis羔杨。

4、使用集群改善應(yīng)用服務(wù)器性能

應(yīng)用服務(wù)器作為網(wǎng)站的入口杨蛋,會承擔大量的請求兜材,我們往往通過應(yīng)用服務(wù)器集群來分擔請求數(shù)。應(yīng)用服務(wù)器前面部署負載均衡服務(wù)器調(diào)度用戶請求逞力,根據(jù)分發(fā)策略將請求分發(fā)到多個應(yīng)用服務(wù)器節(jié)點曙寡。

常用的負載均衡技術(shù)硬件的有F5,價格比較貴寇荧,軟件的有LVS举庶、Nginx、HAProxy揩抡。LVS是四層負載均衡户侥,根據(jù)目標地址和端口選擇內(nèi)部服務(wù)器,Nginx和HAProxy是七層負載均衡峦嗤,可以根據(jù)報文內(nèi)容選擇內(nèi)部服務(wù)器添祸,因此LVS分發(fā)路徑優(yōu)于Nginx和HAProxy,性能要高些寻仗,而Nginx和HAProxy則更具配置性,如可以用來做動靜分離(根據(jù)請求報文特征凡壤,選擇靜態(tài)資源服務(wù)器還是應(yīng)用服務(wù)器)署尤。

5、數(shù)據(jù)庫讀寫分離和分庫分表

隨著用戶量的增加亚侠,數(shù)據(jù)庫成為最大的瓶頸曹体,改善數(shù)據(jù)庫性能常用的手段是進行讀寫分離以及分庫分表,讀寫分離顧名思義就是將數(shù)據(jù)庫分為讀庫和寫庫硝烂,通過主備功能實現(xiàn)數(shù)據(jù)同步箕别。分庫分表則分為水平切分和垂直切分,水平切分則是對一個數(shù)據(jù)庫特大的表進行拆分滞谢,例如用戶表串稀。垂直切分則是根據(jù)業(yè)務(wù)的不同來切分,如用戶業(yè)務(wù)狮杨、商品業(yè)務(wù)相關(guān)的表放在不同的數(shù)據(jù)庫中母截。

6、使用CDN和反向代理提高網(wǎng)站性能

假如我們的服務(wù)器都部署在成都的機房橄教,對于四川的用戶來說訪問是較快的清寇,而對于北京的用戶訪問是較慢的喘漏,這是由于四川和北京分別屬于電信和聯(lián)通的不同發(fā)達地區(qū),北京用戶訪問需要通過互聯(lián)路由器經(jīng)過較長的路徑才能訪問到成都的服務(wù)器华烟,返回路徑也一樣翩迈,所以數(shù)據(jù)傳輸時間比較長。對于這種情況盔夜,常常使用CDN解決负饲,CDN將數(shù)據(jù)內(nèi)容緩存到運營商的機房,用戶訪問時先從最近的運營商獲取數(shù)據(jù)比吭,這樣大大減少了網(wǎng)絡(luò)訪問的路徑绽族。比較專業(yè)的CDN運營商有藍汛、網(wǎng)宿衩藤。

而反向代理吧慢,則是部署在網(wǎng)站的機房,當用戶請求達到時首先訪問反向代理服務(wù)器赏表,反向代理服務(wù)器將緩存的數(shù)據(jù)返回給用戶检诗,如果沒有緩存數(shù)據(jù)才會繼續(xù)訪問應(yīng)用服務(wù)器獲取,這樣做減少了獲取數(shù)據(jù)的成本瓢剿。反向代理有Squid逢慌、Nginx。

7间狂、使用分布式文件系統(tǒng)

用戶一天天增加攻泼,業(yè)務(wù)量越來越大,產(chǎn)生的文件越來越多鉴象,單臺的文件服務(wù)器已經(jīng)不能滿足需求忙菠,這時就需要分布式文件系統(tǒng)的支撐。常用的分布式文件系統(tǒng)有GFS纺弊、HDFS牛欢、TFS。

8淆游、使用NoSQL和搜索引擎

對于海量數(shù)據(jù)的查詢和分析傍睹,我們使用NoSQL數(shù)據(jù)庫加上搜索引擎可以達到更好的性能。并不是所有的數(shù)據(jù)都要放在關(guān)系型數(shù)據(jù)中犹菱。常用的NoSQL有MongoDB拾稳、HBase、Redis腊脱,搜索引擎有Lucene熊赖、Solr、Elasticsearch虑椎。

9震鹉、將應(yīng)用服務(wù)器進行業(yè)務(wù)拆分

隨著業(yè)務(wù)進一步擴展俱笛,應(yīng)用程序變得非常臃腫进统,這時我們需要將應(yīng)用程序進行業(yè)務(wù)拆分盼忌,如百度分為新聞探颈、網(wǎng)頁钧汹、圖片等業(yè)務(wù)骑脱。每個業(yè)務(wù)應(yīng)用負責相對獨立的業(yè)務(wù)運作雨饺。業(yè)務(wù)之間通過消息進行通信或者共享數(shù)據(jù)庫來實現(xiàn)磕洪。

10鸵荠、搭建分布式服務(wù)

這時我們發(fā)現(xiàn)各個業(yè)務(wù)應(yīng)用都會使用到一些基本的業(yè)務(wù)服務(wù)簸呈,例如用戶服務(wù)榕订、訂單服務(wù)、支付服務(wù)蜕便、安全服務(wù)劫恒,這些服務(wù)是支撐各業(yè)務(wù)應(yīng)用的基本要素。我們將這些服務(wù)抽取出來利用分部式服務(wù)框架搭建分布式服務(wù)轿腺。阿里的Dubbo是一個不錯的選擇两嘴。

三、一張圖說明電商架構(gòu)

四族壳、大型電商網(wǎng)站架構(gòu)案例

1憔辫、電商案例的原因

分布式大型網(wǎng)站,目前看主要有幾類:

大型門戶仿荆,比如網(wǎng)易贰您,新浪等;

SNS網(wǎng)站拢操,比如校內(nèi)锦亦,開心網(wǎng)等;

電商網(wǎng)站庐冯,比如阿里巴巴,京東商城坎穿,國美在線展父,汽車之家等。

大型門戶一般是新聞類信息玲昧,可以使用CDN栖茉,靜態(tài)化等方式優(yōu)化,開心網(wǎng)等交互性比較多孵延,可能會引入更多的NoSQL吕漂,分布式緩存,使用高性能的通信框架等尘应。電商網(wǎng)站具備以上兩類的特點惶凝,比如產(chǎn)品詳情可以采用CDN吼虎,靜態(tài)化,交互性高的需要采用NoSQL等技術(shù)苍鲜。因此思灰,我們采用電商網(wǎng)站作為案例,進行分析混滔。

2洒疚、電商網(wǎng)站需求

客戶需求:

建立一個全品類的電子商務(wù)網(wǎng)站(B2C),用戶可以在線購買商品坯屿,可以在線支付油湖,也可以貨到付款;

用戶購買時可以在線與客服溝通领跛;

用戶收到商品后乏德,可以給商品打分,評價隔节;

目前有成熟的進銷存系統(tǒng)鹅经;需要與網(wǎng)站對接;

希望能夠支持3~5年怎诫,業(yè)務(wù)的發(fā)展瘾晃;

預(yù)計3~5年用戶數(shù)達到1000萬;

定期舉辦雙11幻妓、雙12蹦误、三八男人節(jié)等活動;

其他的功能參考京東或國美在線等網(wǎng)站肉津。

客戶就是客戶强胰,不會告訴你具體要什么,只會告訴你他想要什么妹沙,我們很多時候要引導(dǎo)偶洋,挖掘客戶的需求。好在提供了明確的參考網(wǎng)站距糖。因此玄窝,下一步要進行大量的分析,結(jié)合行業(yè)悍引,以及參考網(wǎng)站恩脂,給客戶提供方案。

需求功能矩陣

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

本電商網(wǎng)站的需求矩陣如下:

3势腮、網(wǎng)站初級架構(gòu)

一般網(wǎng)站,剛開始的做法壮啊,是三臺服務(wù)器嫉鲸,一臺部署應(yīng)用,一臺部署數(shù)據(jù)庫歹啼,一臺部署NFS文件系統(tǒng)玄渗。

這是前幾年比較傳統(tǒng)的做法,之前見到一個網(wǎng)站10萬多會員狸眼,垂直服裝設(shè)計門戶藤树,N多圖片。使用了一臺服務(wù)器部署了應(yīng)用拓萌,數(shù)據(jù)庫以及圖片存儲岁钓。出現(xiàn)了很多性能問題。

如下圖:

但是微王,目前主流的網(wǎng)站架構(gòu)已經(jīng)發(fā)生了翻天覆地的變化屡限。一般都會采用集群的方式,進行高可用設(shè)計炕倘。至少是下面這個樣子:

使用集群對應(yīng)用服務(wù)器進行冗余钧大,實現(xiàn)高可用;(負載均衡設(shè)備可與應(yīng)用一塊部署)

使用數(shù)據(jù)庫主備模式罩旋,實現(xiàn)數(shù)據(jù)備份和高可用啊央;

4、系統(tǒng)容量預(yù)估

預(yù)估步驟:

注冊用戶數(shù)-日均UV量-每日的PV量-每天的并發(fā)量涨醋;

峰值預(yù)估:平常量的2~3倍瓜饥;

根據(jù)并發(fā)量(并發(fā),事務(wù)數(shù))浴骂,存儲容量計算系統(tǒng)容量乓土。

根據(jù)客戶需求:3~5年用戶數(shù)達到1000萬注冊用戶,可以做每秒并發(fā)數(shù)預(yù)估:

每天的UV為200萬(二八原則)溯警;

每日每天點擊瀏覽30次趣苏;

PV量:200*30=6000萬;

集中訪問量:24*0.2=4.8小時會有6000萬*0.8=4800萬(二八原則)愧膀;

每分并發(fā)量:4.8*60=288分鐘拦键,每分鐘訪問4800/288=16.7萬(約等于)谣光;

每秒并發(fā)量:16.7萬/60=2780(約等于)檩淋;

假設(shè):高峰期為平常值的三倍,則每秒的并發(fā)數(shù)可以達到8340次。

1毫秒=1.3次訪問蟀悦;

沒好好學數(shù)學后悔了吧媚朦?!(不知道以上算是否有錯誤日戈,呵呵~~)

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

按一臺web服務(wù)器询张,支持每秒300個并發(fā)計算。平常需要10臺服務(wù)器(約等于)浙炼;[tomcat默認配置是150]份氧,高峰期需要30臺服務(wù)器;

容量預(yù)估:70/90原則

系統(tǒng)CPU一般維持在70%左右的水平弯屈,高峰期達到90%的水平蜗帜,是不浪費資源,并比較穩(wěn)定的资厉。內(nèi)存厅缺,IO類似。

以上預(yù)估僅供參考宴偿,因為服務(wù)器配置湘捎,業(yè)務(wù)邏輯復(fù)雜度等都有影響。在此CPU窄刘,硬盤窥妇,網(wǎng)絡(luò)等不再進行評估。

5都哭、網(wǎng)站架構(gòu)分析

根據(jù)以上預(yù)估秩伞,有幾個問題:

需要部署大量的服務(wù)器,高峰期計算欺矫,可能要部署30臺Web服務(wù)器纱新。并且這三十臺服務(wù)器,只有秒殺穆趴,活動時才會用到脸爱,存在大量的浪費。

所有的應(yīng)用部署在同一臺服務(wù)器未妹,應(yīng)用之間耦合嚴重簿废。需要進行垂直切分和水平切分。

大量應(yīng)用存在冗余代碼

服務(wù)器Session同步耗費大量內(nèi)存和網(wǎng)絡(luò)帶寬

數(shù)據(jù)需要頻繁訪問數(shù)據(jù)庫络它,數(shù)據(jù)庫訪問壓力巨大族檬。

大型網(wǎng)站一般需要做以下架構(gòu)優(yōu)化(優(yōu)化是架構(gòu)設(shè)計時,就要考慮的化戳,一般從架構(gòu)/代碼級別解決单料,調(diào)優(yōu)主要是簡單參數(shù)的調(diào)整,比如JVM調(diào)優(yōu);如果調(diào)優(yōu)涉及大量代碼改造扫尖,就不是調(diào)優(yōu)了白对,屬于重構(gòu)):

業(yè)務(wù)拆分

應(yīng)用集群部署(分布式部署,集群部署和負載均衡)

多級緩存

單點登錄(分布式Session)

數(shù)據(jù)庫集群(讀寫分離换怖,分庫分表)

服務(wù)化

消息隊列

其他技術(shù)

6甩恼、網(wǎng)站架構(gòu)優(yōu)化

6.1業(yè)務(wù)拆分

根據(jù)業(yè)務(wù)屬性進行垂直切分,劃分為產(chǎn)品子系統(tǒng)沉颂,購物子系統(tǒng)条摸,支付子系統(tǒng),評論子系統(tǒng)铸屉,客服子系統(tǒng)屈溉,接口子系統(tǒng)(對接如進銷存,短信等外部系統(tǒng))抬探。

根據(jù)業(yè)務(wù)子系統(tǒng)進行等級定義子巾,可分為核心系統(tǒng)和非核心系統(tǒng)。核心系統(tǒng):產(chǎn)品子系統(tǒng)小压,購物子系統(tǒng)线梗,支付子系統(tǒng);非核心:評論子系統(tǒng)怠益,客服子系統(tǒng)仪搔,接口子系統(tǒng)。

業(yè)務(wù)拆分作用:提升為子系統(tǒng)可由專門的團隊和部門負責蜻牢,專業(yè)的人做專業(yè)的事烤咧,解決模塊之間耦合以及擴展性問題;每個子系統(tǒng)單獨部署抢呆,避免集中部署導(dǎo)致一個應(yīng)用掛了煮嫌,全部應(yīng)用不可用的問題。

等級定義作用:用于流量突發(fā)時抱虐,對關(guān)鍵應(yīng)用進行保護昌阿,實現(xiàn)優(yōu)雅降級;保護關(guān)鍵應(yīng)用不受到影響恳邀。

拆分后的架構(gòu)圖:

參考部署方案2

如上圖每個應(yīng)用單獨部署懦冰,核心系統(tǒng)和非核心系統(tǒng)組合部署

6.2應(yīng)用集群部署(分布式,集群谣沸,負載均衡)

分布式部署:將業(yè)務(wù)拆分后的應(yīng)用單獨部署刷钢,應(yīng)用直接通過RPC進行遠程通信;

集群部署:電商網(wǎng)站的高可用要求乳附,每個應(yīng)用至少部署兩臺服務(wù)器進行集群部署内地;

負載均衡:是高可用系統(tǒng)必須的椰弊,一般應(yīng)用通過負載均衡實現(xiàn)高可用,分布式服務(wù)通過內(nèi)置的負載均衡實現(xiàn)高可用瓤鼻,關(guān)系型數(shù)據(jù)庫通過主備方式實現(xiàn)高可用。

集群部署后架構(gòu)圖:

6.3 多級緩存

緩存按照存放的位置一般可分為兩類本地緩存和分布式緩存贤重。本案例采用二級緩存的方式茬祷,進行緩存的設(shè)計。一級緩存為本地緩存并蝗,二級緩存為分布式緩存祭犯。(還有頁面緩存,片段緩存等滚停,那是更細粒度的劃分)

一級緩存沃粗,緩存數(shù)據(jù)字典,和常用熱點數(shù)據(jù)等基本不可變/有規(guī)則變化的信息键畴,二級緩存緩存需要的所有緩存最盅。當一級緩存過期或不可用時,訪問二級緩存的數(shù)據(jù)起惕。如果二級緩存也沒有涡贱,則訪問數(shù)據(jù)庫。

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

根據(jù)業(yè)務(wù)特性可使用以下緩存過期策略:

緩存自動過期激挪;

緩存觸發(fā)過期;

6.4單點登錄(分布式Session)

系統(tǒng)分割為多個子系統(tǒng)锋叨,獨立部署后垄分,不可避免的會遇到會話管理的問題。一般可采用Session同步娃磺,Cookies锋喜,分布式Session方式。電商網(wǎng)站一般采用分布式Session實現(xiàn)豌鸡。

再進一步可以根據(jù)分布式Session嘿般,建立完善的單點登錄或賬戶管理系統(tǒng)。

流程說明

用戶第一次登錄時涯冠,將會話信息(用戶Id和用戶信息)炉奴,比如以用戶Id為Key,寫入分布式Session蛇更;

用戶再次登錄時瞻赶,獲取分布式Session赛糟,是否有會話信息砸逊,如果沒有則調(diào)到登錄頁司倚;

一般采用Cache中間件實現(xiàn)动知,建議使用Redis,因此它有持久化功能丹皱,方便分布式Session宕機后种呐,可以從持久化存儲中加載會話信息;

存入會話時淆攻,可以設(shè)置會話保持的時間啸箫,比如15分鐘忘苛,超過后自動超時;

結(jié)合Cache中間件胸遇,實現(xiàn)的分布式Session倍阐,可以很好的模擬Session會話峰搪。

6.5數(shù)據(jù)庫集群(讀寫分離,分庫分表)

大型網(wǎng)站需要存儲海量的數(shù)據(jù)童漩,為達到海量數(shù)據(jù)存儲矫膨,高可用危尿,高性能一般采用冗余的方式進行系統(tǒng)設(shè)計谊娇。一般有兩種方式讀寫分離和分庫分表。

讀寫分離:一般解決讀比例遠大于寫比例的場景法褥,可采用一主一備半等,一主多備或多主多備方式。

本案例在業(yè)務(wù)拆分的基礎(chǔ)上凹髓,結(jié)合分庫分表和讀寫分離蔚舀。如下圖:

業(yè)務(wù)拆分后:每個子系統(tǒng)需要單獨的庫狼牺;

如果單獨的庫太大,可以根據(jù)業(yè)務(wù)特性,進行再次分庫弹囚,比如商品分類庫鸥鹉,產(chǎn)品庫;

分庫后,如果表中有數(shù)據(jù)量很大的绎狭,則進行分表,一般可以按照Id蹦狂,時間等進行分表;(高級的用法是一致性Hash)

在分庫、分表的基礎(chǔ)上准验,進行讀寫分離;

相關(guān)中間件可參考Cobar(阿里,目前已不在維護)夭坪,TDDL(阿里)潭流,Atlas(奇虎360),MyCat讼撒。

分庫分表后序列的問題物蝙,JOIN,事務(wù)的問題,會在分庫分表主題分享中,介紹窗宇。

6.6服務(wù)化

將多個子系統(tǒng)公用的功能/模塊废士,進行抽取短蜕,作為公用服務(wù)使用。比如本案例的會員子系統(tǒng)就可以抽取為公用的服務(wù)。

6.7消息隊列

消息隊列可以解決子系統(tǒng)/模塊之間的耦合镶奉,實現(xiàn)異步建峭,高可用,高性能的系統(tǒng)。是分布式系統(tǒng)的標準配置。本案例中,消息隊列主要應(yīng)用在購物叛薯,配送環(huán)節(jié)抖拴。

用戶下單后,寫入消息隊列拉馋,后直接返回客戶端;

庫存子系統(tǒng):讀取消息隊列信息,完成減庫存傀蓉;

配送子系統(tǒng):讀取消息隊列信息,進行配送职抡;

目前使用較多的MQ有Active MQ葬燎、Rabbit MQ、Zero MQ、MS MQ等谱净,需要根據(jù)具體的業(yè)務(wù)場景進行選擇窑邦。建議可以研究下Rabbit MQ。

6.8其他架構(gòu)(技術(shù))

除了以上介紹的業(yè)務(wù)拆分壕探,應(yīng)用集群冈钦,多級緩存,單點登錄李请,數(shù)據(jù)庫集群瞧筛,服務(wù)化,消息隊列外导盅。還有CDN驾窟,反向代理,分布式文件系統(tǒng)认轨,大數(shù)據(jù)處理等系統(tǒng)绅络。

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

7、架構(gòu)匯總

大型網(wǎng)站的架構(gòu)是根據(jù)業(yè)務(wù)需求不斷完善的纪蜒,根據(jù)不同的業(yè)務(wù)特征會做特定的設(shè)計和考慮衷恭,本文只是講述一個常規(guī)大型網(wǎng)站會涉及的一些技術(shù)和手段,希望能給大家?guī)韱l(fā)纯续。

作者介紹

爛豬皮随珠,十余年工作經(jīng)驗,曾在 Google 等外企工作過幾年猬错,精通 Java窗看、分布式架構(gòu)、微服務(wù)架構(gòu)以及數(shù)據(jù)庫倦炒,最近正在研究大數(shù)據(jù)以及區(qū)塊鏈显沈,希望能突破到更高的境界!

如果覺得小編寫得還可以的話 可以給個贊哦逢唤!大家也可以加 java 高級架構(gòu)群:318261748?里面會分享一些資深架構(gòu)師錄制的視頻錄像:有Spring拉讯,MyBatis,Netty源碼分析鳖藕,高并發(fā)魔慷、高性能、分布式著恩、微服務(wù)架構(gòu)的原理院尔,JVM性能優(yōu)化纹烹、分布式架構(gòu)等這些成為架構(gòu)師必備的知識體系。還能領(lǐng)取免費的學習資源召边,目前受益良多铺呵!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市隧熙,隨后出現(xiàn)的幾起案子片挂,更是在濱河造成了極大的恐慌,老刑警劉巖贞盯,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件音念,死亡現(xiàn)場離奇詭異,居然都是意外死亡躏敢,警方通過查閱死者的電腦和手機闷愤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來件余,“玉大人讥脐,你說我怎么就攤上這事√淦鳎” “怎么了旬渠?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長端壳。 經(jīng)常有香客問我告丢,道長,這世上最難降的妖魔是什么损谦? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任岖免,我火速辦了婚禮,結(jié)果婚禮上照捡,老公的妹妹穿的比我還像新娘颅湘。我一直安慰自己,他們只是感情好麻敌,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布栅炒。 她就那樣靜靜地躺著掂摔,像睡著了一般术羔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乙漓,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天级历,我揣著相機與錄音,去河邊找鬼叭披。 笑死寥殖,一個胖子當著我的面吹牛玩讳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嚼贡,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼熏纯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了粤策?” 一聲冷哼從身側(cè)響起樟澜,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叮盘,沒想到半個月后秩贰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡柔吼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年毒费,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愈魏。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡觅玻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出培漏,到底是詐尸還是另有隱情串塑,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布北苟,位于F島的核電站桩匪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏友鼻。R本人自食惡果不足惜傻昙,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望彩扔。 院中可真熱鬧妆档,春花似錦、人聲如沸虫碉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敦捧。三九已至须板,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兢卵,已是汗流浹背习瑰。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秽荤,地道東北人甜奄。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓柠横,卻偏偏與公主長得像,于是被迫代替她去往敵國和親课兄。 傳聞我的和親對象是個殘疾皇子牍氛,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容