1 大型架構的演進之路

什麼狗最聰明?閒狗。

學習自:架構師的 36 項修煉

目錄

1 老人言

2 大型互聯網系統的特點

(1)高併發和大流量

(2)高可用

(3)海量的數據存儲

(4)用戶分佈廣泛,網絡情況複雜

(5) 需求變化快,發佈頻繁

3 系統處理能力提升的兩種途徑

(1) 垂直伸縮

(2) 水平伸縮

(3) 總結

4 大型互聯網架構演化進程

4.1 單機系統

4.2 緩存

4.3 反向代理和 CDN 加速

4.4 分佈式文件系統和分佈式數據庫系統

4.5 消息隊列與分佈式服務

5 總結


1 老人言

主動選擇有挑戰性的任務,而不是等着上級安排任務。

工程技術 != 科學研究,工程技術最終要服務於實際業務,是要賺錢的

2 大型互聯網系統的特點

(1)高併發和大流量

大型互聯網需要面對高併發的訪問用戶,比如在天貓“雙11”的時候,一分鐘之內,有超過一千萬的獨立用戶訪問整個天貓系統,大規模的併發用戶訪問會對系統的處理能力造成巨大的衝擊,系統必須要有足夠強的處理能力才能夠滿足。同時有這麼多用戶來訪問,產生了巨大的訪問流量,對系統的抗壓能力形成了考驗。

(2)高可用

大型互聯網系統必須要 7×24 小時不間斷地提供服務,和傳統軟件系統不同,銀行或者是電信甚至零售業,它們都有下班時間,下了班以後可以對系統進行停機維護和升級發佈,但是互聯網沒有下班時間,所以一直要保持高可用,7×24 小時永不間斷。爲了保證系統的高可用,必須要進行特別的系統架構設計。

(3)海量的數據存儲

因爲互聯網需要滿足大量的用戶使用,所以這些用戶會產生很多的數據,需要對這些數據進行重組和管理。除了用戶提交的數據,互聯網還會採集很多其它的數據,包括一些用戶行爲的數據、第三方的數據以及網絡爬蟲獲取的數據,通過大數據技術對這些數據做進一步分析,對用戶進行更精準的營銷和服務,以發現新的業務增長點。

(4)用戶分佈廣泛,網絡情況複雜

互聯網是爲全球用戶提供服務的,用戶分佈範圍廣,各地的網絡情況千差萬別,爲了使所有用戶能夠得到統一的良好的體驗,需要對系統架構進行相關的設計。

(5) 需求變化快,發佈頻繁

和傳統的軟件版本發佈頻率比,互聯網產品爲了快速適應市場,滿足用戶需求,發佈頻率是非常高的。比如 Office 這樣的產品發佈版本是以年爲單位的,而大型網站的產品發佈一般是以周爲單位的,每個星期都會發布新的版本來更新產品特性。

3 系統處理能力提升的兩種途徑

(1) 垂直伸縮

提升單臺服務器的處理能力,比如說用更快頻率、更多核的 CPU,用更大的內存,用更快的網卡,用更多的磁盤組成一臺服務器,使單臺服務器的處理能力得到提升,通過這種手段提升系統的處理能力。

(2) 水平伸縮

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

(3) 總結

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

而在互聯網行業中多采用水平伸縮的手段。這主要是因爲垂直伸縮有一些缺點。

  1. 當垂直伸縮達到一定程度以後,繼續增加計算需要花費更多的錢。如果你服務器的內存條沒有插滿,這個時候你插一條內存不會花費太多的錢。但是如果內存條已經插滿了,你想要更強大的容量、更大內存空間,就需要購買更強大的服務器對整體進行升級,這個時候就需要花更多的錢。而從服務器到小型機,到中型機,再到大型機,每一次這種硬件的升級,都意味着成本數十倍的增加。

  2. 垂直伸縮是有物理極限的。單單一臺機器的處理能力是有極限的,即使是大型機,也有自己的物理極限,它不可能無限地伸縮下去。相對於硬件的極限,互聯網的用戶需求幾乎是沒有極限的。更何況到了物聯網時代,數據產生的速度和對系統處理能力的要求更是成千上萬倍的增加。

  3. 操作系統的設計或者應用程序的設計制約着垂直伸縮。因爲垂直伸縮就意味着程序在單一服務器上運行,那麼這個程序應用以及操作系統要相應具備管理這麼龐大的計算資源的能力。要使用這些計算資源,就需要應用程序本身去管理、調度這些資源,這對應用程序以及操作系統的設計提出了極大的挑戰。並且,我們知道,應用程序的核心價值是處理業務邏輯,從而滿足用戶需求,如果應用程序裏有大量的代碼是去管理系統資源的,必然導致應用程序複雜度提高,難以開發和維護。

與之相比,水平伸縮就沒有這些問題。採用水平伸縮,只要架構合理,能夠將服務器添加到集羣中,你的系統是可以始終正常運行的。它沒有極限,成本也不會在某個臨界點突然增加。甚至,逐漸增加服務器,獲得更強的計算處理能力,還比以前的服務器更便宜,因爲硬件的價格總是在不斷下降的。

同時,你的應用程序雖然是爲單一服務器而設計的,但水平伸縮只是讓程序部署在更多的服務器上,並不需要對應用程序進行太多的改變,應用程序不會受到硬件制約。

4 大型互聯網架構演化進程

實際上驅動大型互聯網的技術發展的就是不斷增加的用戶量。數據量隨着用戶量的增加而增加,導致併發訪問壓力持續增大,產生了一系列技術挑戰。爲了應對這些挑戰,要不斷地增強系統的技術處理能力,優化系統的架構,如下圖所示。

最早的時候是單機系統,這時候可以滿足少量用戶的使用;隨着數據量提升,需要進行應用服務器與數據庫分離,這時候可以滿足萬級用戶的使用;再然後需要通過分佈式緩存和服務器集羣提升系統性能,可以滿足十萬級的用戶;之後需要進行反向代理,CDN 加速,還需要數據庫讀寫分離,以滿足百萬用戶級的訪問;隨着數據量爆發式增長,使用分佈式文件系統和分佈式數據庫系統,以滿足千萬級用戶的訪問;最後使用搜索引擎、NoSQL、消息隊列、分佈式服務等更復雜的技術方案,以滿足億級用戶的訪問。

4.1 單機系統

在最早的時候,系統因爲用戶量比較少,可能只是有限的幾個用戶,這個階段系統主要是用來驗證技術以及業務模式是否可行,系統也不需要太複雜,只需要具備有限的幾個主要功能。應用程序開發完以後,部署在應用服務器上,一個應用訪問自己服務器上的數據庫,訪問自己服務器的文件系統,如下圖所示,這就構成了一個單機系統,數據庫和應用程序部署在一起

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

4.2 緩存

進行第一次分離的時候,應用程序、數據庫、文件系統分別部署在不同的服務器上,從 1 臺服務器變成了 3 臺服務器,那麼相應的處理能力就提升了 3 倍。這種分離幾乎是不需要技術成本的,只需要把數據庫文件系統進行遠程部署和遠程訪問就可以了,這個時候的處理能力提升了 3 倍。  

然而隨着用戶進一步的增加,更多的用戶過來訪,3 臺服務器也不能夠承受這樣的壓力了,那麼就需要使用緩存改善性能,對數據庫進行讀寫分離

4.3 反向代理和 CDN 加速

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

所謂的 CDN 是指距離用戶最近的一個服務器,當訪問一個互聯網應用的時候,我們的訪問請求並不是直接到達互聯網站的數據中心的,而是通過運營服務商進行數據轉發的。那麼在進行數據轉發的時候,最好已經有我們想要訪問的數據,這樣就不需要訪問互聯網數據中心了。這個服務就叫作 CDN 服務。

CDN 服務就是部署在網絡運營商機房裏的離用戶最近的一個服務器,用戶請求先到這裏查詢有沒有用戶需要的數據,如果有,就從 CDN 直接返回,如果沒有,再通過 CDN 進一步訪問網站的數據中心,得到數據後再緩存到 CDN 供其他用戶訪問或下一次訪問,所以 CDN 的本質還是一個緩存。

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

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

4.4 分佈式文件系統和分佈式數據庫系統

雖然 CDN 和反向代理已經緩存了大量的用戶數據,返回了大量的用戶請求,但是隨着用戶量的增加,還是有很多的用戶請求會到達數據中心。這個時候文件系統和數據庫系統依然會成爲瓶頸點。

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

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

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

4.5 消息隊列與分佈式服務

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

隨着業務的增加,很多的業務都有一些重複的服務功能需要複用,這時候使用分佈式的服務去解決服務的複用問題。而不同的服務、不同的應用之間,它們的耦合關係會使得系統更加複雜,這時候使用分佈式消息隊列服務,將不同的應用服務器進行解耦,通過消息進行連接,而不是服務調用的方式或者應用調用的方式進行連接,使它們之間的關係變得低耦合,使服務變得更加簡單,使系統的處理能力和擴容能力變得更加的強大。

5 總結

最主要的發展階段包括:

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

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

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

  • 使用微服務與異步架構,使系統變得更加低耦合,使應用業務變得更加可複用,提升業務處理能力,從而支撐起一個大型網站系統架構

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章