千萬(wàn)級(jí)的注冊(cè)用戶,千萬(wàn)級(jí)的帖子,nTB級(jí)的附件,還有巨大的日訪問(wèn)量,大型網(wǎng)站采用什么系統(tǒng)架構(gòu)保證性能和穩(wěn)定性?
首先討論一下大型網(wǎng)站需要注意和考慮的問(wèn)題。
-
數(shù)據(jù)庫(kù)海量數(shù)據(jù)處理:負(fù)載量不大的情況下select、delete和update是響應(yīng)很迅速的,最多加幾個(gè)索引就
可以搞定,但千萬(wàn)級(jí)的注冊(cè)用戶和一個(gè)設(shè)計(jì)不好的多對(duì)多關(guān)系將帶來(lái)非常嚴(yán)重的性能問(wèn)題。另外在高UPDATE的情況下,更新一個(gè)聚焦索引的時(shí)間基本上是不可
忍受的。索引和更新是一對(duì)天生的冤家。
-
高并發(fā)死鎖:平時(shí)我們感覺不到,但數(shù)據(jù)庫(kù)死鎖在高并發(fā)的情況下的出現(xiàn)的概率是非常高的。
-
文件存儲(chǔ)的問(wèn)題:大型網(wǎng)站有海量圖片數(shù)據(jù)、視頻數(shù)據(jù)、文件數(shù)據(jù)等等,他們?nèi)绾未鎯?chǔ)并被有效索引?高并發(fā)的情況下IO的
瓶頸問(wèn)題會(huì)迅速顯現(xiàn)。也許用RAID和專用存貯服務(wù)器能解決眼下的問(wèn)題,但是還有個(gè)問(wèn)題就是各地的訪問(wèn)問(wèn)題,也許我們的服務(wù)器在北京,可能在云南或者新疆
的訪問(wèn)速度如何解決?如果做分布式,那么我們的文件索引以及架構(gòu)該如何規(guī)劃。
接下來(lái)討論大型網(wǎng)站的底層系統(tǒng)架構(gòu),來(lái)有效的解決上述問(wèn)題。
毋庸置疑,對(duì)于規(guī)模稍大的網(wǎng)站來(lái)說(shuō),其背后必然是一個(gè)服務(wù)器集群來(lái)提供網(wǎng)站服務(wù),例如,2004年eBay的服務(wù)器有2400臺(tái),估計(jì)現(xiàn)在更多。當(dāng)
然,數(shù)據(jù)庫(kù)也必然要和應(yīng)用服務(wù)分開,有單獨(dú)的數(shù)據(jù)庫(kù)服務(wù)器集群。對(duì)于像淘寶網(wǎng)這樣規(guī)模的網(wǎng)站而言,就是應(yīng)用也分成很多組。

下面,就從服務(wù)器操作系統(tǒng)與Web服務(wù)器、數(shù)據(jù)庫(kù)、服務(wù)器集群與負(fù)載均衡、緩存、獨(dú)立的圖片服務(wù)器、其它等幾個(gè)方面來(lái)分析大型網(wǎng)站的系統(tǒng)架構(gòu)。
服務(wù)器操作系統(tǒng)與Web服務(wù)器
最底層首先是操作系統(tǒng)。好的操作系統(tǒng)能提高好的性能、穩(wěn)定性和安全性,而這些對(duì)大型網(wǎng)站的性能、安全性和穩(wěn)定性都是至關(guān)重要的。
- 淘寶網(wǎng)(阿里巴巴): Linux操作系統(tǒng) + Web 服務(wù)器: Apache
- 新浪:FreeBSD + Web 服務(wù)器:Apache
- Yahoo:FreeBSD + Web 服務(wù)器:自己的
- Google: 部分Linux + Web 服務(wù)器:自己的
- 百度:Linux + Web 服務(wù)器: Apache
- 網(wǎng)易:Linux + Web 服務(wù)器: Apache
- eBay: Windows Server 2003/8 (大量) + Web 服務(wù)器:Microsoft IIS
- MySpace: Windows Server 2003/8 + Web 服務(wù)器:Microsoft IIS
由此可見,開源操作系統(tǒng)做Web應(yīng)用是首選已經(jīng)是一個(gè)既定事實(shí)。在開源操作系統(tǒng)中Linux和FreeBSD差不太多,很難說(shuō)哪個(gè)一定比另外一個(gè)要
優(yōu)秀很多、能夠全面的超越對(duì)手,應(yīng)該是各有所長(zhǎng)。但熟悉Linux的技術(shù)人員更多些,利于系統(tǒng)管理、優(yōu)化等,所以Linux使用更廣泛。而Windows
Server和IIS雖然有的網(wǎng)站使用,但不開源,而且需要購(gòu)買微軟的一系列應(yīng)用產(chǎn)品,限制了其使用。總之,開源操作系統(tǒng),尤其是Linux做Web應(yīng)用
是首選已經(jīng)是一個(gè)既定事實(shí)。
常用的系統(tǒng)架構(gòu)是:
- Linux + Apache + PHP + MySQL
- Linux + Apache + Java (WebSphere) +
Oracle
- Windows Server 2003/2008 + IIS + C#/ASP.NET + 數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)
因?yàn)槭乔f(wàn)人同時(shí)訪問(wèn)的網(wǎng)站,所以一般是有很多個(gè)數(shù)據(jù)庫(kù)同時(shí)工作的,說(shuō)明白一點(diǎn)就是數(shù)據(jù)庫(kù)集群和并發(fā)控制,數(shù)據(jù)分布到地理位置不同的數(shù)據(jù)中心,以免
發(fā)生斷電事故。
主流的數(shù)據(jù)庫(kù)有Sun的是MySQL和Oracle。
Oracle是一款優(yōu)秀的、廣泛采用的商業(yè)數(shù)據(jù)庫(kù)管理軟件。有很強(qiáng)大的功能和安全性,可以處理相對(duì)海量的數(shù)據(jù)。而MySQL是一款非常優(yōu)秀的開源數(shù)
據(jù)庫(kù)管理軟件,非常適合用多臺(tái)PC
Server組成多點(diǎn)的存儲(chǔ)節(jié)點(diǎn)陣列(這里我所指的不是MySQL自身提供的集群功能),每單位的數(shù)據(jù)存儲(chǔ)成本也非常的低廉。用多臺(tái)PC
Server安裝MySQL組成一個(gè)存儲(chǔ)節(jié)點(diǎn)陣列,通過(guò)MySQL自身的Replication或者應(yīng)用自身的處理,可以很好的保證容錯(cuò)(允許部分節(jié)點(diǎn)失
效),保證應(yīng)用的健壯性和可靠性。可以這么說(shuō),在關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)的選擇上,可以考慮應(yīng)用本身的情況來(lái)決定。
MySQL數(shù)據(jù)庫(kù)服務(wù)器的master-slave模式,利用數(shù)據(jù)庫(kù)服務(wù)器在主從服務(wù)器間進(jìn)行同步,應(yīng)用只把數(shù)據(jù)寫到主服務(wù)器,而讀數(shù)據(jù)時(shí)則根據(jù)負(fù)
載選擇一臺(tái)從服務(wù)器或者主服務(wù)器來(lái)讀取,將數(shù)據(jù)按不同策略劃分到不同的服務(wù)器(組)上,分散數(shù)據(jù)庫(kù)壓力。
服務(wù)器集群與負(fù)載均衡
服務(wù)器群集中每個(gè)服務(wù)結(jié)點(diǎn)運(yùn)行一個(gè)所需服務(wù)器程序的獨(dú)立拷貝,而網(wǎng)絡(luò)負(fù)載均衡則將工作負(fù)載在這些主機(jī)間進(jìn)行分配。負(fù)載均衡建立在現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)之上,
它提供了一種廉價(jià)有效的方法擴(kuò)展服務(wù)器帶寬和增加吞吐量,加強(qiáng)網(wǎng)絡(luò)數(shù)據(jù)處理能力,提高網(wǎng)絡(luò)的靈活性和可用性。它主要完成以下任務(wù):解決網(wǎng)
絡(luò)擁塞問(wèn)題,服務(wù)就近提供,實(shí)現(xiàn)地理位置無(wú)關(guān)性
;為用戶提供更好的訪問(wèn)質(zhì)量;提高服務(wù)器響應(yīng)速度;提高服務(wù)器及其他資源的利用效率;避免了網(wǎng)絡(luò)關(guān)鍵部位出現(xiàn)單點(diǎn)失效。
常用的服務(wù)器集群和數(shù)據(jù)庫(kù)集群負(fù)載均衡實(shí)現(xiàn)方法:
- Citrix NetScaler的硬件負(fù)載均衡交換機(jī)做服務(wù)器集群的負(fù)載均衡。
-
MySQL Proxy做MySQL服務(wù)器集群的負(fù)載均衡并實(shí)現(xiàn)讀寫分離。其實(shí)現(xiàn)讀寫分離的基本原理是讓主數(shù)據(jù)庫(kù)處理
事務(wù)性查詢,而從數(shù)據(jù)庫(kù)處理SELECT查詢。數(shù)據(jù)庫(kù)復(fù)制被用來(lái)把事務(wù)性查詢導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫(kù)。
-
CDN (Content Delivery Network):
幾乎在各大網(wǎng)站都有使用該技術(shù)。例如,使得你的網(wǎng)站在各省市訪問(wèn)更快,其原理是采取了分布式網(wǎng)絡(luò)緩存結(jié)構(gòu)(即國(guó)際上流行的web
cache技術(shù)),通過(guò)在現(xiàn)有的Internet中增加一層新的網(wǎng)絡(luò)架構(gòu),將網(wǎng)站的內(nèi)容發(fā)布到最接近用戶的cache服務(wù)器內(nèi),通過(guò)DNS負(fù)載均衡的技
術(shù),判斷用戶來(lái)源就近訪問(wèn)cache服務(wù)器取得所需的內(nèi)容,解決Internet網(wǎng)絡(luò)擁塞狀況,提高用戶訪問(wèn)網(wǎng)站的響應(yīng)速度,如同提供了多個(gè)分布在各地的
加速器,以達(dá)到快速、可冗余的為多個(gè)網(wǎng)站加速的目的。
緩存
眾所周知,使用緩存能有效應(yīng)對(duì)大負(fù)載,減少數(shù)據(jù)庫(kù)的壓力,并顯著提高多層應(yīng)用程序的性能,如果某個(gè)用戶多次請(qǐng)求同一資源,則可以從緩存返回該資源,
從而避免了重新從服務(wù)器或數(shù)據(jù)庫(kù)請(qǐng)求該資源而產(chǎn)生的系統(tǒng)開銷。緩存可以通過(guò)減少獲取請(qǐng)求的資源所需的時(shí)間,提高應(yīng)用程序性能。緩存還可以通過(guò)減少到服務(wù)器
的往返次數(shù),降低網(wǎng)絡(luò)通信量。盡管緩存可以提高性能,但它也增加了返回到應(yīng)用程序的資源可能變得陳舊的風(fēng)險(xiǎn)。這意味著,返回的資源可能與假設(shè)沒有使用緩存
的情況下,服務(wù)器有可能發(fā)送的資源并不完全相同(即取得“臟數(shù)據(jù)”)。
即便如此,簡(jiǎn)單的緩存策略也能大大提升網(wǎng)站性能。例如,Youtube把首頁(yè)最新的視頻列表緩存60秒,也就是說(shuō)60秒內(nèi)并發(fā)的request都是
從緩存讀取的,大大減少了數(shù)據(jù)庫(kù)壓力。再加上CDN,使得Youtube首頁(yè)的并發(fā)訪問(wèn)速度很快。
單機(jī)內(nèi)存緩存、文件緩存、數(shù)據(jù)庫(kù)緩存等的策略都是可以很簡(jiǎn)單的實(shí)現(xiàn)的,例如可以使用微軟的Caching Application
Block,但如何在集群環(huán)境中使多個(gè)緩存、多層緩存并保存同步是個(gè)重大問(wèn)題。大型網(wǎng)站一般都使用緩存服務(wù)器群,并使用多層緩存。業(yè)內(nèi)最常用的有:
-
Squid
cache,Squid服務(wù)器群,把它作為web服務(wù)器端前置cache服務(wù)器緩存相關(guān)請(qǐng)求來(lái)提高web服務(wù)器速度。Squid將大部分靜態(tài)資源(圖
片,js,css等)緩存起來(lái),直接返回給訪問(wèn)者,減少應(yīng)用服務(wù)器的負(fù)載
-
memcache,memcache服務(wù)器群,一款分布式緩存產(chǎn)品,很多大型網(wǎng)站在應(yīng)用;
它可以應(yīng)對(duì)任意多個(gè)連接,使用非阻塞的網(wǎng)絡(luò)IO。由于它的工作機(jī)制是在內(nèi)存中開辟一塊空間,然后建立一個(gè)HashTable,Memcached自管理這
些HashTable。因?yàn)橥ǔ>W(wǎng)站應(yīng)用程序中最耗費(fèi)時(shí)間的任務(wù)是數(shù)據(jù)在數(shù)據(jù)庫(kù)的檢索,而多個(gè)用戶查詢相同的SQL時(shí),數(shù)據(jù)庫(kù)壓力會(huì)增大,而通過(guò)
memcache的查詢緩存命中,數(shù)據(jù)直接從memcache內(nèi)存中取,每次緩存命中將替換到數(shù)據(jù)庫(kù)服務(wù)器的一次往返,到達(dá)數(shù)據(jù)庫(kù)服務(wù)器的請(qǐng)求更少,間接
地提高了數(shù)據(jù)庫(kù)服務(wù)器的性能,從而使應(yīng)用程序運(yùn)行得更快。它通過(guò)基于內(nèi)存緩存對(duì)象來(lái)減少數(shù)據(jù)庫(kù)查詢的方式改善網(wǎng)站系統(tǒng)的反應(yīng),其最吸引人的一個(gè)特性就是支
持分布式部署。有關(guān)memcache,以下文章可以參考:參考1,參考2,參考3官方站點(diǎn)。
-
e-Accelerator,比較特殊,PHP的緩存和加速器。是一個(gè)免費(fèi)開源的PHP加速、優(yōu)化、編譯和動(dòng)態(tài)緩存的
項(xiàng)目,它可以通過(guò)緩存PHP代碼編譯后的結(jié)果來(lái)提高PHP腳本的性能,使得一向很復(fù)雜和離我們很遠(yuǎn)的
PHP腳本編譯問(wèn)題完全得到解決。通過(guò)使用eAccelerator,可以優(yōu)化你的PHP代碼執(zhí)行速度,降低服務(wù)器負(fù)載,可以提高PHP應(yīng)用執(zhí)行速度最高
達(dá)10倍。
獨(dú)立的圖片服務(wù)器
無(wú)論從管理上,還是從性能上看,只要有可能,盡量部署獨(dú)立的圖片服務(wù)器。這幾乎成為常識(shí)了。具備獨(dú)立的圖片服務(wù)器或者服務(wù)器集群后,在 Web
服務(wù)器上就可以有針對(duì)性的進(jìn)行配置優(yōu)化。
其他
一個(gè)互聯(lián)網(wǎng)應(yīng)用,除了服務(wù)器的操作系統(tǒng),Web
Server軟件,應(yīng)用服務(wù)器軟件,數(shù)據(jù)庫(kù)軟件外,我們還會(huì)涉及到一些其他的系統(tǒng),比如一些中間件系統(tǒng)、文件存儲(chǔ)系統(tǒng)(圖片服務(wù)器,視頻服務(wù)器,管理服務(wù)
器,RSS和廣告服務(wù)器等等)、全文檢索、搜索、等等。會(huì)在以后介紹。