支撐億級用戶的架構:從0到1演化全過程

本文從如下2個方向,對互聯網系統架構演化進行了一個綜述:sql

1.大型互聯網架構目前面臨的挑戰及其解決思路

2.大型互聯網系統架構演化過程,包含了全部的如今主要的互聯網架構的考量點、技術方案、要解決的問題等。數據庫

建議用10min閱讀,能夠了解互聯網架構的全貌。緩存

1、架構演進面臨的挑戰及解決思路安全

互聯網主要面對的技術挑戰,用一句話歸納:就是用戶不斷上升產生的併發訪問壓力以及數據存儲壓力,因此係統須要更強的處理能力才能解決這些問題。服務器

而系統處理能力提高,主要有兩種途徑:微信

1.垂直伸縮:網絡

提高單臺服務器的處理能力,好比用更快頻率的cpu,用更多核的cpu,用更大的內存,用更快的網卡,用更多的磁盤組成一臺服務器,使單臺服務器的處理能力獲得提高,經過這種手段提高系統的處理能力。架構

缺點以下:併發

a.當垂直伸縮達到必定程度之後,繼續增長計算須要花費更多的錢。負載均衡

b.垂直伸縮是有物理極限的,即便是大型機,也有本身的物理極限,它不可能無限地伸縮下去的。

c.操做系統的設計或者應用程序的設計制約着垂直伸縮,最多隻能達到一個點沒法繼續提升。

在大型互聯網出現以前,傳統的軟件,好比銀行、電信這些企業的軟件系統,主要是使用垂直伸縮這種手段實現系統能力提高的,在服務器上加強,提高服務器的硬件水平。當某種類型的服務器能力提高到了瓶頸之後,就會用更強大的服務器,好比說從服務器升級到小型機,從小型機提高到中型機,從中型機提高到大型機,服務器愈來愈強大,處理能力愈來愈強大,固然價格也愈來愈昂貴,運維愈來愈複雜。

2.水平伸縮:

單機的處理能力並不提高,也不使用更昂貴的更快的更厲害的硬件,而是經過更多的服務器,將這些服務器構成一個分佈式集羣,經過這個集羣,統一對外提供服務,以此來提升系統總體的處理能力。

水平伸縮優勢:

a.只要架構合理,可以添加服務器到集羣中,你的系統就是永遠能夠正常運行。

b.它沒有極限,它的成本也不會說到了某個臨界點就忽然增長。並且逐漸的增長服務器,得到相同的計算處理能力,只會比之前的服務器更便宜,不會更貴,由於硬件的價格老是在不斷地降低的。

c.應用程序運行在一個服務器上,是爲單一服務器而設計的,而增長服務器的話只是讓程序部署在更多的服務器上,因此也不須要對應用程序進行太多的改變,應用程序不會受到硬件制約。

在互聯網行業中多采用水平伸縮的手段。

2、大型互聯網系統架構演化過程

要讓更多的服務器構成一個總體,須要在架構上進行設計,讓這些服務器成爲總體系統中的一個部分,有效地組織起來,統一提高系統的處理能力。

圖片描述

如下將經過大型互聯網系統架構的演進過程,來詳細理解如何經過以上兩種伸縮方式逐步提高系統處理能力的。

這個過程對外看起來是一個業務演進過程,也就是用戶量不斷增加的一個過程。

實際上大型互聯網整個的技術驅動就是由於用戶量不斷地在增長,數據量不斷增長,致使併發訪問壓力持續增大,產生了一系列技術挑戰。爲了應對這個挑戰,要不斷地加強系統的技術處理能力,優化系統的架構。

最先的時候是單機系統,這時候能夠知足少許用戶的使用;

隨着數據量提高,須要進行應用服務器與數據庫分離,這個時候能夠知足萬級用戶的使用;

再而後須要經過分佈式緩存和服務器集羣提高系統性能,這時候能夠知足10萬級的用戶,以後須要進行反向代理,CDN加速還須要數據庫讀寫分離,以知足百萬用戶級的訪問;

隨着數據量爆發式增加,使用分佈式文件系統和分佈式數據庫系統,以知足千萬級用戶的訪問;

最後使用搜索引擎、NoSQL、消息隊列、分佈式服務等更復雜的技術方案,以知足億級用戶的訪問。

1.單機系統

圖片描述

在最先的時候,系統由於用戶量比較少,可能只是有限的幾個用戶,這個階段系統主要是用來驗證技術以及業務模式是否可行的,系統也不須要太複雜,有限的幾個主要功能。

開發完應用程序之後,部署在應用服務器上,一個應用訪問本身服務器上的數據庫,訪問本身服務器的文件系統,構成了一個單機系統,這個系統就能夠知足少許用戶使用了。

若是這個系統被證實是可行的,是有價值的,好用的,如Google 最先就是部署在斯坦福的實驗室裏面,給實驗室的同窗和老師使用的。這些同窗和老師使用後發現Google的搜索引擎比之前的搜索引擎(好比像Yahoo這樣的搜索引擎)要好用的多,很快這個消息就擴散出去了。整個斯坦福大學的老師同窗可能都過來訪問這個服務器。這個時候服務器就不可以承受訪問壓力了,須要進行第一次升級,數據庫與應用分離。

二、數據庫與應用程序分離

圖片描述

前面單機的時候,數據庫和應用程序是部署在一塊兒的。

進行第一次分離的時候,應用程序、數據庫、文件系統分別部署在不一樣的服務器上,從1臺服務器變成了3臺服務器,那麼相應的處理能力就提高了3倍。

這種分離幾乎是不須要花什麼技術成本的,只須要把數據庫文件系統進行遠程部署,進行遠程訪問就能夠了,這個時候的處理能力提高了3倍。

三、使用緩存改善性能

圖片描述

隨着用戶進一步的增長,更多的用戶過來訪,3臺服務器也不可以承受這樣的壓力了,那麼就須要使用緩存改善性能。

緩存主要有分佈式緩存和本地緩存兩種。

分佈式緩存能夠構成一個集羣,存儲更多的緩存數據,經過使用緩存一則應用程序不須要去訪問數據庫,由於數據庫的數據是存在磁盤上的,訪問數據庫須要花費更多的時間,而緩存中的數據只是存儲在內存中的,訪問時間更短。

另外一方面,數據庫中的數據是以原始數據的形式存在的,而緩存中的數據一般是以結果形式存在,若是說已經構建成某個對象,緩存的就是這個對象,不須要進行對象的計算,這樣就減小了計算的時間,同時也減小了CPU的壓力。

這樣無論是對計算資源的節約,仍是對訪問時間的節約,都會獲得比較大的提高。經過使用緩存能夠極大的改善性能。

四、應用服務集羣化

圖片描述

雖然經過數據庫分離和使用緩存,加快了系統的響應時間,減小了系統的計算壓力,可是隨着用戶的進一步增長,應用服務器可能會成爲瓶頸,一臺應用服務器鏈接大量的併發用戶的訪問可能會成爲一個瓶頸點,這時候就須要對應用服務器進行升級。

解決辦法就是經過負載均衡服務器,將應用服務器部署爲一個集羣,添加更多的應用服務去處理用戶的訪問。

五、數據庫讀寫分離

圖片描述

雖然經過負載均衡能夠不斷的添加應用服務器,爲更多的用戶提供系統訪問服務。可是這個時候數據庫會再一次成爲整個系統的瓶頸點。

由於大量的用戶過來訪問,他們的主要操做都須要落在數據庫上。雖然緩存能夠緩存一部分的數據庫讀操做,可是仍是有一部分讀操做在緩存中找不到,還須要訪問數據庫,並且全部的寫操做幾乎都要訪問數據庫,這時候數據庫就會成爲瓶頸。

單一的數據庫不可以承受這麼大的訪問壓力。

這時候的解決辦法就是數據庫的讀寫分離,將一個數據庫經過數據複製的方式,分裂爲兩個數據庫,主數據庫主要負責數據的寫操做,全部的寫操做都複製到從數據庫上,保證從數據庫的數據和主數據庫數據一致,而從數據庫主要提供數據的讀操做。

經過這樣一種手段,將一臺數據庫服務器水平伸縮成兩臺數據庫服務器,能夠提供更強大的數據處理能力。

六、使用反向代理和CDN加速相應

圖片描述

在對數據庫作讀寫分離之後,要想更進一步增長系統的處理能力,須要使用反向代理和CDN加速。

所謂的CDN是指距離用戶最近的一個服務器,當訪問一個互聯網應用的時候,咱們的訪問請求並非直接到達互聯網站的數據中心的,而是經過運營服務商進行數據轉發的。

那麼在進行數據轉發的時候,最好已經有咱們想要訪問的數據了,這樣就不須要訪問互聯網數據中心了。這個服務就叫作CDN服務,CDN服務就是部署在網絡運營商機房裏的離用戶最近的一個服務器,用戶請求先到這裏查詢有沒有用戶須要的數據,若是有,就從CDN直接返回,若是沒有,再經過CDN進一步訪問網站的數據中心,獲得數據後再緩存到CDN供其餘用戶訪問或下一次訪問,因此CDN的本質仍是一個緩存。

用戶請求到達網站的數據中心後,也不是直接請求應用服務器,依然是查找一次緩存,這個緩存叫作反向代理服務器。

反向代理服務器是指經過反向代理的方式代理整個網站的請求服務,先在反向代理服務器中查找是否有用戶請求的數據,若是有,就從反向代理服務器直接返回,若是沒有,再去請求應用服務器。經過這樣的CDN和反向代理兩級緩存,能夠返回絕大部分用戶請求的網絡數據,極大地減小應用服務器的負載壓力,提高服務器數據中心的處理能力,響應更多的用戶併發處理請求。

七、使用分佈式文件系統和分佈式數據庫系統

圖片描述

更進一步思考,雖然CDN和反向代理已經緩存了大量的用戶數據,返回了大量的用戶請求,可是隨着用戶量的增長,仍是有不少的用戶請求會到達數據中心。

這個時候文件系統和數據庫系統依然會成爲瓶頸點。問題變成如何解決這個瓶頸點?

解決方案主要是分佈式的文件系統和分佈式的數據庫系統。

所謂的分佈式文件系統就是經過一組服務器集羣統一對外提供文件服務。好比說像淘寶的商品圖片服務以及Facebook這樣的相冊服務天天都有大量的用戶上傳大量的圖片,那麼如何管理這些海量的文件圖片,就要使用一個分佈式的文件服務器系統。

隨着數據量逐漸增長,前面的主從數據庫也不可以承受這麼大的訪問壓力和存儲容量要求,那麼須要對數據庫作進一步水平伸縮,這個時候就使用分佈式的數據庫,經過數據分片的方式,將一張表的數據分佈在多個物理服務器上,以減小單一數據庫的服務器訪問壓力。經過這樣的手段能夠進一步的提高系統的處理能力。

八、使用消息隊列與分佈式服務
圖片描述

最後,隨着用戶量進一步增長,要想實現更強大計算處理能力,可使用的技術手段有分佈式消息隊列服務、搜索引擎和nosql,以及經過分佈式服務,將可複用的業務分離開來,部署在不一樣的服務器集羣上。

用戶量增長,除了意味着用戶對系統的訪問壓力增長,還伴隨着業務複雜度增長。使用分佈式消息隊列和分佈式的服務,主要要解決的就是業務的增長時系統的複雜度問題。隨着業務的增長,不少的業務都有一些重複的服務功能須要複用,這時候使用分佈式的服務去解決服務的複用問題。

而不一樣的服務之間不一樣的應用之間,它們的耦合關係會使得系統更加複雜,這時候使用分佈式消息隊列服務,將不一樣的應用服務器進行解耦,使它們之間的關係變得低耦合,經過消息進行鏈接,而不是服務調用的方式或者應用調用的方式進行鏈接,使服務變得更加的簡單,使系統的處理能力和擴容能力變得更加的強大。

本文總結

首先,大型互聯網系統的挑戰主要包括:高併發和大流量的請求、高可用的挑戰、海量數據的挑戰、網絡狀況複雜安全性差,以及需求快速變動發佈頻繁這樣的挑戰。

爲了應對這樣的挑戰,須要提高系統的處理能力。

處理能力提高有兩種手段,一種是垂直伸縮,一種是水平伸縮。

垂直伸縮有自身的侷限性,因此在互聯網企業中主要使用的手段是水平伸縮。水平伸縮的原理就是不斷地增長服務器以提升系統的處理能力。而如何添加新服務器,使新的服務器和原有的服務器構成一個完整的總體對外提供服務,就是互聯網架構的主要技術挑戰和技術內容。

在應對挑戰的過程當中,互聯網架構主要的應對方法,就是從單機系統到分佈式系統,經過服務器拆分的方式,從單機系統一個服務器變成不少個服務器,是整個的發展思路以及發展過程。

其中最主要的發展階段包括:

使用分佈式的緩存,提升系統的訪問特性,減小數據存儲的壓力;

使用負載均衡,提供更多的應用服務器提升系統計算處理能力;

使用分佈式存儲,提供更多的服務器,分攤數據的讀寫壓力;

以及使用微服務與異步架構,使系統變得更加低耦合,使應用業務變得更加可複用,經過這種手段支撐更強大的業務處理能力,從而支撐起一個大型網站系統架構。

以上內容摘取自拉勾

《阿里前輩的架構經》 (點綠字查看更多)

第01講(從0到億級用戶的架構演進)

主講人:李智慧,前阿里巴巴技術專家

加拉勾職場導師Amy微信:lagouandy,便可領取技術人福利包一份(內含稀缺開源代碼),爲你職場助攻​​​​​​​

相關文章
相關標籤/搜索