大型網(wǎng)站技術架構(1)
網(wǎng)站都是從小網(wǎng)站一步一步發(fā)展為大型網(wǎng)站的,而這之中的挑戰(zhàn)主要來自于龐大的用戶、安全環(huán)境惡劣、高并發(fā)的訪問和海量的數(shù)據(jù),任何簡單的業(yè)務處理,一旦需要處理數(shù)以 P 計的數(shù)據(jù)和面對數(shù)以億計的用戶時,問題就會變的很棘手
下面我們就來說說這個演變過程:
初始階段
大型網(wǎng)站都是由小型網(wǎng)站演變而來的,網(wǎng)站架構也一樣
小型網(wǎng)站最開始沒有太多人訪問,只需要一臺服務器就綽綽有余,就像這樣:
應用程序、數(shù)據(jù)庫、文件等所有資源都在一臺服務器上,通常使用 Linux PHP MySQL Apache 就可以完成整個項目部署,然后再買個域名,租一個廉價的服務器就可以開始我們的網(wǎng)站之旅了
應用服務與數(shù)據(jù)服務分離
隨著業(yè)務的發(fā)展,逐漸的一臺服務器已經(jīng)不能滿足需求,這時我們可以將 應用與數(shù)據(jù)分離
分離之后我們使用到三臺服務器:應用服務器、文件服務器和數(shù)據(jù)庫服務器,如下所示:
對于這三臺服務器要求各不相同:
- 應用服務器 要處理大量的業(yè)務邏輯,所以需要更好更快更強大的 CPU
- 數(shù)據(jù)庫服務器 需要快速的進行磁盤檢索和數(shù)據(jù)緩存,因此需要更快的硬盤和更大的內存
- 文件服務器 需要存儲用戶上傳的文件資源,因此需要更大的硬盤存儲空間
應用與數(shù)據(jù)分離后,各個的職責變得更加專一,網(wǎng)站的性能得到進一步的提升,但隨著用戶的繼續(xù)增加,我們需要對網(wǎng)站架構進一步優(yōu)化
使用緩存改善性能
網(wǎng)站的訪問一樣遵循二八定律:80% 的業(yè)務訪問集中在 20% 的數(shù)據(jù)上面
因此我們要對這一小部分的數(shù)據(jù)進行緩存來減輕數(shù)據(jù)庫的訪問壓力,以提高整個網(wǎng)站的數(shù)據(jù)訪問速度,改善數(shù)據(jù)庫的讀寫性能
網(wǎng)站的緩存可以分為兩種:緩存在應用服務器上的本地緩存和緩存在專門的分布式緩存服務器上的遠程緩存
- 本地緩存 的訪問速度會快一些,但是受應用服務器內存限制,緩存數(shù)據(jù)量很有限,而且會出現(xiàn)內存爭用的情況
- 遠程分布式緩存 可以使用集群的方式,部署大內存的服務器作為專門的緩存服務器,可以在理論上做到不受內存容量限制的緩存服務
如下所示:
使用緩存后,數(shù)據(jù)訪問壓力得到了有效的緩解,但單一的應用服務器能夠處理的請求連接數(shù)有限,在訪問的高峰期,應用服務器又會成為網(wǎng)站性能的瓶頸
使用應用服務器集群改善網(wǎng)站并發(fā)處理能力
使用集群是網(wǎng)站解決高并發(fā),海量數(shù)據(jù)問題的常用手段,當你縱向提升到一定程度后,那就該開始橫向提升了
當一臺服務器的處理能力不足時,與其換一臺更強大的服務器,不如增加一臺服務器去分擔原有的服務器壓力。對于大型網(wǎng)站而言,無論多么強大的服務器,都滿足不了持續(xù)增長的業(yè)務需求,更高效的方式就是增加服務器來分擔壓力
對于網(wǎng)站架構而言,如果增添一臺新的服務器可以改善負載壓力,那么就可以使用同樣的方式來應對源源不斷的業(yè)務需求,從而實現(xiàn)系統(tǒng)的可伸縮性
通過負載均衡調度服務器,可以將用戶請求分發(fā)到應用服務器集群里的任何一臺服務器上,如果有更多的用戶,可以增加更多的應用服務器,使應用服務器的負載壓力不再成為網(wǎng)站的性能問題
數(shù)據(jù)庫讀寫分離
在使用了緩存后,大多數(shù)的操作不經(jīng)過數(shù)據(jù)庫訪問就能完成,但仍有一部分讀操作(緩存訪問未***,緩存過期)和所有的寫操作需要訪問數(shù)據(jù)庫,在網(wǎng)站的用戶量達到一定時,數(shù)據(jù)庫的負載問題就來了
目前大多數(shù)的數(shù)據(jù)庫都支持主從熱備份,通過配置兩臺服務器的主從關系,可以將一臺數(shù)據(jù)庫服務器的數(shù)據(jù)更新同步到另一臺,網(wǎng)站利用這一功能,實現(xiàn)數(shù)據(jù)庫讀寫分離,從而進一步改善數(shù)據(jù)庫負載壓力
應用服務器在寫操作的時候,訪問主數(shù)據(jù)庫,主數(shù)據(jù)庫通過主從復制機制把數(shù)據(jù)同步更新到從數(shù)據(jù)庫,這樣當應用服務器進行讀操作的時候,就能訪問從數(shù)據(jù)庫獲取數(shù)據(jù)
使用反向代理和 CDN 加速網(wǎng)站響應
- CDN 和 反向代理 的基本原理都是緩存
- CDN 部署在網(wǎng)絡供應商的機房,用戶在進行請求時,會從距離最近的網(wǎng)絡供應商機房獲取數(shù)據(jù)
反向代理 則部署在中心機房,當用戶請求到達中心機房后,會首先訪問反向代理服務器,如果反向代理服務器中緩存這用戶請求的資源,就直接返回給用戶
使用 CDN 和 反向代理 都是為了盡快返回給用戶數(shù)據(jù),一方面加快用戶訪問速度,另一方面也減輕了后端服務器的壓力
使用分布式文件系統(tǒng)和分布式數(shù)據(jù)庫系統(tǒng)
隨著網(wǎng)站業(yè)務的繼續(xù)發(fā)展,這時候就可以像分布式應用服務器一樣,對數(shù)據(jù)庫系統(tǒng)和文件系統(tǒng)進行分布式管理
分布式數(shù)據(jù)庫 是網(wǎng)站數(shù)據(jù)庫拆分的***手段,一般我們可以采取業(yè)務分庫,根據(jù)不同業(yè)務的數(shù)據(jù)庫部署在不同的數(shù)據(jù)庫服務器上
使用 NoSQL 和搜索引擎
這兩個方式都是依賴于互聯(lián)網(wǎng)的技術手段,應用服務器通過一個統(tǒng)一的數(shù)據(jù)訪問模塊來訪問各種數(shù)據(jù),從而減輕應用程序有多個數(shù)據(jù)源的麻煩
業(yè)務拆分
對于大型網(wǎng)站,我們可以分而治之,把整個網(wǎng)站的業(yè)務分為不同的模塊,比如大型的交易購物完整可以分為首頁、店鋪、訂單、買家等,分別交給不同的業(yè)務團隊來負責
同時我們將一個網(wǎng)站根據(jù)模塊劃分拆分成多個應用,每個應用進行單獨的部署和維護,應用之間通過超鏈接建立關系(指向不同的應用地址),***通過相同的數(shù)據(jù)存儲系統(tǒng)來構成一個互相關聯(lián)的完整系統(tǒng)
分布式服務
隨著業(yè)務拆分,整個系統(tǒng)越來越大,應用的整體復雜度呈指數(shù)級增加,部署維護越來越困難,并且所有的應用服務器都要與數(shù)據(jù)庫服務連接, 在數(shù)萬臺服務器規(guī)模的情況下,這些連接的數(shù)目是服務器規(guī)模的平方,導致資源不足
這時候就要對相同的業(yè)務進行提取,獨立部署,把這些可重用的業(yè)務和連接數(shù)據(jù)庫等,提取出來作為公共業(yè)務服務,而應用系統(tǒng)只需要通過分布式服務訪問公共業(yè)務服務完成業(yè)務操作
到這里,基本上大多數(shù)的技術問題都能得到解決,還有一些實時同步等具體業(yè)務問題也都可以通過現(xiàn)有的技術解決