高效穩(wěn)定的大型網(wǎng)站系統(tǒng)架構(gòu)分析
廣告:
隨著中國(guó)大型IT企業(yè)信息化速度的加快,大部分應(yīng)用的數(shù)據(jù)量和訪問(wèn)量都急劇增加,大型企業(yè)網(wǎng)站正面臨性能和高數(shù)據(jù)訪問(wèn)量的壓力,而且對(duì)存儲(chǔ)、安全以及信息檢索等等方面都提出了更高的要求。
千萬(wàn)人同時(shí)訪問(wèn)的網(wǎng)站,一般是有很多個(gè)數(shù)據(jù)庫(kù)同時(shí)工作,說(shuō)明白一點(diǎn)就是數(shù)據(jù)庫(kù)集群和并發(fā)控制,這樣的網(wǎng)站實(shí)時(shí)性也是相對(duì)的。這些網(wǎng)站都有一些共同的特點(diǎn):數(shù)據(jù)量大,在線人數(shù)多,并發(fā)請(qǐng)求多,pageview高,響應(yīng)速度快。總結(jié)了一下各個(gè)大網(wǎng)站的架構(gòu),主要提高效率及穩(wěn)定性的幾個(gè)地方包括:
1、程序
程序開(kāi)發(fā)是一方面,系統(tǒng)架構(gòu)設(shè)計(jì)(硬件+網(wǎng)絡(luò)+軟件)是另一方面。
軟件架構(gòu)方面,做網(wǎng)站首先需要很多web服務(wù)器存儲(chǔ)靜態(tài)資源,比如圖片、視頻、靜態(tài)頁(yè)等,千萬(wàn)不要把靜態(tài)資源和應(yīng)用服務(wù)器放在一起。
一個(gè)好的程序員寫出來(lái)的程序會(huì)非常簡(jiǎn)潔、性能很好,一個(gè)初級(jí)程序員可能會(huì)犯很多低級(jí)錯(cuò)誤,這也是影響網(wǎng)站性能的原因之一。
網(wǎng)站要做到效率高,不光是程序員的事情,數(shù)據(jù)庫(kù)優(yōu)化、程序優(yōu)化這是必須的,在性能優(yōu)化上要數(shù)據(jù)庫(kù)和程序齊頭并進(jìn)!緩存也是兩方面同時(shí)入手。第一,數(shù)據(jù)庫(kù)緩存和數(shù)據(jù)庫(kù)優(yōu)化,這個(gè)由dba完成(而且這個(gè)有非常大的潛力可挖,只是由于我們都是程序員而忽略了他而已)。第二,程序上的優(yōu)化,這個(gè)非常的有講究,比如說(shuō)重要一點(diǎn)就是要規(guī)范SQL語(yǔ)句,少用in 多用or,多用preparestatement,另外避免程序冗余如查找數(shù)據(jù)少用雙重循環(huán)等。另外選用優(yōu)秀的開(kāi)源框架加以支持,我個(gè)人認(rèn)為中后臺(tái)的支持是最最重要的,可以選取spring+ibatis。因?yàn)閕batis直接操作SQL并有緩存機(jī)制。spring的好處就不用我多說(shuō)了,IOC的機(jī)制可以避免new對(duì)象,這樣也節(jié)省開(kāi)銷。據(jù)我分析,絕大部分的開(kāi)銷就是在NEW的時(shí)候和連接數(shù)據(jù)庫(kù)時(shí)候產(chǎn)生的,請(qǐng)盡量避免。另外可以用一些內(nèi)存測(cè)試工具來(lái)做一個(gè)demo說(shuō)明hibernate和ibatis誰(shuí)更快!前臺(tái)你想用什么就用什么,struts,webwork都成,如果覺(jué)得自己挺牛X可以試試tapestry。
用數(shù)據(jù)庫(kù)也未必不能解決訪問(wèn)量巨大所帶來(lái)的問(wèn)題,作成靜態(tài)文件硬盤的尋址時(shí)間也未必少于數(shù)據(jù)庫(kù)的搜索時(shí)間,當(dāng)然對(duì)資料的索引要下一翻工夫。我自己覺(jué)得門戶往往也就是當(dāng)天、熱門的資料點(diǎn)擊率較高,將其做緩存最多也不過(guò)1~2G的數(shù)據(jù)量吧,舉個(gè)例子:
拿網(wǎng)易新聞來(lái)說(shuō)http://news.163.com/07/0606/09/3GA0D10N00011229.html
格式化一下,方便理解:http://域名/年/月日/新聞所屬分類/新聞ID.html
可以把當(dāng)天發(fā)布的、熱門的、流攬量大的作個(gè)緩寸,用hashtable(key:年-月-日-分類-ID,value:新聞對(duì)象),靜態(tài)將其放到內(nèi)存(速度絕對(duì)快過(guò)硬盤尋址靜態(tài)頁(yè)面)。
通常是采用oracle存儲(chǔ)過(guò)程+2個(gè)weblogic,更新機(jī)制也幾乎一樣每簽發(fā)一條新聞,就會(huì)生成靜態(tài)頁(yè)面,然后發(fā)往前端的web服務(wù)器,前端的web都是做負(fù)載均衡的。另外還有定時(shí)的程序,每5-15分鐘自動(dòng)生成一次。在發(fā)布新聞的同時(shí)將數(shù)據(jù)緩存。當(dāng)然緩存也不會(huì)越來(lái)越大,在個(gè)特定的時(shí)間段(如凌晨)剔除過(guò)期的數(shù)據(jù)。做一個(gè)大的網(wǎng)站遠(yuǎn)沒(méi)有想象中那么簡(jiǎn)單,服務(wù)器基本就要百十個(gè)的。
這樣可以大大增加一臺(tái)計(jì)算機(jī)的處理速度,如果一臺(tái)機(jī)器處理不了,可以用httpserver集群來(lái)解決問(wèn)題了。
2、網(wǎng)絡(luò)
中國(guó)的網(wǎng)絡(luò)分南北電信和網(wǎng)通,訪問(wèn)的ip就要區(qū)分南北進(jìn)入不同的網(wǎng)絡(luò)。
3、集群
通常會(huì)使用CDN與GSBL與DNS負(fù)載均衡技術(shù),每個(gè)地區(qū)一組前臺(tái)服務(wù)器群,例如:網(wǎng)易,百度使用了DNS負(fù)載均衡技術(shù),每個(gè)頻道一組前臺(tái)服務(wù)器,一搜使用了DNS負(fù)載技術(shù),所有頻道共用一組前臺(tái)服務(wù)器集群。
網(wǎng)站使用基于Linux集群的負(fù)載均衡,失敗恢復(fù),包括應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器,基于linux-ha的服務(wù)狀態(tài)檢測(cè)及高可用化。
應(yīng)用服務(wù)器集群可以采用apache+tomcat集群和weblogic集群等;web服務(wù)器集群可以用反向代理,也可以用NAT的方式,或者多域名解析都可以;Squid也可以,方法很多,可以根據(jù)情況選擇。
4、數(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ā)生斷電事故。另外還有一點(diǎn)的是,那些網(wǎng)站的靜態(tài)化網(wǎng)頁(yè)并不是真的,而是通過(guò)動(dòng)態(tài)網(wǎng)頁(yè)與靜態(tài)網(wǎng)頁(yè)網(wǎng)址交換做出現(xiàn)的假象,這可以用urlrewrite這樣的開(kāi)源網(wǎng)址映射器實(shí)現(xiàn)。這樣的網(wǎng)站實(shí)時(shí)性也是相對(duì)的,因?yàn)樵跀?shù)據(jù)庫(kù)復(fù)制數(shù)據(jù)的時(shí)候有一個(gè)過(guò)程,一般在技術(shù)上可以用到hibernate和ecache,但是如果要使網(wǎng)站工作地更好,可以使用EJB和websphere,weblogic這樣大型的服務(wù)器來(lái)支持,并且要用oracle這樣的大型數(shù)據(jù)庫(kù)。
大型門戶網(wǎng)站不建議使用Mysql數(shù)據(jù)庫(kù),除非你對(duì)Mysql數(shù)據(jù)的優(yōu)化非常熟悉。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ǎng)站要用oracle,數(shù)據(jù)方面操作盡量多用存儲(chǔ)過(guò)程,絕對(duì)提升性能;同時(shí)要讓DBA對(duì)數(shù)據(jù)庫(kù)進(jìn)行優(yōu)化,優(yōu)化后的數(shù)據(jù)庫(kù)與沒(méi)優(yōu)化的有天壤之別;同時(shí)還可以擴(kuò)展分布式數(shù)據(jù)庫(kù),以后這方面的研究會(huì)越來(lái)越多;
5、頁(yè)面
從開(kāi)始就考慮使用虛擬存儲(chǔ)/簇文件系統(tǒng)。它能讓你大量并行IO訪問(wèn),而且不需要任何重組就能夠增加所需要的磁盤。
頁(yè)面數(shù)據(jù)調(diào)用更要認(rèn)真設(shè)計(jì),一些數(shù)據(jù)查詢可以不通過(guò)數(shù)據(jù)庫(kù)的方式,實(shí)時(shí)性要求不高的可以使用lucene來(lái)實(shí)現(xiàn),即使有實(shí)時(shí)性的要求也可以用lucene,lucene+compass還是非常優(yōu)秀的。
新聞?lì)惖木W(wǎng)站可以用靜態(tài)頁(yè)存儲(chǔ),采用定時(shí)更新機(jī)制減輕服務(wù)器負(fù)擔(dān);首頁(yè)每個(gè)小模塊可以使用oscache緩存,這樣不用每次都拉數(shù)據(jù)。
前端的基于靜態(tài)頁(yè)面緩存的web加速器,主要應(yīng)用有squid等。squid 將大部分靜態(tài)資源(圖片,js,css等)緩存起來(lái),直接返回給訪問(wèn)者,減少應(yīng)用服務(wù)器的負(fù)載網(wǎng)站的靜態(tài)化網(wǎng)頁(yè)并不是真的,而是通過(guò)動(dòng)態(tài)網(wǎng)頁(yè)與靜態(tài)網(wǎng)頁(yè)網(wǎng)址交換做出現(xiàn)的假象,這可以用urlrewrite這樣的開(kāi)源網(wǎng)址映射器實(shí)現(xiàn),后綴名為htm或者h(yuǎn)tml并不能說(shuō)明程序生成了靜態(tài)頁(yè)面,可能是通過(guò)url重寫來(lái)實(shí)現(xiàn)的,為的只不過(guò)是在搜索引擎中提升自己網(wǎng)站的覆蓋面積罷了。
生成靜態(tài)頁(yè)面的服務(wù)器和www服務(wù)器是兩組不同的服務(wù)器,頁(yè)面生成后才會(huì)到www服務(wù)器,一部分?jǐn)?shù)據(jù)庫(kù)并不是關(guān)系數(shù)據(jù)庫(kù),這樣更適合信息衍生,www、mail服務(wù)器、路由器多,主要用負(fù)載平衡解決訪問(wèn)瓶頸。
靜態(tài)頁(yè)面的缺點(diǎn):
1) 增加了程序的復(fù)雜度
2) 不利于管理資料
3) 速度不是最快
4) 傷硬盤
6、緩存
從一開(kāi)始就應(yīng)該使用緩存,高速緩存是一個(gè)更好的地方存儲(chǔ)臨時(shí)數(shù)據(jù),比如Web站點(diǎn)上跟蹤一個(gè)特定用戶的會(huì)話產(chǎn)生的臨時(shí)文件,就不再需要記錄到數(shù)據(jù)庫(kù)里。
不能用lucene實(shí)現(xiàn)的可以用緩存,分布式緩存可以用memcached,如果有錢的話用10來(lái)臺(tái)機(jī)器做緩存,> 10G的存儲(chǔ)量相信存什么都?jí)蛄;如果沒(méi)錢的話可以在頁(yè)面緩存和數(shù)據(jù)緩存上下功夫,多用OSCACHE和EHCACHE,SWARMCACHE也可以,不過(guò)據(jù)說(shuō)同步性不是很好;
可以使用Memcache進(jìn)行緩存,用大內(nèi)存把這些不變的數(shù)據(jù)全都緩存起來(lái),而當(dāng)修改時(shí)就通知cache過(guò)期,memcache是LJ開(kāi)發(fā)的一款分布式緩存產(chǎn)品,很多大型網(wǎng)站在應(yīng)用,我們可以把Cache Server與AppServer裝在一起。因?yàn)镃ache Server對(duì)CPU消耗不大,而有了Cache Server的支援,App Server對(duì)內(nèi)存要求也不是太高,所以可以和平共處,更有效的利用資源。
以上一些不太成熟的想法,可以從某一個(gè)層次開(kāi)始,逐步細(xì)化,把產(chǎn)品的性能指標(biāo)提高上去。
轉(zhuǎn)自:it168
廣告: