1. 程式人生 > >常見的網站服務器架構有哪些?

常見的網站服務器架構有哪些?

servle jmx 數據庫系統 伸縮性 整理 weblogic slave 接口 物理


1. 初始階段的網站架構


一般來講,大型網站都是從小型網站發展而來,一開始的架構都比較簡單,隨著業務復雜和用戶量的激增,才開始做很多架構上的改進。當它還是小型網站的時候,沒有太多訪客,一般來講只需要一臺服務器就夠了,這時應用程序、數據庫、文件等所有資源都在一臺服務器上,網站架構如下圖所示:

技術分享

2. 應用服務和數據服務分離

隨著網站業務的發展和用戶量的增加,一臺服務器就無法再滿足需求了。大量用戶訪問導致訪問速度越來越慢,而逐漸增加的數據也會導致存儲空間不足。這時就需要將應用和數據分離,應用和數據分離後整個網站使用 3 臺服務器:應用服務器、文件服務器和數據庫服務器。這 3 臺服務器對硬件資源的要求各不相同:

  • 應用服務器業務邏輯,需要強大的CPU
  • 數據庫服務器對磁盤讀寫操作很多,需要更快的磁盤和更大的內存
  • 文件服務器存儲用戶上傳的文件,因此需要更大的磁盤空間

此時,網站系統的架構如下圖所示:

技術分享

3. 使用緩存改善網站性能

隨著用戶再增加,網站又會一次面臨挑戰:數據庫壓力太大導致整站訪問效率再此下降,用戶體驗受到影響。一個網站,往往 80% 的業務訪問集中在 20% 的數據上,比如微博請求量最多的肯定是那些千萬級粉絲的大 V 的微博,而幾乎沒有人關註的你的首頁,除了自己想起來之外根本不會被打開。既然大部分業務訪問集中在一小部分數據上,那就把這一小部分數據先提前緩存在內存中,而不是每次都去數據庫讀取,這樣就可以減少數據庫的訪問壓力,從而提高整個網站的訪問速度。

網站使用的緩存一般分為緩存到應用服務器或者緩存在專門的分布式緩存服務器。緩存到應用服務器自己的訪問速度快很多,但是受自身內存限制,往往不太適用。遠程分布式緩存使用一個集群專門負責緩存服務,當內存不夠還可以輕松得動態擴容。

技術分享


4. 使用應用服務器集群改善網站的並發處理能力

使用緩存後,數據訪問壓力得到了緩解,但是單一應用服務器能夠處理的請求連接有限,在網站訪問高峰期,應用服務器就成了整個網站的效率瓶頸。使用分布式集群是網站解決高並發、海量數據問題的常用手段。當一臺服務器的處理能力和存儲空間不足時,不要嘗試去更換更強大的服務器,對大型網站而言,多麽強大的服務器,都滿足不了網站持續增長的業務需求。這種情況下,更恰當的做法是增加一臺服務器分擔原有服務器的訪問及存儲壓力。 對網站架構而言,只要能通過增加一臺服務器的方式改善負載壓力,就可以以同樣的方式持續增加服務器不斷改善系統性能,從而實現系統的可伸縮性。應用服務器實現集群是網站可伸縮架構設計中較為簡單成熟的一種,如下圖所示:

技術分享

通過負載均衡調度服務器,可以將來自用戶瀏覽器的訪問請求分發到應用服務器集群中的任何一臺服務器上,如果有更多用戶,就在集群中加入更多的應用服務器,使應用服務器的壓力不再成為整個網站的瓶頸。




5. 數據庫讀寫分離

網站在使用緩存後,使對大部分數據讀操作訪問都可以不通過數據庫就能完成,但是仍有一部分讀操作(緩存訪問不命中、緩存過期)和全部的寫操作都需要訪問數據庫,在網站的用戶達到一定規模後,數據庫因為負載壓力過高而成為網站的瓶頸。 目前大部分的主流數據庫都提供主從熱備功能,通過配置兩臺數據庫主從關系,可以將一臺數據庫服務器的數據更新同步到另一臺服務器上。網站利用數據庫的這一功能,實現數據庫讀寫分離,從而改善數據庫負載壓力。如下圖所示:

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


技術分享

6. 使用反向代理和 CDN 加速網站響應

隨著網站業務不斷發展,用戶規模越來越大,由於中國復雜的網絡環境,不同地區的用戶訪問網站時,速度差別也極大。有研究表明,網站訪問延遲和用戶流失率正相關,網站訪問越慢,用戶越容易失去耐心而離開。為了提供更好的用戶體驗,留住用戶,網站需要加速網站訪問速度。主要手段有使用 CDN 和反向代理。如下圖所示:

技術分享

7. 使用分布式文件系統和分布式數據庫系統


任何強大的單一服務器都滿足不了大型網站持續增長的業務需求。數據庫經過讀寫分離後,從一臺服務器拆分成兩臺服務器,但是隨著網站業務的發展依然不能滿足需求,這時需要使用分布式數據庫。文件系統也一樣,需要使用分布式文件系統。如下圖所示:

技術分享

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




8. 使用 NoSQL 和搜索引擎

隨著網站業務越來越復雜,對數據存儲和檢索的需求也越來越復雜,網站需要采用一些非關系數據庫技術如 NoSQL 和非數據庫查詢技術如搜索引擎。如下圖所示:

技術分享

NoSQL 和搜索引擎都是源自互聯網的技術手段,對可伸縮的分布式特性具有更好的支持。應用服務器則通過一個統一數據訪問模塊訪問各種數據,減輕應用程序管理諸多數據源的麻煩。




9. 業務拆分

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

具體到技術上,也會根據產品線劃分,將一個網站拆分成許多不同的應用,每個應用獨立部署。應用之間可以通過一個超鏈接建立關系(在首頁上的導航鏈接每個都指向不同的應用地址),也可以通過消息隊列進行數據分發,當然最多的還是通過訪問同一個數據存儲系統來構成一個關聯的完整系統,如下圖所示:

技術分享

10. 分布式服務

隨著業務拆分越來越小,存儲系統越來越龐大,應用系統的整體復雜度呈指數級增加,部署維護越來越困難。由於所有應用要和所有數據庫系統連接,在數萬臺服務器規模的網站中,這些連接的數目是服務器規模的平方,導致數據庫連接資源不足,拒絕服務。

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


技術分享

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

整理大型網站架構必知必會的幾個服務器知識

最近看書及系統開發部署過程中的一些心得,再對照自己之前的從業經驗,很多都是聽聞而已,當然也有一些已經很熟悉,有的正在搞,有的未來希望可以著手付諸實施,留此存照。

1、負載均衡服務器

負載均衡服務器主要作用是實現某些類型服務器的規模擴展。比如對於系統前端的web服務器和後端的數據庫服務器,想通過加服務器實現N+1橫向擴展,通過多臺服務器負載分擔壓力,負載均衡必不可少。

2、web服務器

最常見,內存要求不是很高但cpu要求較高,主要用於部署各種web應用,如帶界面的web頁面、不帶界面的web服務、wcf等等。

3、緩存服務器

大中型網站,分布式緩存已是標配,緩存服務器專門用於部署分布式緩存,一般而言對內存和帶寬要求較高。

4、消息隊列服務器

隊列是系統解耦利器,也是大中型分布式系統標配,沒有隊列,業務系統很容易高度耦合,系統吞吐量也會很快遭遇瓶頸。

5、文件服務器

分布式文件系統,專門用於存儲業務系統需要的各種文件如圖片、多媒體文件等。

6、索引服務器

用於網站全文索引,搜索必備。對內存和CPU要求較高,大型網站,通常還需要支持主從備份和容錯,甚至多實例索引集群。

7、搜索服務器

通常需要部署多臺,否則查詢多了性能撐不住,對內存要求不高。有的中小型站點,索引和搜索服務器在物理和邏輯上都是同一臺服務器。

8、作業服務器

主要用於後端應用程序大批量大數據量復雜業務邏輯的定時作業,大多數互聯網公司標配,某些企業的定時調度框架是直接部署在web服務器上的,可以減少這裏的所謂作業服務器。

9、數據庫服務器

主要用於存儲和查詢數據。數據庫已是各種系統實際上的標配,內存和CPU都要求極高,網絡和硬件要求也不低。大中型網站還需要支持數據庫的主從備份和容錯,甚至多實例的數據庫集群。

通常,大中型的互聯網應用會經歷一個從單一的數據庫服務器,到Master/Slave主從服務器,再到垂直分區(分庫),然後再到水平分區(分表,sharding)的過程。而在這個過程中,Master/Slave以及分庫相對比較容易,對應用的影響也不是很大,但是分表會引起一些棘手的問題,比如不能跨越多個分區join查詢數據,如何實現DB負載等等,這個時候就需要一個通用的DAL框架來屏蔽底層數據存儲對業務邏輯的影響,使得底層數據的訪問對應用完全透明化。

10、nosql服務器

海量數據處理的興起,各種nosql產品層出不窮,nosql服務器主要用於處理海量數據,支持存儲、查詢、分片等。

web應用中,有兩個一直是不好實現橫向擴展或者由於歷史遺留問題實現代價非常大的東西,如你所知,就是:A、數據庫 B、網絡帶寬。

而某些nosql的出現很可能解決這個歷史遺留難題,現在已經有nosql產品彌補了關系型數據庫天生不支持橫向擴展的缺點,在特定場景下正在替代關系型數據庫。

Web 服務器與應用服務器的區別是什麽?

嚴格意義上Web服務器只負責處理HTTP協議,只能發送靜態頁面的內容。而JSP,ASP,PHP等動態內容需要通過CGI、FastCGI、ISAPI等接口交給其他程序去處理。這個其他程序就是應用服務器。
比如Web服務器包括Nginx,Apache,IIS等。而應用服務器包括WebLogic,JBoss等。應用服務器一般也支持HTTP協議,因此界限沒這麽清晰。但是應用服務器的HTTP協議部分僅僅是支持,一般不會做特別優化,所以很少有見Tomcat直接暴露給外面,而是和Nginx、Apache等配合,只讓Tomcat處理JSP和Servlet部分
Web服務器通常只需支持HTTP協議,單純處理頁面用的;而應用服務器提供的是客戶端可以調用的方法,需要支持EJB JNDI JMX 等J2EE API。 比如,Apache屬於Web服務器,Weblogic屬於應用服務器。 不過,現在大多數應用服務器也包含了Web服務器的功能
Web服務器一般指的是處理靜態請求或轉發http請求的服務器,而應用服務器一般是用來處理動態請求的服務器。兩者並沒有很嚴格的區別。

常見的網站服務器架構有哪些?