王 康
(沈陽師范大學(xué)科信軟件學(xué)院,遼寧沈陽110034)
在當(dāng)今這樣高速和大數(shù)據(jù)的互聯(lián)網(wǎng)時代,每個企業(yè)都希望以最節(jié)約成本、最簡單的方式來建設(shè)企業(yè)網(wǎng)站,而合理的規(guī)劃網(wǎng)站架構(gòu)是保證網(wǎng)站正常運(yùn)營的基礎(chǔ),因此我們需要一個高性能、高可用以及高穩(wěn)定性的網(wǎng)站架構(gòu)。
通常情況下,公司網(wǎng)站需要提供如下服務(wù),包括:圖片上傳下載、文件上傳下載、Web頁面訪問、數(shù)據(jù)庫訪問、應(yīng)用服務(wù)和日志等,這些服務(wù)往往由一臺或者多臺服務(wù)器提供,另外為了保證服務(wù)器的穩(wěn)定運(yùn)行,還要考慮加入必要的容錯機(jī)制,如數(shù)據(jù)庫的備份、等,服務(wù)器越少,硬件成本越低,但服務(wù)器壓力增大,性能降低,維護(hù)成本會升高。服務(wù)器劃分的過細(xì),雖能提升網(wǎng)站性能,但服務(wù)器間協(xié)同工作開發(fā)成本提高,硬件成本也會增加。因此,各公司都試圖從軟架構(gòu)和硬架構(gòu)上進(jìn)行了最大限度的改造,設(shè)計(jì)能夠很好的與自身的業(yè)務(wù)吻合,最大限度的提供高性能的服務(wù)架構(gòu)。
綜合考慮以上問題,本文結(jié)合中小型企業(yè)網(wǎng)站自身特點(diǎn),提出一套能滿足中小型企業(yè)網(wǎng)站業(yè)務(wù)需求、并且能最大限度的提供高性能、低成本的服務(wù)器架構(gòu)。
中小型企業(yè)網(wǎng)站具有以下特點(diǎn):
(1)應(yīng)用簡單,中小型企業(yè)網(wǎng)站通常以Web應(yīng)用為主,配合獨(dú)立的數(shù)據(jù)存儲。
(2)訪問內(nèi)容重復(fù)性高,每個用戶訪問的幾乎都是一樣的數(shù)據(jù),而且短時間內(nèi)變化不大。
(3)訪問時間集中,用戶訪問都集中在某一個時間段,所以需要一定的容錯機(jī)制和高負(fù)載性。
(4)日均訪問量都在百萬PV以下。
針對中小企業(yè)網(wǎng)站所具有的特點(diǎn),提出以下幾點(diǎn)解決方案:
(1)Web服務(wù)器與數(shù)據(jù)庫服務(wù)器分離,這樣做一方面降低磁盤IO,可以減緩Web服務(wù)器也可以提高數(shù)據(jù)庫服務(wù)器性能,另外,數(shù)據(jù)庫服務(wù)器對內(nèi)網(wǎng)使用,提高安全性能。
(2)提供緩存機(jī)制,對網(wǎng)站中包含的靜態(tài)的公共數(shù)據(jù)進(jìn)行緩存,而對需要實(shí)時更新的網(wǎng)站內(nèi)容不進(jìn)行緩存,減少磁盤IO的次數(shù),同時提高網(wǎng)站性能。
(3)對于一個網(wǎng)站來說,查詢靜態(tài)資源的量顯然多與動態(tài)頁面的量,網(wǎng)站最影響性能的地方就在于靜態(tài)文件的處理,從提升網(wǎng)站性能的角度考慮,靜態(tài)資源不應(yīng)和應(yīng)用服務(wù)器放在一起,可以使用反向代理分離靜態(tài)資源與動態(tài)頁面。
(4)為保證Web服務(wù)穩(wěn)定性,采用雙應(yīng)用服務(wù)器,并且把session管理放到內(nèi)存數(shù)據(jù)庫進(jìn)行管理,分擔(dān)一部分應(yīng)用服務(wù)器壓力,從而提升服務(wù)器的處理性能。
(5)后端數(shù)據(jù)庫采用主從雙機(jī)熱備數(shù)據(jù)庫配置,保障兩臺數(shù)據(jù)庫的數(shù)據(jù)一致,以保護(hù)企業(yè)數(shù)據(jù)結(jié)構(gòu)不受故障、災(zāi)難、錯誤和崩潰的影響,當(dāng)出現(xiàn)主庫數(shù)據(jù)異常情況時,備庫隨時可用.
服務(wù)器框架設(shè)計(jì)如圖1。
該框架分為三層:負(fù)載均衡層、應(yīng)用服務(wù)層、數(shù)據(jù)存儲層。
(1)負(fù)載均衡層由兩部分組成,Squid作為負(fù)載均衡的第一層,Web程序本身訪問量最大的是一些靜態(tài)文件(JS、CSS、圖片文件等),幾乎占了半數(shù)以上的訪問請求,因此最前端使用Squid完成靜態(tài)資源緩存,Squid自身支持多重緩存策略:最少近來使用(LRU),貪婪對偶大小次數(shù)(GDSF)和動態(tài)衰老最少經(jīng)常使用(LFUDA),使用Squid可以有效降低磁盤I/O次數(shù),縮短響應(yīng)時間,提升Web服務(wù)性能。
Nginx作為負(fù)載均衡的第二層,用來處理一些靜態(tài)文件,能夠大量減少應(yīng)用服務(wù)器的壓力,讓應(yīng)用服務(wù)器僅僅只作為一個處理業(yè)務(wù)的容器,職責(zé)單一化。通過負(fù)載均衡這兩層的過濾,大量請求都被Squid和Nginx攔截下,使得后面的業(yè)務(wù)層可以專注完成實(shí)際業(yè)務(wù)處理,從而有效提高服務(wù)器性能。另外,Squid和Nginx誰作為負(fù)載均衡第一層都可以,用戶可根據(jù)實(shí)際情況作為調(diào)整。
(2)應(yīng)用服務(wù)層,用來處理一些動態(tài)的業(yè)務(wù)邏輯,這里以Tomcat服務(wù)器為例,一個Tomcat已經(jīng)足夠應(yīng)對中小型企業(yè)的用戶訪問量,經(jīng)過一些嘗試,在每分鐘訪問量在4000左右PV的情況下,到達(dá)Tomcat的請求量最多也就上百左右。
從實(shí)踐經(jīng)驗(yàn)來說,應(yīng)用服務(wù)器常常因?yàn)橐恍┥壓筒环€(wěn)定功能,導(dǎo)致Tomcat在運(yùn)行一段時間后服務(wù)掛掉的情況,應(yīng)用服務(wù)器在進(jìn)行大量計(jì)算的時候需要占有更多的CPU,導(dǎo)致響應(yīng)慢和內(nèi)存不足的多種情況,同時多個用戶的登錄也會給應(yīng)用服務(wù)器內(nèi)存產(chǎn)生一部分的內(nèi)存壓力。針對這一情況,可以采用多個應(yīng)用服務(wù)器去處理業(yè)務(wù),并且把Session的管理從應(yīng)用服務(wù)器中分離出來,讓多個應(yīng)用服務(wù)器去處理業(yè)務(wù),并且采用單獨(dú)的Redis內(nèi)存數(shù)據(jù)庫去進(jìn)行管理和連接多個應(yīng)用服務(wù)器。
(3)數(shù)據(jù)存儲層,為保證數(shù)據(jù)的完整性、防止數(shù)據(jù)丟失,采用主、從數(shù)據(jù)庫服務(wù)器的設(shè)計(jì)方式,雙機(jī)熱備的這種方式主要是通過主機(jī),把數(shù)據(jù)復(fù)制到相應(yīng)的其他從服務(wù)器上去(Slaves)。主服務(wù)器將更新寫進(jìn)二進(jìn)制日志文件中,并且維護(hù)文件的一個索引,Slaves連接上主服務(wù)器(Master)從服務(wù)器在日志中讀取最后一次更新的位置,當(dāng)主服務(wù)器掛掉的時候能夠進(jìn)行切換。
MySQL是通過對數(shù)據(jù)的復(fù)制來保證數(shù)據(jù)的統(tǒng)一性,如圖2所示。
整體來說,MySQL的復(fù)制分為三個步驟:
(1)Master將改變記錄到二進(jìn)制日志(binary log)中。
(2)Slave將master的binary log events拷貝到它的中繼日志(relay log)。
(3)Slave重做中繼日志中的事件,將改變反映它自己的數(shù)據(jù)。
圖2
針對與中小型企業(yè)來說,該套系統(tǒng)能夠輕松的應(yīng)對日均百萬的PV訪問量,但是也存在著不足的地方,前端過于單薄,需要把靜態(tài)文件放到單獨(dú)的文件服務(wù)器上去,同時一旦最前端掛掉,會導(dǎo)致整個系統(tǒng)的奔潰。但是基于中小型企業(yè)的用戶量來說卻是足夠的,不用擔(dān)心該問題。
[1]http://bbs.nanjimao.com/thread-855-1-1.html 2011-9-8 15:11:57[OL].
[2]http://www.open-open.com/doc/view/1439 c1052 f4 c4851 bf48 fdd1 f7e7bb1d.[OL].
[3]http://blog.csdn.net/maikforever/article/details/11085615)2013-09-04,17:54.
[4]http://blog.csdn.net/lk519186921/article/details/7057492)2011-12-09 16:09
[5]威萊尼奧斯.Linux集群體系結(jié)構(gòu)[M].馬朝暉,譯.機(jī)械工業(yè)出版社,2003:50-58.