小型網(wǎng)站,例如個(gè)人網(wǎng)站,可以通過(guò)使用簡(jiǎn)單的HTML靜態(tài)頁(yè)面來(lái)實(shí)現(xiàn)。用一些圖片來(lái)達(dá)到美化的效果,所有的頁(yè)面都存儲(chǔ)在一個(gè)目錄中。這些網(wǎng)站對(duì)系統(tǒng)架構(gòu)和性能有著簡(jiǎn)單的要求。
但對(duì)于大型網(wǎng)站來(lái)說(shuō),所使用的技術(shù)非常廣泛,從硬件到軟件,編程語(yǔ)言、數(shù)據(jù)庫(kù)、web服務(wù)器、防火墻等領(lǐng)域都有很高的要求,這是無(wú)法與原來(lái)簡(jiǎn)單的HTML靜態(tài)網(wǎng)站相比的。大型網(wǎng)站面臨的高負(fù)載、高并發(fā)問(wèn)題是無(wú)法解決的。本文從低成本、高性能、高擴(kuò)展性的角度介紹了一些經(jīng)驗(yàn)。
一、有一個(gè)有效和可管理的CMS
對(duì)于內(nèi)容量大、更新頻繁的網(wǎng)站,我們無(wú)法全部手工實(shí)現(xiàn)一一更新,于是出現(xiàn)了我們共同的信息發(fā)布系統(tǒng)CMS。除了門戶網(wǎng)站和信息發(fā)布類網(wǎng)站,對(duì)于交互性要求較高的社區(qū)類網(wǎng)站來(lái)說(shuō),靜態(tài)也是提高性能的必要手段。這也是大量的策略,使帖子和文章在社區(qū)中實(shí)時(shí)靜態(tài),然后在有更新時(shí)重新靜態(tài)。這種策略在mop、網(wǎng)易社區(qū)等大雜燴中的運(yùn)用也是如此。
同時(shí),HTML靜態(tài)也是使用一些緩存策略的一種手段。對(duì)于系統(tǒng)中經(jīng)常使用數(shù)據(jù)庫(kù)查詢而很少更新內(nèi)容的應(yīng)用,可以考慮采用HTML靜態(tài)實(shí)現(xiàn)。
眾所周知,對(duì)于web服務(wù)器,無(wú)論是Apache、IIS還是其他容器,圖片都是消耗資源的,因此有必要將圖片與頁(yè)面分開(kāi)。這基本上是大型網(wǎng)站將采取的策略。它們都有獨(dú)立的圖片服務(wù)器,甚至有許多圖片服務(wù)器。這種架構(gòu)可以減輕服務(wù)器系統(tǒng)提供頁(yè)面訪問(wèn)請(qǐng)求的壓力,提高服務(wù)器的穩(wěn)定性,并確保系統(tǒng)不會(huì)因映像問(wèn)題而崩潰。在應(yīng)用服務(wù)器和鏡像服務(wù)器上,可以進(jìn)行不同的配置優(yōu)化,比如Apache在配置內(nèi)容類型時(shí)可以盡量少支持,加載模塊盡量少,以保證更高的系統(tǒng)消耗和執(zhí)行效率。
大型網(wǎng)站有復(fù)雜的應(yīng)用程序。這些應(yīng)用程序必須使用數(shù)據(jù)庫(kù)。面對(duì)大量的訪問(wèn),數(shù)據(jù)庫(kù)的瓶頸將很快出現(xiàn)。此時(shí),一個(gè)數(shù)據(jù)庫(kù)將無(wú)法快速滿足應(yīng)用程序的需求,因此需要使用數(shù)據(jù)庫(kù)集群或數(shù)據(jù)庫(kù)表散列。在數(shù)據(jù)庫(kù)集群方面,許多數(shù)據(jù)庫(kù)都有自己的解決方案,如Oracle和Sybase。MySQL提供的master/slave也是一個(gè)類似的解決方案。具體使用哪種數(shù)據(jù)庫(kù),請(qǐng)參考相應(yīng)的實(shí)現(xiàn)方案。
上述數(shù)據(jù)庫(kù)集群在體系結(jié)構(gòu)、成本和可擴(kuò)展性等方面會(huì)受到數(shù)據(jù)庫(kù)類型的限制,需要從應(yīng)用程序的角度考慮對(duì)系統(tǒng)體系結(jié)構(gòu)進(jìn)行改進(jìn)。數(shù)據(jù)庫(kù)表哈希是常用和有效的解決方案。我們?cè)趹?yīng)用程序中安裝業(yè)務(wù)和應(yīng)用程序或功能模塊來(lái)分離數(shù)據(jù)庫(kù)。
不同的模塊對(duì)應(yīng)不同的數(shù)據(jù)庫(kù)或表,然后根據(jù)用戶ID,按照一定的策略,如用戶表,以較小的方式散列一個(gè)頁(yè)面或函數(shù),從而以較低的成本提高系統(tǒng)的性能,具有良好的擴(kuò)展性。搜狐論壇采用這種結(jié)構(gòu),將論壇的用戶、設(shè)置、帖子等信息從數(shù)據(jù)庫(kù)中分離出來(lái),然后根據(jù)板塊和ID對(duì)數(shù)據(jù)庫(kù)和帖子、用戶表進(jìn)行哈希處理。在配置文件中簡(jiǎn)單的配置可以使系統(tǒng)增加一個(gè)低成本的數(shù)據(jù)庫(kù)來(lái)補(bǔ)充系統(tǒng)性能。
兩種基本的緩存類型。對(duì)于體系結(jié)構(gòu)的緩存,熟悉Apache的人可以知道Apache提供了自己的緩存模塊,也可以使用附加的squid模塊進(jìn)行緩存,這兩個(gè)模塊都可以有效地提高Apache的訪問(wèn)響應(yīng)能力。
對(duì)于網(wǎng)站程序開(kāi)發(fā)的緩存,Linux上提供的memorycache是一個(gè)通用的緩存接口,可以用于web開(kāi)發(fā)。例如,在Java中開(kāi)發(fā)時(shí),可以調(diào)用memorycache來(lái)緩存和共享一些數(shù)據(jù)。一些大型社區(qū)使用這種架構(gòu)。另外,在使用web語(yǔ)言進(jìn)行開(kāi)發(fā)時(shí),各種語(yǔ)言基本上都有自己的緩存模塊和方法。PHP有pear的緩存模塊,而Java則更多。網(wǎng)絡(luò)不是很熟悉,我相信是的。
圖像是提高大型網(wǎng)站性能和數(shù)據(jù)安全性的一種手段。圖像技術(shù)可以解決不同網(wǎng)絡(luò)接入商和地區(qū)帶來(lái)的用戶接入速度差異。例如,Chinanet和EduNet的差異促使許多網(wǎng)站在教育網(wǎng)絡(luò)中建立形象網(wǎng)站,數(shù)據(jù)可以定期或?qū)崟r(shí)更新。關(guān)于圖像技術(shù)的細(xì)節(jié),我在這里就不多說(shuō)了。有許多現(xiàn)成的專業(yè)解決方案體系結(jié)構(gòu)和產(chǎn)品可供選擇。還有一種廉價(jià)的方法可以通過(guò)軟件來(lái)實(shí)現(xiàn),比如Linux上的Rsync。
負(fù)載均衡將是大型網(wǎng)站解決高負(fù)載訪問(wèn)和大量并發(fā)請(qǐng)求的終解決方案。
隨著負(fù)載均衡技術(shù)多年的發(fā)展,有許多專業(yè)的服務(wù)提供商和產(chǎn)品可供選擇。我個(gè)人遇到了一些解決方案,包括兩個(gè)架構(gòu)供您參考。
硬件層4交換機(jī)層4交換機(jī)利用層3和層4分組的報(bào)頭信息,根據(jù)應(yīng)用間隔識(shí)別業(yè)務(wù)流,并將整個(gè)間隔段的業(yè)務(wù)流分配給相應(yīng)的應(yīng)用服務(wù)器進(jìn)行處理。第四層交換功能類似于虛擬IP,指向物理服務(wù)器。它傳輸?shù)姆?wù)受制于各種協(xié)議,包括HTTP、FTP、NFS、telnet或其他協(xié)議。這些服務(wù)需要基于物理服務(wù)器的復(fù)雜負(fù)載平衡算法。在IP**中,服務(wù)類型由終端TCP或UDP端口地址決定,第四層交換中的應(yīng)用范圍由源和終端IP地址、TCP和UDP端口決定。