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