黎雪 王芳



隨著移動(dòng)互聯(lián)網(wǎng)、云計(jì)算和大數(shù)據(jù)的不斷成熟,網(wǎng)站開發(fā)相關(guān)的技術(shù)已經(jīng)細(xì)分到了各個(gè)方面,采用的技術(shù)也豐富多樣。開發(fā)一個(gè)大規(guī)模高并發(fā)的網(wǎng)站,解決方案可以集中在這樣幾個(gè)環(huán)節(jié):使用高性能的服務(wù)器、高性能的數(shù)據(jù)庫(kù)、高效率的編程語(yǔ)言、高性能的Web容器以及高可靠性的防火墻。這些方案在一定程度上意味著從硬件設(shè)備到軟件都需要更大的投入。而云計(jì)算的興起正好解決了這個(gè)問題,使用者可以按需從可配置的資源池中獲取資源,如網(wǎng)絡(luò)、服務(wù)器、存儲(chǔ)資源、防火墻和應(yīng)用程序等,資源可以快速通過Internet供給和釋放,讓使用者的工作量和使用成本降低至最少。本文對(duì)如何快速搭建一個(gè)大規(guī)模高并發(fā)網(wǎng)站以及開發(fā)過程中需要使用的云計(jì)算服務(wù)進(jìn)行了簡(jiǎn)要介紹。
大型網(wǎng)站都是從小型網(wǎng)站發(fā)展起來的,網(wǎng)站架構(gòu)也是一樣。初期,訪問量小,只需要一臺(tái)服務(wù)器,隨著業(yè)務(wù)的發(fā)展,服務(wù)器存儲(chǔ)空間不足只能將應(yīng)用和數(shù)據(jù)分離。網(wǎng)站訪問特點(diǎn)是大部分的瀏覽都只會(huì)集中在一小部分?jǐn)?shù)據(jù)上,理論上把這些數(shù)據(jù)緩存在內(nèi)存中,就可提高訪問速度。但是單一服務(wù)器能處理的訪問有限,在訪問的高峰期,服務(wù)器還是會(huì)成為網(wǎng)站的瓶頸。如果使用集群來解決高并發(fā)的問題,只要不是能彈性擴(kuò)展的服務(wù)器,都滿足不了網(wǎng)站持續(xù)增長(zhǎng)的業(yè)務(wù),此外,不同地區(qū)的用戶訪問速度也有差別。為了留住因訪問延遲而可能流失用戶,網(wǎng)站需要更快的訪問速度,這種情況可以使用CDN,讓數(shù)據(jù)盡快返回給用戶。大型網(wǎng)站發(fā)展到這里,任何單一服務(wù)器都滿足不了持續(xù)增長(zhǎng)的業(yè)務(wù)需求,雖然基本上大多數(shù)的技術(shù)問題都可以從硬件或者軟件方面去解決,但是時(shí)間和金錢成本太高。而云計(jì)算則提供了一個(gè)良好的解決方案,幫助開發(fā)者以最高效率和最低成本輕松地開發(fā)大型網(wǎng)站。
網(wǎng)站框架分析與設(shè)計(jì)
網(wǎng)站整體架構(gòu)如圖1所示,網(wǎng)站靜態(tài)化的HTML頁(yè)面托管在Amazon s3存儲(chǔ)桶上。用戶訪問網(wǎng)站時(shí),Route 53提供高度可用且可擴(kuò)展的域名系統(tǒng)(DNS),高效地將用戶請(qǐng)求連接到AWS中的Elastic Load Balancing負(fù)載均衡器和Amazon S3存儲(chǔ)桶。當(dāng)網(wǎng)站遭遇大量的用戶請(qǐng)求時(shí),Amazon ELB負(fù)載均衡器將前端流量均衡地發(fā)放到后端服務(wù)器,實(shí)現(xiàn)負(fù)載均衡,減輕單服務(wù)器處理壓力。雖然在訪問的高峰期,服務(wù)器數(shù)量還是會(huì)成為網(wǎng)站的瓶頸,但是AWS Auto Scaling可以持續(xù)監(jiān)控Amazon EC2云服務(wù)器實(shí)例運(yùn)行狀況,確保它們以預(yù)定的性能水平運(yùn)行。出現(xiàn)需求高峰時(shí),AWS Auto Scaling可以自動(dòng)增加受限資源的容量,添加或刪除EC2實(shí)例,根據(jù)預(yù)需求自動(dòng)安排正確數(shù)量的EC2實(shí)例。同時(shí)將應(yīng)用服務(wù)和數(shù)據(jù)分離,不同特性的AWS Auto Scaling組承擔(dān)不同的服務(wù)角色,使網(wǎng)站的并發(fā)處理能力和數(shù)據(jù)存儲(chǔ)都得到改善。數(shù)據(jù)的讀寫操作都會(huì)直接訪問數(shù)據(jù)庫(kù),在網(wǎng)站到達(dá)一定規(guī)模后,也會(huì)增大數(shù)據(jù)庫(kù)的壓力,這時(shí)可以通過Amazon RDS云數(shù)據(jù)庫(kù)配置2臺(tái)數(shù)據(jù)庫(kù)搭建主從關(guān)系,將一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器的數(shù)據(jù)同步到另一臺(tái)服務(wù)器上,實(shí)現(xiàn)數(shù)據(jù)庫(kù)的讀寫分離功能,從而減輕數(shù)據(jù)庫(kù)的壓力。除此之外,為了提高訪問速度,使用Amazon CloudFront內(nèi)容分發(fā)網(wǎng)絡(luò)服務(wù),智能地將用戶流量路由到性能最好的AWS邊緣站點(diǎn)位置以提供緩存或動(dòng)態(tài)內(nèi)容。
使用Amazon S3托管靜態(tài)網(wǎng)頁(yè)
大型網(wǎng)站的靜態(tài)內(nèi)容包括HTML、CSS、JavaScript、圖像、視頻和其他文件,使用本地服務(wù)器的時(shí)候,這些靜態(tài)內(nèi)容是存儲(chǔ)在磁盤里面。隨著服務(wù)器壓力增大,每個(gè)用戶在瀏覽頁(yè)面某個(gè)圖片時(shí),都會(huì)從服務(wù)器的磁盤里面檢索圖片,如圖2所示,一旦磁盤出現(xiàn)故障,用戶就無法獲取這個(gè)圖片。因此,需要一個(gè)海量、高并發(fā)、可靠的儲(chǔ)存來存放這些靜態(tài)資源。
AWS為了滿足這種需求提供了Amazon Simple Storage Service(簡(jiǎn)稱Amazon S3),一個(gè)公開的云存儲(chǔ)服務(wù),用戶可以在Amazon S3中存儲(chǔ)對(duì)象的容量和個(gè)數(shù)不受限制。要在Amazon S3上托管靜態(tài)內(nèi)容,首先需要?jiǎng)?chuàng)建一個(gè)S3存儲(chǔ)桶,如圖3所示,將存儲(chǔ)對(duì)象上傳到存儲(chǔ)桶中同時(shí)可獲取到該對(duì)象的URL。圖片可以直接將其URL嵌入在Web網(wǎng)頁(yè)里,無需擔(dān)心并發(fā)問題,后續(xù)也可以繼續(xù)使用cloudfront服務(wù)加速分發(fā)。
使用S3服務(wù)后,網(wǎng)站的架構(gòu)也從圖2變成了圖4,用戶在訪問網(wǎng)站的靜態(tài)內(nèi)容時(shí)就不需要訪問服務(wù)器的磁盤,直接從S3獲取靜態(tài)內(nèi)容即可。
使用AWS Auto Scaling組分離應(yīng)用服務(wù)和數(shù)據(jù)
動(dòng)態(tài)內(nèi)容的部分就需要一個(gè)服務(wù)器來處理。Amazon Elastic Compute Cloud(EC2)提供了可快速啟動(dòng)和管理的虛擬計(jì)算環(huán)境(服務(wù)器),同時(shí)可對(duì)其計(jì)算、內(nèi)存、存儲(chǔ)等方面進(jìn)行調(diào)節(jié)。借助AWS Auto Scaling監(jiān)控服務(wù)器的使用率,并根據(jù)需求的變化自動(dòng)實(shí)時(shí)向資源組添加容量或從中刪除容量。
如圖5所示,網(wǎng)站每天的資源需求是不一樣的,最好可以分配充足的Amazon EC2容量,以便能始終滿足最高的需求時(shí)段(圖5中是周三)。不過,這意味著運(yùn)行的資源在一周的大部分時(shí)間內(nèi)都得不到充分利用。
上述方案,成本并未得到優(yōu)化。最優(yōu)的方案是分配較少卻剛好適量的Amazon EC2實(shí)例來降低成本。如圖6所示,當(dāng)需求上升時(shí),AWS Auto Scaling將自動(dòng)添加資源容量,當(dāng)需求下降時(shí),AWS Auto Scaling將自動(dòng)刪除多余的資源容量,節(jié)省開支,這樣才是最理想的方案。
同時(shí),為了支持業(yè)務(wù)的進(jìn)一步發(fā)展,應(yīng)該將應(yīng)用服務(wù)和數(shù)據(jù)的服務(wù)器分離管理,不同特性的服務(wù)器組承擔(dān)不同的服務(wù)角色如圖1所示,這樣可以使網(wǎng)站的并發(fā)處理能力和數(shù)據(jù)存儲(chǔ)都得到很大提升。
使用Amazon ELB分配流量
當(dāng)開啟多個(gè)EC2實(shí)例時(shí),還需要考慮如何統(tǒng)一高效地管理這些虛擬服務(wù)器,把流量合理地分發(fā)到這些虛擬服務(wù)器上。
彈性負(fù)載均衡器Elastic Load Balancing(ELB),將訪問的流量分配到多個(gè)EC2實(shí)例之間。如圖7,負(fù)載均衡器充當(dāng)在服務(wù)器前面的“交通警察”,并能夠最大限度地提高速度和容量利用率,以滿足客戶端的請(qǐng)求,并確保沒有任何服務(wù)器超負(fù)荷運(yùn)行。如果單個(gè)服務(wù)器崩潰,負(fù)載均衡器會(huì)將流量重定向到剩余的在線服務(wù)器。同時(shí),ELB可與自動(dòng)擴(kuò)展AWS Auto Scaling相集成,讓負(fù)載均衡器掛載到現(xiàn)有的Automatic Scaling組中,如圖8。掛載負(fù)載均衡器之后,當(dāng)其中有EC2運(yùn)行狀況不佳或不可用時(shí),AWS Auto Scaling將啟動(dòng)未受影響的新實(shí)例,負(fù)載均衡器會(huì)自動(dòng)開始向其發(fā)送請(qǐng)求。當(dāng)運(yùn)行恢復(fù)到正常狀態(tài)時(shí),負(fù)載均衡器和Automatic Scaling會(huì)相應(yīng)地調(diào)整并將流量重新平均分配。
使用Ainazon RDS實(shí)現(xiàn)讀寫分離
在數(shù)據(jù)庫(kù)層面實(shí)現(xiàn)高可用,通常是在軟件層面來做。例如,MySQL的主從模式(Master-Slave)能滿足需求。Amazon RDS服務(wù)可以讓用戶非常容易且方便地管理關(guān)系型數(shù)據(jù)庫(kù),使用Amazon RDS創(chuàng)建Mysql實(shí)例,利用mysql數(shù)據(jù)庫(kù)提供的主從備份的機(jī)制,實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)的熱備份。同時(shí),RDS提供了可讀副本,在創(chuàng)建數(shù)據(jù)庫(kù)實(shí)例時(shí),同時(shí)創(chuàng)建一個(gè)副本接收客戶端的讀請(qǐng)求,然后返回結(jié)果給客戶端,減輕主數(shù)據(jù)庫(kù)的負(fù)載壓力。
使用Amazon CloudFront提供緩存
Internet的統(tǒng)計(jì)表明,超過80%的用戶經(jīng)常訪問20%的網(wǎng)站內(nèi)容,因此,使用緩存服務(wù)器可以處理大部分客戶的相同請(qǐng)求,加快響應(yīng)時(shí)間。如果內(nèi)容是首次請(qǐng)求,CloudFront將從Amazon S3存儲(chǔ)桶或者EC2檢索內(nèi)容。而對(duì)于不是首次的請(qǐng)求,那么內(nèi)容已經(jīng)緩存在邊緣站點(diǎn)上,用戶再次請(qǐng)求時(shí),Cloud Front會(huì)從延遲最短的邊緣站點(diǎn)提供給用戶,無需重新檢索。
近幾年來,云計(jì)算取得了飛速的發(fā)展與翻天覆地的變化,逐漸成為信息技術(shù)產(chǎn)業(yè)發(fā)展的戰(zhàn)略重點(diǎn)。云計(jì)算與傳統(tǒng)的網(wǎng)絡(luò)應(yīng)用模式相比,其具有虛擬化、可動(dòng)態(tài)擴(kuò)展、按需使用、靈活性高、兼容性強(qiáng)、可靠性高、性價(jià)比高以及可高效擴(kuò)展應(yīng)用的優(yōu)勢(shì)。使用云計(jì)算替代傳統(tǒng)IT解決方案是大勢(shì)所趨,本文基于亞馬遜云服務(wù),實(shí)現(xiàn)負(fù)載均衡、彈性調(diào)節(jié)服務(wù)器數(shù)量,降低了數(shù)據(jù)庫(kù)壓力;同時(shí)利用CDN提供緩存,最終形成一個(gè)高并發(fā)、高可用的網(wǎng)絡(luò)架構(gòu)。