10張圖帶你瞭解後臺服務架構演變

題圖:by thefolkpr0ject from Instagram

上篇文章講了一些高併發相關的知識,相信大家對高併發有些簡單的認識。說到高併發,往往離不開分佈式系統。人們經常將兩者拿來一起討論,因爲高併發(High Concurrency)是互聯網分佈式系統架構設計中必須考慮的因素之一。可以這麼說,目前應用商城上很多社交應用,網絡遊戲的後臺服務都是分佈式服務。那具體什麼催生出今天的分佈式系統呢?文章的主要內容是講講大型網站的服務架構演變。

01

初始階段的網站架構

在互聯網展露出萌芽的網絡時代,網站基本都是小型網站。網站的訪客也不是很多,通常會將應用程序、數據庫、文件等所有資源都在一臺服務器上。這裏爲 Java Web 服務爲例。網站開發者可以使用 Tomcat 等 Web 容器直接運行 JSP 程序,然後將數據存儲到數據庫,文件直接存放到服務器的磁盤中。就像這樣子:

02

應用服務和數據分離

隨着網站業務的發展和用戶量的增加,一臺服務器就無法再滿足需求了。大量用戶訪問導致訪問速度越來越慢,而逐漸增加的數據也會導致存儲空間不足。這時需要將 Web 應用和數據分離,分別將存放到不同的服務器:應用服務器、文件服務器和數據庫服務器。這樣不僅提高了單臺機器的負載能力,也提高了容災能力。

03

使用緩存改善網站性能

隨着用戶再增加,網站又會一次面臨挑戰:數據庫壓力太大導致整站訪問效率再此下降,用戶體驗受到影響。

一個網站往往 80% 的業務訪問集中在 20% 的數據上。那麼將這一小部分頻繁讀取的數據先提前緩存在內存中,而不是每次都去數據庫讀取。這樣就可以減少數據庫的訪問壓力,從而提高整個網站的訪問速度。

緩存分爲本地緩存和分佈式緩存服務器,前者更快但容量有限,後者理論上容量可以無限伸縮。

04

使用集羣改善併發處理能力

使用緩存後,數據訪問壓力得到了緩解.但是單一應用服務器能夠處理的請求連接有限,在網站訪問高峯期,應用服務器就成了整個網站的效率瓶頸。因此使用負載均衡處理器勢在必然。通過負載均衡調度服務器,可將來自瀏覽器的訪問請求分發到應用的集羣中的任何一臺服務器上。使用服務器集羣也有個好處,Web 應用程序更新可以做到用戶無感知。

大部分應用使用軟件來實現負載均衡。常見的軟件有 Nginx 等。

05

數據庫讀寫分離

當用戶達到一定規模後,數據庫因爲負載壓力過高而成爲網站的瓶頸。雖然前面使用緩存能滿足查詢的需求,但是大部分數據操作還是需要通過數據庫來完成。而目前主流的數據庫都提供主從熱備功能,通過配置兩臺數據庫主從關係,可以將一臺數據庫的數據更新同步到另一臺服務器上。網站利用數據庫這一功能實現數據庫讀寫分離,從而改善數據庫負載壓力。

應用服務器在寫數據的時候,訪問主數據庫,主數據庫通過主從複製機制將數據更新同步到從數據庫,這樣當應用服務器讀數據的時候,就可以通過從數據庫獲得數據。爲了便於應用程序訪問讀寫分離後的數據庫,通常在應用服務器端使用專門的數據訪問模塊,使數據庫讀寫分離對應用透明。

06

反向代理和 CDN 加速

隨着網站名氣越多越大,用戶規模越來越大,網站業務也隨着繼續壯大。爲了滿足不同地區的用戶快速訪問網站的需求,需要提高網站的訪問速度。主要手段有使用 CDN 和反向代理。

同時 Ajax 技術的出現,Web 應用會將數據(內容和圖片)和頁面框架(指 HTML 文件以及其中的標籤)。頁面框架內容存放到 CDN 服務器上,數據存放到數據庫服務器上。當用戶使用瀏覽器訪問網站,會顯示頁面框架,然後頁面框架發起 HTTP 請求加載數據。

而反向代理是部署在網站的中心機房,當用戶請求到達中心機房後,首先訪問的反向代理,如果反向代理緩存着用戶請求的資源,則直接返回給用戶。

因此,CDN 和反向代理的基本原理都是緩存

07

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

任何強大的單一服務器都滿足不了大型網站持續增長的業務需求。

分佈式數據庫時網站數據庫拆分的最後手段,只用在單表數據規模非常大的時候才使用。不到不得已時,網站更常用的數據庫拆分手段是業務拆分,將不同業務的數據部署在不同的物理服務器上。

08

使用NoSQL和搜索引擎

隨着網站業務越來越複雜,對數據存儲和檢索的需求也越來越複雜。網站需要採用一些非關係數據庫技術如 NoSQL 數據庫和非數據庫查詢技術如搜索引擎。而常見的 NoSQL 數據庫有 Mongodb、HBase等。

09

業務拆分

大型網站爲了應對日益複雜的業務場景,通過使用分而治之的手段將真個網站業務拆分成不同的產品線。如大型購物交易網站都會將首頁、商鋪、訂單、買家、賣家等拆分成不同的產品線,分歸不同的業務團隊負責。

10

分佈式服務

隨着業務拆分越來越小,存儲系統越來越龐大,應用系統的整體複雜度呈指數級增加,部署維護越來越困難。

既然每一個應用系統都需要執行許多相同的業務操作,比如用戶管理、商品管理等,那麼可以將這些共用的業務提取出來,獨立部署。由這些可複用的業務連接數據庫,提供共用業務服務,而應用系統只需要管理用戶界面,通過分佈式服務調用共用業務服務完成具體業務操作。

大型網站的架構演化到這裏,基本上大多數的技術問題都可以得以解決了。

本文本分內容以及圖片參考書籍《大型網站技術架構:核心原理與案例分析》作者: 李智慧。

如果你覺得文章還不錯,請大家點贊分享下。你的肯定是我最大的鼓勵和支持。

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