五層拆解 聽酒哥講網站架構
原創【51CTO.com獨家特稿】前言:從以前維護大型的CDN廣告網站,然后獨立做股票類的資訊網站,再到維護目前公司的電子商務網站,網站的架構或多或少的接觸了不少;很多同學或同行也在向我咨詢網站架構的事,所以我將維護過的網站架構稍為整理下,希望能給大家帶來幫助,了解網架構到底是怎么一回事。
眾所周知,大家習慣將網站分成三層:即負載均衡層、web層、數據庫層,但我根據線上的實際壓力情況,強烈建議分成五層,即硬件防護層、負載均衡層、web層、文件服務器層(圖片)、數據庫層,這樣大家理解一個簡單的網站可能更容易。理解了最基礎的網站后,再理解大型網站架構可能就更容易了。
硬件防火墻層:
這一層最重要的是安全防護,最基本的是要防止DDOS攻擊及應用層的防護等。我目前應用得比較好的是華賽的三層防火墻+天泰七層應用防火墻,具體實施案例請參考我在51cto.com的文章,這里限于篇幅我就不詳細說明了;如果成本預算不是太高的話,可考慮Juniper系統的防火墻,效果也不錯。
負載均衡層
這一層要考慮的東西其實很多,包括:
一、你考慮布署的網站到底要承受多大的并發量;
二、負載均衡層是否能穩定,存在單點故障嗎;
三、成本的考慮有時要高于技術的;
四、網絡的情況也決定了你到底要考慮哪種負載均衡器。
基于以上幾點情況,我拿實際情況分明下:
我最早之前維護的CDN廣告網站,并發長期在6000以上,所以只能考慮F5,而又要做到高可用,此時不是單F5了,所以上了二臺F5,當然成本也非常的高;公司光在F5上的投入,大約應該在60-80萬之間,相信這樣的投入,未必會被你所在公司的決策層所接受;而我后期維護及布署的證券類資訊網站,并發比較小,大約在200之間,所以我用了二臺Linux機器作的LVS+Keepalived,效果也不錯,相當穩定;而現在維護的公司的電子商務網站,并發大約在1.1K左右,初期我們其時也考慮的是LVS+Keepalived,但上上去就發現公司的網絡情況非常亂,每臺服務器至少有六七條靜態路由,lvs上上去根本就發揮不了作用,所以換上了Nginx+keepalived,我也編寫了shell監控nginx服務進程,實現真正意義上的負載高可用。這一層我總結了下,其時考慮以下幾點情況,即成本、網絡、并發、高可用。
web集群層
這一層為了避免單點故障,大家都用的是Apache、Nginx或tomcat集群,其好處也很明顯:①避免單點故障;②負載客戶端的高并發請求。Apache是LAMP架構最核心的WebServer,開源、穩定、模塊豐富是Apache的優勢。但Apache的缺點是有些臃腫,內存和CPU開銷大,性能上有損耗,不如一些輕量級的Web服務器(例如Nginx)高效,輕量級的Web服務器對于靜態文件的響應能力來說遠高于Apache服務器。而且現在根據實際的線上環境,Nginx服務器抗并發確實高于Apache,這一點張宴的博客已作了大量詳細敘述,但在Apache在高內存(>=16G)的情況下,單Apache的抗并發能力也是很強的,高于6000。我現在的做法是,如果是生級現有的以Apache作為webserver的網站,我單純只是考慮加上Nginx作負載均衡,不會動原有網站的架構;如果是架構新網站,我會采用Nginx作為webserver。
文件服務器層
這一層的作用容易被人忽視,其實現在服務器的性能都上上去了,并發情況也都被大家重視,但服務器層的壓力卻甚少有人關心,在大規劃的頻繁的訪問過程中,單NFS越來越不能滿足網站的需求了,我們有時接到用戶反映網站慢的情況,結果采用故障排查才發現,居然是NFS不堪重負,針對于這種情況,目前采用的方案有:
①可采用田逸推薦的分布式文件系統MFS(moosefs)實現存儲共享,他目前將此系統應用于遨游,線上用的東西畢竟比較有說服力;
②直接用NEC的存儲,雖然強悍,但增加了網站的實施成本及復雜度;
③用DRDB+Heartbeat+NFS組建NFS集群,效果也很穩定,但也要注意Heartbeat的腦裂問題。
數據庫層
為了更好的說明力,我這里用的網站都以電子商務和廣告網站,這些對數據庫要求嚴苛的網站來說明,這些網站對數據庫的要求是很高的,在數據庫并發、穩定及延時性方面均有要求,MySQL在性能、穩定性和功能上是首選,可以達到百萬級別的數據存儲。目前采用的方案有:
①目前多采用MySQL的主從方案,實際讀寫都采用單一服務器,服務器采用公司性能最好的服務器充當(MySQL的cluster暫時不敢用于線上環境);
②采用oracle的RAC雙機方案,在實際高并發的數據庫需求下,效果還是相當不錯。
加速緩存層
PHP的負載采用Apache集群,使用squid進行緩存,html或圖片的請求可以直接由squid返回給用戶。這一層可以根據你的網站情況來考慮,現在由于Nginx的反向代理越做越好,我們其實可以用最前端的Nginx來充當反向代理,這時的Nginx服務器,充當的作用是負載均衡器/反向代理;張宴已將其用于了生產環境,具體可參考他的相關文檔.
網站架構是一個藝術活,責任重大;系統架構師不等于系統工程師,要想從系統工程師到系統架構師,不僅需要許多多年的運維經驗和廣泛的運維知識,還需要付出大量的努力,希望大家都成為未來的系統架構師,最后祝大家工作愉快!
【51CTO.com獨家特稿,非經授權謝絕轉載!合作媒體轉載請注明原文出處及作者!】