大型網(wǎng)站的性能需求
高性能、高可用、易擴展、可伸縮、安全性
大型網(wǎng)站的特點
-
高并發(fā)、大流量:大型網(wǎng)站面對的訪問量比較大很容易理解,那么何為高并發(fā)呢?
并發(fā):在操作系統(tǒng)中是指一個時間段中有幾個程序都處于已啟動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行,但任一個時刻點上只有一個程序在處理機上運行。而到我們的大型網(wǎng)站(Web應(yīng)用)中,是指在同一時刻同時有多個用戶向服務(wù)器發(fā)送請求。當(dāng)一個用戶向網(wǎng)站的服務(wù)器發(fā)送請求的時候,經(jīng)過后臺的運算將用戶想要的到的結(jié)果返回個用戶,那么如果在后臺運算結(jié)束之前又有新的用戶向服務(wù)器發(fā)送了請求,我們在后臺的程序中應(yīng)該做什么樣的處理呢。
高可用性:系統(tǒng)需要支持7×24小時都處在運行的狀態(tài),我們每周可以過周末,但是并不代表著周末沒有人訪問網(wǎng)站,因此網(wǎng)站需要支持7×24小時的服務(wù)。
用戶分布廣泛,網(wǎng)路情況復(fù)雜:例如現(xiàn)在人們購物需要用到的淘寶商城、京東商城以及我們經(jīng)常用到的百度搜索引擎,用戶分布在不同的地方;同時不同的用戶在訪問這些Web應(yīng)用時的網(wǎng)絡(luò)狀態(tài)也是不同的,有的人所處的環(huán)境網(wǎng)速比較快,有的人網(wǎng)速比較慢。
安全環(huán)境惡劣:由于互聯(lián)網(wǎng)的開放性,在全世界都可以訪問到,因此面臨的環(huán)境非常惡劣,很容易受到攻擊。
需求變更快,發(fā)布(服務(wù)器的更新)比較頻繁:互聯(lián)網(wǎng)產(chǎn)品為了滿足人們?nèi)找嬖黾拥男枨?,更新迭代的速度非??臁?/p>
漸變式發(fā)展:任何一個大的網(wǎng)站都是由小的網(wǎng)站發(fā)展起來,在發(fā)展的過程當(dāng)中功能逐漸完善,同時給用戶的體驗也逐漸改善。
需要有很好的適配性:現(xiàn)在可以聯(lián)網(wǎng)的不僅僅是電腦,智能手機普遍使用的今天可以通過不同的設(shè)備來訪問同一個網(wǎng)站,例如手機、pad以及pc機。那么此時網(wǎng)站就要做到很好的適配性,既可以在手機端展示好界面又可以在pc端展示好界面。
大型網(wǎng)站的演化路徑
明確了大型網(wǎng)站需要滿足的需求以及大型網(wǎng)站的特點,那么在構(gòu)建大型網(wǎng)站的時候就需要有一個漸變的過程,在這個漸變的過程中使網(wǎng)站的功能逐漸強大,同時其性能也逐步提高。
- 初始階段:初始階段,網(wǎng)站的用戶訪問量可能比較少,那么此時只需要一臺服務(wù)器即可。

Web應(yīng)用的組成簡介
Web應(yīng)用一般有三部分組成:1、應(yīng)用程序 2、數(shù)據(jù)庫 3、文件
Web應(yīng)用最核心的兩個部分是應(yīng)用程序和數(shù)據(jù)庫,我們訪問網(wǎng)站就是訪問的一個應(yīng)用程序
數(shù)據(jù)庫主要是用來存放應(yīng)用程序在運行的過程當(dāng)中需要用到的數(shù)據(jù),例如我們登錄淘寶網(wǎng)站
時的個人信息(用戶名、密碼、收獲地址等信息)。而文件,是應(yīng)用程序在運行過程當(dāng)中需要
讀取的文件,例如淘寶網(wǎng)站各個商品的圖片資源,都是以文件的形式存放。
Web應(yīng)用的初期,數(shù)據(jù)量比較小,同時所用到的文件也比較少,此時我們可以把三者放在同一個服務(wù)器上面。
Web服務(wù)器
Web服務(wù)器也稱www服務(wù)器,主要的功能是提供網(wǎng)上信息瀏覽服務(wù),web服務(wù)器是可以向請求的瀏覽器發(fā)送文檔的程序。Web服務(wù)器有以下幾個特點:
- 服務(wù)器是一種被動程序:只有當(dāng)Internet上的其他計算機的瀏覽器向服務(wù)器發(fā)送請求的時候,服務(wù)器才會響應(yīng)。
- 最常用的服務(wù)器是Apache和Microsoft的Internet信息服務(wù)器。
- Internet服務(wù)器是一臺在Internet上具有獨立Ip的計算機。
- Web服務(wù)器是指駐留于因特網(wǎng)上某種類型計算機的程序。
2.應(yīng)用服務(wù)器和數(shù)據(jù)服務(wù)相分離
隨著網(wǎng)站業(yè)務(wù)的發(fā)展,訪問的用戶量越來越多,網(wǎng)站的數(shù)據(jù)也隨之增多,此時如果數(shù)據(jù)庫的存儲空間不足,可能會導(dǎo)致用戶訪問網(wǎng)站的響應(yīng)速度變慢。一臺服務(wù)器已經(jīng)不能滿足需求,這是就應(yīng)該考慮將應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器以及文件服務(wù)器分離。根據(jù)各個服務(wù)器擔(dān)任的角色不同來選定各個服務(wù)器的配置:
應(yīng)用服務(wù)器需要強的CPU,數(shù)據(jù)服務(wù)器需要快速磁盤檢索和數(shù)據(jù)緩存,因此需要更快的硬盤和更大的內(nèi)存,文件服務(wù)器主要用來存放應(yīng)用中使用到的文件,需要更大的磁盤空間。
將應(yīng)用服務(wù)器、文件服務(wù)器和數(shù)據(jù)庫服務(wù)器分離之后整個應(yīng)用的部署情況如下圖所示:

當(dāng)應(yīng)用和數(shù)據(jù)進行分離之后,不同特性的服務(wù)器擔(dān)任著不同的角色,整個網(wǎng)站的性能得到提升。
3.使用緩存改善網(wǎng)站性能
網(wǎng)站數(shù)據(jù)的訪問并不是平均分配,只有一小部分的數(shù)據(jù)會經(jīng)常被訪問到。當(dāng)用戶訪問Web應(yīng)用時,Web應(yīng)用先從數(shù)據(jù)庫中查詢數(shù)據(jù)后經(jīng)過應(yīng)用程序的處理再返回給用戶,如果有一部經(jīng)常被訪問到,那么可以就這一部分是數(shù)據(jù)而言提高這部分數(shù)據(jù)的訪問速度,解決方案是將這部分數(shù)據(jù)緩存到內(nèi)存中。當(dāng)用戶訪問Web應(yīng)用時,先從緩存中進行查詢,如果緩存中有對應(yīng)的數(shù)據(jù),則直接返回,如果沒有對應(yīng)的數(shù)據(jù)再去數(shù)據(jù)庫查詢,提高數(shù)據(jù)查詢的效率。
緩存分為兩種:
1>緩存在本地 2>用專門的服務(wù)器緩存數(shù)據(jù)
如果將數(shù)據(jù)緩存在本地,那么緩存的數(shù)據(jù)量比較大的時候,緩存會和應(yīng)用程序爭用內(nèi)存,這時有可能導(dǎo)致應(yīng)用程序運行的緩慢甚至應(yīng)用服務(wù)器直接掛掉。
使用專門的服務(wù)器作為緩存,可以使用集群的方式來部署。
添加緩存服務(wù)器之后的應(yīng)用程序分布如下圖所示:

4.使用應(yīng)用服務(wù)器集群改善網(wǎng)站的并發(fā)處理能力
當(dāng)數(shù)據(jù)庫、應(yīng)用和文件服務(wù)器分離以及增加上緩存服務(wù)器之后,數(shù)據(jù)的存儲和訪問在目前這個階段已經(jīng)不是制約整個應(yīng)用的瓶頸。但是當(dāng)有大量的用戶同時訪問應(yīng)用的時候,應(yīng)用服務(wù)器就顯得力不從心,這種情況下更恰當(dāng)?shù)淖龇ㄊ菍?yīng)用進行分布式部署,而不是將現(xiàn)有的應(yīng)用服務(wù)器換成配置更高的服務(wù)器。增加應(yīng)用服務(wù)器和提現(xiàn)有應(yīng)用服務(wù)器的配置對應(yīng)用的改善作用是不相同的。
如果將應(yīng)用部署在不同的服務(wù)器上,那么現(xiàn)在面臨的一個問題就是怎么分配這幾臺服務(wù)器的流量,以及當(dāng)用戶訪問應(yīng)用的時候怎么將用戶的訪問分配到分布式服務(wù)器的其中一臺服務(wù)器上。此時,負載均衡服務(wù)器就派上了用場,負載均衡服務(wù)器的作用就是將來自用戶瀏覽器的訪問分發(fā)到應(yīng)用服務(wù)器集群中的其中任意一臺。添加負載均衡服務(wù)器、將應(yīng)用分布在不同的服務(wù)器、應(yīng)用和數(shù)據(jù)訪問相分離、添加緩存之后整個網(wǎng)站的部署如下:

5.數(shù)據(jù)庫讀寫分離
網(wǎng)站使用緩存后,數(shù)據(jù)訪問的速度有效提升,但是仍有一部分讀操作和全部的寫操作在緩存中不能完成,當(dāng)用戶達到一定的規(guī)模之后,數(shù)據(jù)庫會因為負載過大成為制約整個網(wǎng)站的瓶頸。目前絕大多數(shù)數(shù)據(jù)庫都支持主從熱備份功能(在數(shù)據(jù)庫服務(wù)不停的情況下,將主數(shù)據(jù)庫的數(shù)據(jù)備份到從數(shù)據(jù)庫),利用數(shù)據(jù)庫的這一特性,可以將數(shù)據(jù)庫的讀寫進行分離。及將一應(yīng)用的數(shù)據(jù)庫分為兩個數(shù)據(jù)庫,一個是主數(shù)據(jù)庫,用來寫操作;一個是從數(shù)據(jù)庫,用來讀操作。當(dāng)用戶將數(shù)據(jù)寫入主數(shù)據(jù)庫后,主數(shù)據(jù)庫將數(shù)據(jù)備份到從數(shù)據(jù)庫,從而實現(xiàn)兩個數(shù)據(jù)庫的數(shù)據(jù)一致性。
添加主從數(shù)據(jù)庫之后網(wǎng)站的結(jié)構(gòu)如下:

6.使用分布式文件系統(tǒng)和分布式數(shù)據(jù)庫系統(tǒng)
任何強大的單一服務(wù)器都滿足不了大型網(wǎng)站持續(xù)增長的業(yè)務(wù)需求,數(shù)據(jù)庫經(jīng)過讀寫分離后拆分成兩臺服務(wù)器,但是隨著網(wǎng)站業(yè)務(wù)的發(fā)展并不能滿足網(wǎng)站的需求,這是可以將數(shù)據(jù)庫部署為分布式數(shù)據(jù)庫。分布式數(shù)據(jù)庫是數(shù)據(jù)庫拆分的最后階段,只有當(dāng)單表的數(shù)據(jù)量特別大時才使用這種方式。數(shù)據(jù)庫的分布式部署并不是沒有依據(jù),而是根據(jù)網(wǎng)站的業(yè)務(wù)模塊進行拆分,將一個模塊的數(shù)據(jù)存放到某個數(shù)據(jù)庫中,這樣訪問不同模塊時,應(yīng)用可以訪問不同的數(shù)據(jù)庫。
使用分布式文件和分布式數(shù)據(jù)庫之后的系統(tǒng)結(jié)構(gòu):

7.使用NoSQL和搜索引擎
現(xiàn)在使用的數(shù)據(jù)庫都是關(guān)系型數(shù)據(jù)庫,關(guān)系型數(shù)據(jù)庫每條記錄和程序都有對應(yīng)關(guān)系,關(guān)系型數(shù)據(jù)庫存儲的時候?qū)⒔M成字段相同的一條記錄存放在同一個表中。隨著數(shù)據(jù)庫的發(fā)展,出現(xiàn)了非關(guān)系型數(shù)據(jù)庫,NoSQL(Not Only SQL),非關(guān)系型數(shù)據(jù)庫采用鍵值對的形式存放數(shù)據(jù),少了關(guān)系型數(shù)據(jù)庫的約束,查詢起來比較方便和快速。同時有更快的查詢技術(shù)搜索引擎。
如果系統(tǒng)的數(shù)據(jù)非常多,單表中的數(shù)據(jù)非常多,此時查詢數(shù)據(jù)如果查詢?nèi)砭蜁浅B榱颂岣卟樵兊男士梢栽趹?yīng)用中引入非關(guān)系型數(shù)據(jù)庫和搜索引擎。引入非關(guān)系型數(shù)據(jù)庫和搜索引擎之后的應(yīng)用結(jié)構(gòu)如下:

8.業(yè)務(wù)拆分
當(dāng)網(wǎng)站的業(yè)務(wù)邏輯比較多的時候,如果將不同的業(yè)務(wù)模塊都放在一個應(yīng)用中,此時應(yīng)用的負載比較大,如果將不同的業(yè)務(wù)部署在不同的服務(wù)器上,當(dāng)用戶訪問網(wǎng)站頁面中不同的模塊時,頁面將請求分發(fā)到不同的應(yīng)用上,這樣可以減小單個應(yīng)用的壓力,提高網(wǎng)站的響應(yīng)速度。應(yīng)用和應(yīng)用之間通過一個超鏈接建立關(guān)系,也可以通過消息隊列進行數(shù)據(jù)分發(fā)來構(gòu)成一個完整的應(yīng)用系統(tǒng)。
將整個應(yīng)用進行業(yè)務(wù)拆分并將不同的業(yè)務(wù)部署到不同的服務(wù)器上之后,構(gòu)成了以下的網(wǎng)站結(jié)構(gòu):

讀后感:
通過第一篇章,了解了大型網(wǎng)站由小變大的一個過程,從原理方面了解了大型項目的整體架構(gòu),以及在每個不同的階段制約整個應(yīng)用的瓶頸。同時也可以當(dāng)作自己一個進階的路徑,現(xiàn)在的大型項目不一定都是采用這種架構(gòu),但是原理相通。在這些環(huán)節(jié)中,哪個堤防薄弱可以在哪些地方多下功夫,畢竟,互聯(lián)網(wǎng)應(yīng)用以后都朝著這個方向發(fā)展!