天天看點

【技術幹貨】阿裡雲建構千萬級别架構演變之路

【技術幹貨】阿裡雲建構千萬級别架構演變之路

本文作者:喬銳傑,現擔任上海駐雲資訊科技有限公司運維總監/架構師。曾任職過黑客講師、java軟體工程師/網站架構師、進階運維、阿裡雲架構師等職位。維護過上千台伺服器,主導過衆安保險、新華社等千萬級上雲架構。在雲端運維、分布式叢集架構等方面有着豐富的經驗。

前言

    一個好的架構是靠演變而來,而不是單純的靠設計。剛開始做架構設計,我們不可能全方位的考慮到架構的高性能、高擴充性、高安全等各方面的因素。随着業務需求越來越多、業務通路壓力越來越大,架構不斷的演變及進化,因而造就了一個成熟穩定的大型架構。如淘寶網、facebook等大型網站的架構,無不從一個小型規模架構,不斷進化及演變成為一個大型網站架構。

    随着雲計算的到來,目前已經從it時代向dt時代開始轉型。在雲端如何建構千萬級架構,本文主要結合阿裡雲最佳實踐經驗,向大家分享如何從一個小型網站逐漸演變到千萬級架構的過程。

架構原始階段:萬能的單機

    架構的最原始階段,即一台ecs伺服器搞定一切。傳統官網、論壇等應用,隻需要一台ecs。對應的web伺服器、資料庫、靜态檔案資源等,部署到一台ecs上即可。一般5萬pv到30萬pv通路量,結合核心參數調優、web應用性能參數調優、資料庫調優,基本上能夠穩定的運作。

架構采用單台ecs:

【技術幹貨】阿裡雲建構千萬級别架構演變之路

架構基礎階段:實體分離web和資料庫

    當通路壓力達到50萬pv到100萬pv的時候,部署在一台伺服器上面的web應用及資料庫等服務應用,會對伺服器的cpu/記憶體/磁盤/帶寬等系統資源進行競争。顯然單機已經出現性能瓶頸。我們将web應用和資料庫實體分離單獨部署,解決對應性能問題。這裡的架構采用ecs+rds:

【技術幹貨】阿裡雲建構千萬級别架構演變之路

架構動靜分離階段:靜态緩存 + 檔案存儲

    當通路壓力達到100萬pv到300萬pv的時候,我們看到前端web服務出現性能瓶頸。大量的web請求被堵塞,同時伺服器的cpu、磁盤io、帶寬都有壓力。這時候我們一方面将網站圖檔、js、css、html及應用服務相關的檔案存儲在oss中,另外一方面通過cdn将靜态資源分布式緩存在各個節點實作“就近通路”。通過将動态請求、靜态請求的通路分離(“動靜分離”),有效解決伺服器在磁盤io、帶寬方面的通路壓力。

架構采用cdn + ecs + oss + rds:

【技術幹貨】阿裡雲建構千萬級别架構演變之路

架構分布式階段:負載均衡

    當通路壓力達到300萬pv到500萬pv的時候,雖然“動靜分離”有效分離了靜态請求的壓力,但是動态請求的壓力已經讓伺服器“吃不消”。最直覺的現象是,前端通路堵塞、延遲、伺服器程序增多、cpu100%,并且出現常見502/503/504的錯誤碼。顯然單台web伺服器已經滿足不了需求,這裡需要通過負載均衡技術增加多台web伺服器(對應ecs可以選擇不同可用區,進一步保障高可用)。因而告别單機的時代,轉變分布式架構的階段。

架構采用cdn+slb + ecs + oss + rds:

【技術幹貨】阿裡雲建構千萬級别架構演變之路

架構資料緩存階段:資料庫緩存

    當通路壓力達到500萬pv到1000萬pv,雖然負載均衡結合多台web伺服器,解決了動态請求的性能壓力。但是這時候我們發現,資料庫出現壓力瓶頸,常見的現象就是rds的連接配接數增加并且堵塞、cpu100%、iops飙升。這個時候我們通過資料庫緩存,有效減少資料庫通路壓力,進一步提升性能。

架構采用cdn+slb +ecs +oss + 雲資料庫memcache +rds :

【技術幹貨】阿裡雲建構千萬級别架構演變之路

架構擴充階段:垂直擴充

    當通路量達到1000萬pv到5000萬pv,雖然這個時候我們可以看到通過分布式檔案系統oss已經解決了檔案存儲的性能問題,cdn也已經解決靜态資源通路的性能問題。但是當通路壓力再次增加,這個時候web伺服器和資料庫方面依舊是瓶頸。在此我們通過垂直擴充,進一步切分web伺服器和資料庫的壓力,解決性能問題。

“何為垂直擴充,按照不同的業務(或者資料庫)切分到不同的伺服器(或者資料庫)之上,這種切分稱之為垂直擴充。”

垂直擴充第一招:業務拆分

在業務層,可以把不同的功能子產品拆分到不同的伺服器上面進行單獨部署。比如,使用者子產品、訂單子產品、商品子產品等,拆分到不同伺服器上面部署。

垂直擴充第二招:讀寫分離

在資料庫層,當結合資料庫緩存,資料庫壓力還是很大的時候。我們通過讀寫分離的方式,進一步切分及降低資料庫的壓力。

垂直擴充第三招:分庫

結合業務拆分、讀寫分離,在資料庫層,比如我們同樣可以把使用者子產品、訂單子產品、商品子產品等。所涉及的資料庫表:使用者子產品表、訂單子產品表、商品子產品表等,分别存放到不同資料庫中,如使用者子產品庫、訂單子產品庫、商品子產品庫等。然後把不同資料庫分别部署到不同伺服器中。

架構采用cdn+slb +ecs +oss+ 雲資料庫memcache + rds讀寫分離:

【技術幹貨】阿裡雲建構千萬級别架構演變之路

架構分布式+大資料階段:水準擴充

    當通路量達到5000萬pv及以上時,真達到千萬級架構以上通路量的時候,我們可以看到垂直擴充的架構也已經開始“山窮水盡”。比如,讀寫分離僅解決“讀”的壓力,面對高通路量,在資料庫“寫”的壓力上面“力不從心”,出現性能瓶頸。另外,分庫雖然将壓力拆分到不同資料庫中。但單表的資料量達到tb級别以上,顯然已經達到傳統關系型資料庫處理的極限。

水準擴充第一招:增加更多的web伺服器

通過業務垂直拆分部署在不同伺服器後,當後續壓力進一步增大,增加更多的webserver進行水準擴充。

水準擴充第二招:增加更多的slb

單台slb也存在單點故障的風險,即slb也存在性能極限,如qps最大值為50000。通過dns輪詢,将請求輪詢轉發至不同可用區的slb上面,實作slb水準擴充。

水準擴充第三招:采用分布式緩存

雖然阿裡雲memcache記憶體資料庫已經是分布式結構,但是同樣單一的入口也存在單點故障的風險可能。并且也存在性能極限,如最大吞吐量峰值為512mbps。是以我們部署多台雲資料庫memcache版,可以在代碼層通過hash算法将資料分别緩存至不同的雲資料庫memcache版中。

水準擴充第四招:sharding + nosql

面對高并發、大資料的需求,傳統的關系型資料庫已不再适合。需要采用drds(mysql sharding分布式解決方案) + ots(基于列存儲的分布式資料庫)對應的分布式資料庫來根本性的解決問題。

架構采用cdn+dns輪詢 + slb + ecs + oss + 雲資料庫memcache + drds+ots:

【技術幹貨】阿裡雲建構千萬級别架構演變之路

杜絕抄襲,支援開源,我為自己呐喊,百分百原創作者:喬銳傑

好啦~本文到這裡就結束了,同時,如果喜歡我們的話就趕緊訂閱我們吧~~~每天定時推送新鮮幹貨~~~也可以關注我們的微信公衆号:架構雲專家頻道每天同步更新喲~~~