黎雪 王芳



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