1. 程式人生 > >如何在AWS上部署千萬使用者級別服務?

如何在AWS上部署千萬使用者級別服務?

如何把一個系統從單個使用者擴充套件到千萬使用者以上呢?AWS專家Joel Williams不久前曾就此做了精彩的演講;本文針對Joel的演講內容整理而來。
圖片描述

基礎架構

AWS分佈在全球12個區域裡

  • 每個區域對應著一個地理位置,裡面含有多個Availability
    Zones(可用區)。這些區域設定在北美,南美,歐洲,中東,非洲,亞太區。
  • 每個AZ實質上是單個數據中心,儘管它們可由多個數據中心構建。
  • 每個AZ有著獨立的供電系統和網際網路連線。
  • 不同AZ之間以低延遲網路進行連線,這種快速網路可消除物理位置帶來的速度影響。
  • 每個區域含有至少兩個AZ,共計32個AZs。
  • 藉助AZ可建立高可用性的程式架構。

AWS在全球還分佈有53個偏遠區域(Edge locations)。

  • 偏遠區域的使用物件是CloudFront,這是Amazon的內容分發網路(CDN)和DNS伺服器。
  • 偏遠區域的存在使得全球使用者都可以享用低延遲網路而不論他們身在何處。建立區塊服務(Block Services)
  • Amazon透過AWS建立了大量高可用和高容錯的服務,具體的服務清單可點選這裡檢視。
  • 繳納一定的費用,你就可以在個人的應用中使用這些服務而不必為高可用性而憂心。
  • 部分服務位於一個AZ中:CloudFront, Route 53, S3, DynamoDB, Elastic Load Balancing, EFS, Lambda, SQS, SNS, SES, SWF。
  • 即使是使用單個AZ的服務,其高可用架構也是足夠強大的。

1個使用者

在這個時候,開發者=使用者。你的架構看起來是這樣的:

  • 執行單個例項,如t2.micro。你可以為你的伺服器選擇不同的CPU,記憶體,儲存裝置和網路環境。
  • 該伺服器承載了全部web任務,如:web應用,資料庫,管理器等。
  • 使用AmazonRoute 53進行DNS管理。
  • 為該例項附加一個Elastic IP地址。

那麼隨著使用者數的增加,我們需要如何進行升級改造,直至能為千萬使用者提供優質的服務呢?

優化策略

  • 採用多主機模式
  • 嘗試使用Amazon資料庫服務,如Amazon RDS(關係資料庫),Amazon DynamoDB(NoSQL資料庫),Amazon
    Redshift。
  • 逐步從SQL資料庫轉為NoSQL資料庫,特別是資料量超過5TB,你的應用對低延遲敏感的時候。
  • 使用Elastic Load Balancer(彈性負載均衡器),它可以對主機進行健康檢測以確保網路的通暢,同時可以幫助實現網路的擴充套件。

垂直升級

  • 需要更強的例項型別,例如c4.8xlarge或者m3.2xlarge。
  • 停止使用當前的伺服器,換用功能更強大的機器,如:244GB RAM,40核CPU。
  • 某些Amazon服務提供了Provisined IOPS選項以便使用者自行配置變更,這樣一來使用者可以使用類似DynamoDB的擴充套件服務。
  • 類似上面的做法就叫做垂直升級。但其有個缺點,就是一旦機器出錯,你的網站也會停止運作了。所以要儘量避免單個例項的做法。

自動擴充套件

如果你一直在為峰值負載而努力,如黑色星期五,那麼其實是在浪費金錢。

  • 更好的解決方案
  • 是按需分配,這就是Auto Scaling(自動擴充套件),在計算機群組中實現自動化的大小變更。
  • 你可以為你的容量池定義最大值和最小值。
  • CloudWatch是一個管理服務,已內建到所有的Amazon應用中。
  • CloudWatch事件會觸發擴充套件。
  • 觸發事件可以是CPU佔用率,時間延遲,網速等等。
  • 你也可以向CloudWatch匯入自定義基線,按照你的意願來觸發擴充套件。

架構分解

  • 使用SOA/微服務,使你的服務層元件化。
  • 這樣做的好處是單獨的服務可以獨立地進行擴充套件,從而大大增加了靈活性和可用性。
  • SOA是Amazon提供的重要架構元件。

避免重複勞動

  • 把精力投入到能使你的業務與眾不同的事情上。
  • Amazon提供了很多高容錯的服務。例如,排隊(SQS服務),郵件,轉碼,搜尋,資料庫,監控等等。所以類似的服務都不必再次編寫了。

使用者數>千萬+

當用戶達到千萬級別的時候,你考慮的策略應該是這樣的:

多AZs模式

  • 在不同層之間執行ELB(彈性負載平衡)。除了web層,在應用層,資料層等層裡也需要進行ELB。

能夠自動擴充套件

  • 使用面向服務的架構
  • 快取架構內和外的資料
  • 使用Amazon S3和CloudFront。S3用於儲存靜態資料,如js,CSS,影象等,具有足夠的擴充套件性。CloudFront可對資料進行快取。
  • 使用Amazon SES來進行郵件傳送。
  • 使用CloudWatch進行監控。

對資料寫入執行如下的策略:

  • 聯結 – 根據功能劃分不同的資料庫。
  • 分表 – 把一個數據集分解到多個主機上。
  • 把部分功能放到其他型別的資料庫上(NoSQL,graph等)。
  • 不斷優化你的應用和整個架構堆疊,針對瓶頸進行分析並找出解決方法。

譯者:伍梓昆:
現就職於必維集團IT資訊部,擔任IT運營主管一職。熱衷於計算機程式設計和資料庫技術。
原文連結:highscalability

(責編/夏夢竹)