本文是學習大型分布式網(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)取免費的學習資源召边,目前受益良多铺呵!