運行效率高穩定性好的大型網站系統架構分析

隨着中國大型IT企業信息化速度的加快,大部分應用的數據量和訪問量都急劇增加,大型企業網站正面臨性能和高數據訪問量的壓力,而且對存儲、安全以及信息檢索等等方面都提出了更高的要求。

千萬人同時訪問的網站,一般是有很多個數據庫同時工作,說明白一點就是數據庫集羣和併發控制,這樣的網站實時性也是相對的。這些網站都有一些共同的特點:數據量大,在線人數多,併發請求多,pageview高,響應速度快。總結了一下各個大網站的架構,主要提高效率及穩定性的幾個地方包括:
 
1、程序
程序開發是一方面,系統架構設計(硬件+網絡+軟件)是另一方面。
軟件架構方面,做網站首先需要很多web服務器存儲靜態資源,比如圖片、視頻、靜態頁等,千萬不要把靜態資源和應用服務器放在一起。
一個好的程序員寫出來的程序會非常簡潔、性能很好,一個初級程序員可能會犯很多低級錯誤,這也是影響網站性能的原因之一。
網站要做到效率高,不光是程序員的事情,數據庫優化、程序優化這是必須的,在性能優化上要數據庫和程序齊頭並進!緩存也是兩方面同時入手。第一,數據庫緩存和數據庫優化,這個由dba完成(而且這個有非常大的潛力可挖,只是由於我們都是程序員而忽略了他而已)。第二,程序上的優化,這個非常的有講究,比如說重要一點就是要規範SQL語句,少用in 多用or,多用preparestatement,另外避免程序冗餘如查找數據少用雙重循環等。另外選用優秀的開源框架加以支持,我個人認爲中後臺的支持是最最重要的,可以選取spring+ibatis。因爲ibatis直接操作SQL並有緩存機制。spring的好處就不用我多說了,IOC的機制可以避免new對象,這樣也節省開銷。據我分析,絕大部分的開銷就是在NEW的時候和連接數據庫時候產生的,請儘量避免。另外可以用一些內存測試工具來做一個demo說明hibernate和ibatis誰更快!前臺你想用什麼就用什麼,struts,webwork都成,如果覺得自己挺牛X可以試試用tapestry。
用數據庫也未必不能解決訪問量巨大所帶來的問題,作成靜態文件硬盤的尋址時間也未必少於數據庫的搜索時間,當然對資料的索引要下一翻工夫。我自己覺得門戶往往也就是當天、熱門的資料點擊率較高,將其做緩存最多也不過1~2G的數據量吧,舉個例子:
 
◎ 拿網易新聞來說[url]http://news.163.com/07/0606/09/3GA0D10N00011229.html[/url]
格式化一下,方便理解:http://域名/年/月日/新聞所屬分類/新聞ID.html
可以把當天發佈的、熱門的、流攬量大的作個緩寸,用hashtable(key:年-月-日-分類-ID,value:新聞對象),靜態將其放到內存(速度絕對快過硬盤尋址靜態頁面)。
 
通常是採用oracle存儲過程+2個weblogic,更新機制也幾乎一樣每簽發一條新聞,就會生成靜態頁面,然後發往前端的web服務器,前端的web都是做負載均衡的。另外還有定時的程序,每5-15分鐘自動生成一次。在發佈新聞的同時將數據緩存。當然緩存也不會越來越大,在個特定的時間段(如凌晨)剔除過期的數據。做一個大的網站遠沒有想象中那麼簡單,服務器基本就要百十個的。
這樣可以大大增加一臺計算機的處理速度,如果一臺機器處理不了,可以用httpserver集羣來解決問題了。
 
2、網絡
中國的網絡分南北電信和網通,訪問的ip就要區分南北進入不同的網絡。
 
3、集羣
通常會使用CDN與GSBL與DNS負載均衡技術,每個地區一組前臺服務器羣,例如:網易,百度使用了DNS負載均衡技術,每個頻道一組前臺服務器,一搜使用了DNS負載技術,所有頻道共用一組前臺服務器集羣。
網站使用基於Linux集羣的負載均衡,失敗恢復,包括應用服務器和數據庫服務器,基於linux-ha的服務狀態檢測及高可用化。
應用服務器集羣可以採用apache+tomcat集羣和weblogic集羣等;web服務器集羣可以用反向代理,也可以用NAT的方式,或者多域名解析都可以;Squid也可以,方法很多,可以根據情況選擇。
 
4、數據庫
因爲是千萬人同時訪問的網站,所以一般是有很多個數據庫同時工作的,說明白一點就是數據庫集羣和併發控制,數據分佈到地理位置不同的數據中心,以免發生斷電事故。另外還有一點的是,那些網站的靜態化網頁並不是真的,而是通過動態網頁與靜態網頁網址交換做出現的假象,這可以用urlrewrite這樣的開源網址映射器實現。這樣的網站實時性也是相對的,因爲在數據庫複製數據的時候有一個過程,一般在技術上可以用到hibernate和ecache,但是如果要使網站工作地更好,可以使用EJB和websphere,weblogic這樣大型的服務器來支持,並且要用oracle這樣的大型數據庫。
大型門戶網站不建議使用Mysql數據庫,除非你對Mysql數據的優化非常熟悉。Mysql數據庫服務器的master-slave模式,利用數據庫服務器在主從服務器間進行同步,應用只把數據寫到主服務器,而讀數據時則根據負載選擇一臺從服務器或者主服務器來讀取,將數據按不同策略劃分到不同的服務器(組)上,分散數據庫壓力。
大型網站要用oracle,數據方面操作儘量多用存儲過程,絕對提升性能;同時要讓DBA對數據庫進行優化,優化後的數據庫與沒優化的有天壤之別;同時還可以擴展分佈式數據庫,以後這方面的研究會越來越多;
 
5、頁面
從開始就考慮使用虛擬存儲/簇文件系統。它能讓你大量並行IO訪問,而且不需要任何重組就能夠增加所需要的磁盤。
頁面數據調用更要認真設計,一些數據查詢可以不通過數據庫的方式,實時性要求不高的可以使用lucene來實現,即使有實時性的要求也可以用lucene,lucene+compass還是非常優秀的。
新聞類的網站可以用靜態頁存儲,採用定時更新機制減輕服務器負擔;首頁每個小模塊可以使用oscache緩存,這樣不用每次都拉數據。
前端的基於靜態頁面緩存的web加速器,主要應用有squid等。squid 將大部分靜態資源(圖片,js,css等)緩存起來,直接返回給訪問者,減少應用服務器的負載
網站的靜態化網頁並不是真的,而是通過動態網頁與靜態網頁網址交換做出現的假象,這可以用urlrewrite這樣的開源網址映射器實現,後綴名爲htm或者html並不能說明程序生成了靜態頁面,可能是通過url重寫來實現的,爲的只不過是在搜索引擎中提升自己網站的覆蓋面積罷了。
生成靜態頁面的服務器和www服務器是兩組不同的服務器,頁面生成後纔會到www服務器,一部分數據庫並不是關係數據庫,這樣更適合信息衍生,www、mail服務器、路由器多,主要用負載平衡解決訪問瓶頸。
◎ 靜態頁面的缺點:
1) 增加了程序的複雜度
2) 不利於管理資料
3) 速度不是最快
4) 傷硬盤
 
6、緩存
從一開始就應該使用緩存,高速緩存是一個更好的地方存儲臨時數據,比如Web站點上跟蹤一個特定用戶的會話產生的臨時文件,就不再需要記錄到數據庫裏。
不能用lucene實現的可以用緩存,分佈式緩存可以用memcached,如果有錢的話用10來臺機器做緩存,> 10G的存儲量相信存什麼都夠了;如果沒錢的話可以在頁面緩存和數據緩存上下功夫,多用OSCACHE和EHCACHE,SWARMCACHE也可以,不過據說同步性不是很好;
可以使用Memcache進行緩存,用大內存把這些不變的數據全都緩存起來,而當修改時就通知cache過期,memcache是LJ開發的一款分佈式緩存產品,很多大型網站在應用,我們可以把Cache Server與App Server裝在一起。因爲Cache Server對CPU消耗不大,而有了Cache Server的支援,App Server對內存要求也不是太高,所以可以和平共處,更有效的利用資源。

以上一些不太成熟的想法,可以從某一個層次開始,逐步細化,把產品的性能指標提高上去。
 
以下內容爲轉載:淺析大型網站的架構
一個小型的網站,比如個人網站,可以使用最簡單的html靜態頁面就實現了,配合一些圖片達到美化效果,所有的頁面均存放在一個目錄下,這樣的網站對系統架構、性能的要求都很簡單,隨着互聯網業務的不斷豐富,網站相關的技術經過這些年的發展,已經細分到很細的方方面面,尤其對於大型網站來說,所採用的技術更是涉及面非常廣,從硬件到軟件、編程語言、數據庫、WebServer、防火牆等各個領域都有了很高的要求,已經不是原來簡單的html靜態網站所能比擬的。
大型網站,比如門戶網站。在面對大量用戶訪問、高併發請求方面,基本的解決方案集中在這樣幾個環節:使用高性能的服務器、高性能的數據庫、高效率的編程語言、還有高性能的Web容器。但是除了這幾個方面,還沒法根本解決大型網站面臨的高負載和高併發問題。
上面提供的幾個解決思路在一定程度上也意味着更大的投入,並且這樣的解決思路具備瓶頸,沒有很好的擴展性,下面我從低成本、高性能和高擴張性的角度來說說我的一些經驗。
1、HTML靜態化
其實大家都知道,效率最高、消耗最小的就是純靜態化的html頁面,所以我們儘可能使我們的網站上的頁面採用靜態頁面來實現,這個最簡單的方法其實也是最有效的方法。但是對於大量內容並且頻繁更新的網站,我們無法全部手動去挨個實現,於是出現了我們常見的信息發佈系統CMS,像我們常訪問的各個門戶站點的新聞頻道,甚至他們的其他頻道,都是通過信息發佈系統來管理和實現的,信息發佈系統可以實現最簡單的信息錄入自動生成靜態頁面,還能具備頻道管理、權限管理、自動抓取等功能,對於一個大型網站來說,擁有一套高效、可管理的CMS是必不可少的。
除了門戶和信息發佈類型的網站,對於交互性要求很高的社區類型網站來說,儘可能的靜態化也是提高性能的必要手段,將社區內的帖子、文章進行實時的靜態化,有更新的時候再重新靜態化也是大量使用的策略,像Mop的大雜燴就是使用了這樣的策略,網易社區等也是如此。
同時,html靜態化也是某些緩存策略使用的手段,對於系統中頻繁使用數據庫查詢但是內容更新很小的應用,可以考慮使用html靜態化來實現,比如論壇中論壇的公用設置信息,這些信息目前的主流論壇都可以進行後臺管理並且存儲再數據庫中,這些信息其實大量被前臺程序調用,但是更新頻率很小,可以考慮將這部分內容進行後臺更新的時候進行靜態化,這樣避免了大量的數據庫訪問請求。
2、圖片服務器分離
大家知道,對於Web服務器來說,不管是Apache、IIS還是其他容器,圖片是最消耗資源的,於是我們有必要將圖片與頁面進行分離,這是基本上大型網站都會採用的策略,他們都有獨立的圖片服務器,甚至很多臺圖片服務器。這樣的架構可以降低提供頁面訪問請求的服務器系統壓力,並且可以保證系統不會因爲圖片問題而崩潰,在應用服務器和圖片服務器上,可以進行不同的配置優化,比如apache在配置ContentType的時候可以儘量少支持,儘可能少的LoadModule,保證更高的系統消耗和執行效率。
3、數據庫集羣和庫表散列
大型網站都有複雜的應用,這些應用必須使用數據庫,那麼在面對大量訪問的時候,數據庫的瓶頸很快就能顯現出來,這時一臺數據庫將很快無法滿足應用,於是我們需要使用數據庫集羣或者庫表散列。
在數據庫集羣方面,很多數據庫都有自己的解決方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是類似的方案,您使用了什麼樣的DB,就參考相應的解決方案來實施即可。
上面提到的數據庫集羣由於在架構、成本、擴張性方面都會受到所採用DB類型的限制,於是我們需要從應用程序的角度來考慮改善系統架構,庫表散列是常用並且最有效的解決方案。我們在應用程序中安裝業務和應用或者功能模塊將數據庫進行分離,不同的模塊對應不同的數據庫或者表,再按照一定的策略對某個頁面或者功能進行更小的數據庫散列,比如用戶表,按照用戶ID進行表散列,這樣就能夠低成本的提升系統的性能並且有很好的擴展性。sohu的論壇就是採用了這樣的架構,將論壇的用戶、設置、帖子等信息進行數據庫分離,然後對帖子、用戶按照板塊和ID進行散列數據庫和表,最終可以在配置文件中進行簡單的配置便能讓系統隨時增加一臺低成本的數據庫進來補充系統性能。
4、緩存
緩存一詞搞技術的都接觸過,很多地方用到緩存。網站架構和網站開發中的緩存也是非常重要。這裏先講述最基本的兩種緩存。高級和分佈式的緩存在後面講述。
架構方面的緩存,對Apache比較熟悉的人都能知道Apache提供了自己的緩存模塊,也可以使用外加的Squid模塊進行緩存,這兩種方式均可以有效的提高Apache的訪問響應能力。
網站程序開發方面的緩存,Linux上提供的Memory Cache是常用的緩存接口,可以在web開發中使用,比如用Java開發的時候就可以調用MemoryCache對一些數據進行緩存和通訊共享,一些大型社區使用了這樣的架構。另外,在使用web語言開發的時候,各種語言基本都有自己的緩存模塊和方法,PHP有Pear的Cache模塊,Java就更多了,.net不是很熟悉,相信也肯定有。
5、鏡像
鏡像是大型網站常採用的提高性能和數據安全性的方式,鏡像的技術可以解決不同網絡接入商和地域帶來的用戶訪問速度差異,比如ChinaNet和EduNet之間的差異就促使了很多網站在教育網內搭建鏡像站點,數據進行定時更新或者實時更新。在鏡像的細節技術方面,這裏不闡述太深,有很多專業的現成的解決架構和產品可選。也有廉價的通過軟件實現的思路,比如Linux上的rsync等工具。
6、負載均衡
負載均衡將是大型網站解決高負荷訪問和大量併發請求採用的終極解決辦法。
負載均衡技術發展了多年,有很多專業的服務提供商和產品可以選擇,我個人接觸過一些解決方法,其中有兩個架構可以給大家做參考。
硬件四層交換
第四層交換使用第三層和第四層信息包的報頭信息,根據應用區間識別業務流,將整個區間段的業務流分配到合適的應用服務器進行處理。 第四層交換功能就象是虛 IP,指向物理服務器。它傳輸的業務服從的協議多種多樣,有HTTP、FTP、NFS、Telnet或其他協議。這些業務在物理服務器基礎上,需要複雜的載量平衡算法。在IP世界,業務類型由終端TCP或UDP端口地址來決定,在第四層交換中的應用區間則由源端和終端IP地址、TCP和UDP端口共同決定。
在硬件四層交換產品領域,有一些知名的產品可以選擇,比如Alteon、F5等,這些產品很昂貴,但是物有所值,能夠提供非常優秀的性能和很靈活的管理能力。Yahoo中國當初接近2000臺服務器使用了三四臺Alteon就搞定了。
軟件四層交換
大家知道了硬件四層交換機的原理後,基於OSI模型來實現的軟件四層交換也就應運而生,這樣的解決方案實現的原理一致,不過性能稍差。但是滿足一定量的壓力還是遊刃有餘的,有人說軟件實現方式其實更靈活,處理能力完全看你配置的熟悉能力。
軟件四層交換我們可以使用Linux上常用的LVS來解決,LVS就是Linux Virtual Server,他提供了基於心跳線heartbeat的實時災難應對解決方案,提高系統的魯棒性,同時可供了靈活的虛擬VIP配置和管理功能,可以同時滿足多種應用需求,這對於分佈式的系統來說必不可少。
一個典型的使用負載均衡的策略就是,在軟件或者硬件四層交換的基礎上搭建squid集羣,這種思路在很多大型網站包括搜索引擎上被採用,這樣的架構低成本、高性能還有很強的擴張性,隨時往架構裏面增減節點都非常容易。這樣的架構我準備空了專門詳細整理一下和大家探討。
對於大型網站來說,前面提到的每個方法可能都會被同時使用到,我這裏介紹得比較淺顯,具體實現過程中很多細節還需要大家慢慢熟悉和體會,有時一個很小的squid參數或者apache參數設置,對於系統性能的影響就會很大,希望大家一起討論,達到拋磚引玉之效。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章