10張圖帶你瞭解後臺服務架構演變
目前應用商城上很多社交應用,網路遊戲的後臺服務都是分散式服務。那具體什麼催生出今天的分散式系統呢?文章的主要內容是講講大型網站的服務架構演變。
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分散式服務
隨著業務拆分越來越小,儲存系統越來越龐大,應用系統的整體複雜度呈指數級增加,部署維護越來越困難。
既然每一個應用系統都需要執行許多相同的業務操作,比如使用者管理、商品管理等,那麼可以將這些共用的業務提取出來,獨立部署。由這些可複用的業務連線資料庫,提供共用業務服務,而應用系統只需要管理使用者介面,通過分散式服務呼叫共用業務服務完成具體業務操作。
大型網站的架構演化到這裡,基本上大多數的技術問題都可以得以解決了。