前言
一個(gè)好的架構(gòu)是靠演變而來,而不是單純的靠設(shè)計(jì)世囊。剛開始做架構(gòu)設(shè)計(jì),我們不可能全方位的考慮到架構(gòu)的高性能距贷、高擴(kuò)展性相叁、高安全等各方面的因素遵绰。隨著業(yè)務(wù)需求越多越多、隨著業(yè)務(wù)訪問壓力越多越大增淹,架構(gòu)不斷的演變及進(jìn)化椿访,因而造就了一個(gè)成熟穩(wěn)定的大型架構(gòu)。如淘寶網(wǎng)虑润、如Facebook等大型網(wǎng)站的架構(gòu)成玫,無不從一個(gè)小型規(guī)模架構(gòu),不斷進(jìn)化及演變成為一個(gè)大型網(wǎng)站架構(gòu)拳喻。
隨著云計(jì)算的到來哭当,當(dāng)前已經(jīng)從IT時(shí)代向DT時(shí)代開始轉(zhuǎn)型。在云端如何構(gòu)建千萬級架構(gòu)冗澈,本文主要結(jié)合阿里云最佳實(shí)踐經(jīng)驗(yàn)钦勘,向大家分享如何從一個(gè)小型網(wǎng)站逐步演變到千萬級架構(gòu)的過程。
架構(gòu)原始階段:萬能的單機(jī)
架構(gòu)的最原始階段渗柿,即一臺ECS服務(wù)器搞定一切个盆。傳統(tǒng)官網(wǎng)、論壇等應(yīng)用朵栖,只需要一臺ECS颊亮。對應(yīng)的web服務(wù)器、數(shù)據(jù)庫陨溅、靜態(tài)文件資源等终惑,部署到一臺ECS上即可。一般5萬pv到30萬pv訪問量门扇,結(jié)合內(nèi)核參數(shù)調(diào)優(yōu)雹有、web應(yīng)用性能參數(shù)、數(shù)據(jù)庫調(diào)優(yōu)臼寄,基本上能夠穩(wěn)定的運(yùn)行霸奕。
架構(gòu)采用單臺ECS:
架構(gòu)基礎(chǔ)階段:物理分離web和數(shù)據(jù)庫
當(dāng)訪問壓力達(dá)到50萬pv到100萬pv的時(shí)候,部署在一臺服務(wù)器上面的web應(yīng)用及數(shù)據(jù)庫等服務(wù)應(yīng)用吉拳,會對服務(wù)器的CPU/內(nèi)存/磁盤/帶寬 等系統(tǒng)資源進(jìn)行競爭质帅。顯然單機(jī)已經(jīng)出現(xiàn)性能瓶頸。我們將web應(yīng)用和數(shù)據(jù)庫物理分離單獨(dú)部署,解決對應(yīng)性能問題煤惩。
架構(gòu)采用ECS+RDS:
架構(gòu)動靜分離階段:靜態(tài)緩存 + 文件存儲
當(dāng)訪問壓力達(dá)到100萬pv到300萬pv的時(shí)候嫉嘀,我們看到前端web服務(wù)出現(xiàn)性能瓶頸。大量的web請求被堵塞魄揉,同時(shí)服務(wù)器的CPU剪侮、磁盤IO、帶寬都有壓力洛退。這時(shí)候我們一方面將網(wǎng)站圖片瓣俯、js、css不狮、html及應(yīng)用服務(wù)相關(guān)的文件存儲在oss中降铸,另外一方面通過CDN將靜態(tài)資源分布式緩存在各個(gè)節(jié)點(diǎn)實(shí)現(xiàn)“就近訪問”。通過將動態(tài)請求摇零、靜態(tài)請求的訪問分離(“動靜分離”)推掸,有效解決服務(wù)器在磁盤IO、帶寬方面的訪問壓力驻仅。
架構(gòu)采用CDN + ECS + OSS + RDS:
架構(gòu)分布式階段:負(fù)載均衡
當(dāng)訪問壓力達(dá)到300萬pv到500萬pv的時(shí)候谅畅,雖然“動靜分離“有效分離了靜態(tài)請求的壓力,但是動態(tài)請求的壓力已經(jīng)讓服務(wù)器”吃不消“噪服。最直觀的現(xiàn)象是毡泻,前端訪問堵塞、延遲粘优、服務(wù)器進(jìn)程增多仇味、cpu100%,并且出現(xiàn)常見502/503/504的錯(cuò)誤碼雹顺。顯然單臺web服務(wù)器已經(jīng)滿足不了需求丹墨,這里需要通過負(fù)載均衡技術(shù)增加多臺web服務(wù)器(對應(yīng)ECS可以選擇不同可用區(qū),進(jìn)一步保障高可用)嬉愧。因而告別單機(jī)的時(shí)代贩挣,轉(zhuǎn)變分布式架構(gòu)的階段。
架構(gòu)采用CDN+SLB + ECS + OSS + RDS:
架構(gòu)數(shù)據(jù)緩存階段: 數(shù)據(jù)庫緩存
當(dāng)訪問壓力達(dá)到500萬pv到1000萬pv没酣,雖然負(fù)載均衡結(jié)合多臺web服務(wù)器王财,解決了動態(tài)請求的性能壓力。但是這時(shí)候我們發(fā)現(xiàn)裕便,數(shù)據(jù)庫出現(xiàn)壓力瓶頸绒净,常見的現(xiàn)象就是RDS的連接數(shù)增加并且堵塞、CPU100%偿衰、IOPS飆升疯溺。這個(gè)時(shí)候我們通過數(shù)據(jù)庫緩存论颅,有效減少數(shù)據(jù)庫訪問壓力哎垦,進(jìn)一步提升性能囱嫩。
架構(gòu)采用CDN+SLB +ECS +OSS + 云數(shù)據(jù)庫memcache +RDS :
架構(gòu)擴(kuò)展階段:垂直擴(kuò)展
當(dāng)訪問量達(dá)到1000萬pv到5000萬pv,雖然這個(gè)時(shí)候我們可以看到通過分布式文件系統(tǒng)OSS已經(jīng)解決了文件存儲的性能問題漏设,雖然通過CDN已經(jīng)解決靜態(tài)資源訪問的性能問題墨闲。但是當(dāng)訪問壓力再次增加,這個(gè)時(shí)候web服務(wù)器和數(shù)據(jù)庫方面依舊是瓶頸郑口。在此我們通過垂直擴(kuò)展鸳碧,進(jìn)一步切分web服務(wù)器和數(shù)據(jù)庫的壓力,解決性能問題犬性。
“何為垂直擴(kuò)展瞻离,按照不同的業(yè)務(wù)(或者數(shù)據(jù)庫)切分到不同的服務(wù)器(或者數(shù)據(jù)庫)之上,這種切分稱之為垂直擴(kuò)展乒裆√桌”
垂直擴(kuò)展第一招:業(yè)務(wù)拆分
在業(yè)務(wù)層,可以把不同的功能模塊拆分到不同的服務(wù)器上面進(jìn)行單獨(dú)部署鹤耍。比如肉迫,用戶模塊、訂單模塊稿黄、商品模塊等喊衫,拆分到不同服務(wù)器上面部署。
垂直擴(kuò)展第二招:讀寫分離
在數(shù)據(jù)庫層杆怕,當(dāng)結(jié)合數(shù)據(jù)庫緩存族购,數(shù)據(jù)庫壓力還是很大的時(shí)候。我們通過讀寫分離的方式陵珍,進(jìn)一步切分及降低數(shù)據(jù)庫的壓力寝杖。
垂直擴(kuò)展第三招:分庫
結(jié)合業(yè)務(wù)拆分、讀寫分離撑教,在數(shù)據(jù)庫層朝墩,比如我們同樣可以把用戶模塊、訂單模塊伟姐、商品模塊等收苏。所涉及的數(shù)據(jù)庫表:用戶模塊表、訂單模塊表愤兵、商品模塊表等鹿霸,分別存放到不同數(shù)據(jù)庫中,如用戶模塊庫秆乳、訂單模塊庫懦鼠、商品模塊庫等钻哩。然后把不同數(shù)據(jù)庫分別部署到不同服務(wù)器中。
架構(gòu)采用CDN+SLB +ECS +OSS+ 云數(shù)據(jù)庫memcache + RDS讀寫分離:
架構(gòu)分布式+大數(shù)據(jù)階段:水平擴(kuò)展
當(dāng)訪問量達(dá)到5000萬pv及以上時(shí)肛冶,當(dāng)真真達(dá)到千萬級架構(gòu)以上訪問量的時(shí)候街氢,我們可以看到垂直擴(kuò)展的架構(gòu)也已經(jīng)開始“山窮水盡”。比如睦袖,讀寫分離僅解決讀的壓力珊肃,面對高訪問量,在數(shù)據(jù)庫“寫”的壓力上面“力不從心”馅笙,出現(xiàn)性能瓶頸伦乔。另外,分庫雖然將壓力拆分到不同數(shù)據(jù)庫中董习。但單表的數(shù)據(jù)量達(dá)到TB級別以上烈和,顯然已經(jīng)達(dá)到傳統(tǒng)關(guān)系型數(shù)據(jù)庫處理的極限。
水平擴(kuò)展第一招:增加更多的web服務(wù)器
通過業(yè)務(wù)垂直拆分分布部署在不同服務(wù)器后皿淋,當(dāng)后續(xù)壓力進(jìn)一步增大招刹,增加更多的webserver進(jìn)行水平擴(kuò)展。
水平擴(kuò)展第二招:增加更多的SLB
單臺SLB也存在單點(diǎn)故障的風(fēng)險(xiǎn)沥匈,及SLB也存在性能極限蔗喂,如QPS最大值為50000。通過DNS輪詢高帖,將請求輪詢轉(zhuǎn)發(fā)至不同可用區(qū)的SLB上面缰儿,實(shí)現(xiàn)SLB水平擴(kuò)展。
水平擴(kuò)展第三招:采用分布式緩存
雖然阿里云memcache內(nèi)存數(shù)據(jù)庫已經(jīng)是分布式結(jié)構(gòu)散址,但是同樣單一的入口也存在單點(diǎn)故障的風(fēng)險(xiǎn)可能乖阵。并且也存在性能極限,如最大吞吐量峰值為512Mbps预麸。所以我們部署多臺云數(shù)據(jù)庫memcache版瞪浸,可以在代碼層通過hash算法將數(shù)據(jù)分別緩存至不同的云數(shù)據(jù)庫memcache版中。
水平擴(kuò)展第四招:sharding + nosql
面對高并發(fā)吏祸、大數(shù)據(jù)的需求对蒲,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫已不再適合。需要采用DRDS(mysql sharding分布式解決方案) + OTS(基于列存儲的分布式數(shù)據(jù)庫)對應(yīng)的分布式數(shù)據(jù)庫來根本性的解決問題贡翘。
架構(gòu)采用CDN+DNS輪詢+SLB +ECS+OSS + 云數(shù)據(jù)庫memcache+DRDS+OTS:
我為自己帶鹽蹈矮,原創(chuàng)作者:喬銳杰