1、HTML靜态化(huà)
其實大(dà)家都知道,效率最高(gāo)、消耗最小的(de)就是純靜态化(huà)的(de)html頁面,所以我們盡可(kě)能使我們的(de)網站上的(de)頁面采用(yòng)靜态頁面來(lái)實現,這(zhè)個(gè)最簡單的(de)方法其實也(yě)是最有效的(de)方法。但是對(duì)于大(dà)量内容并且頻(pín)繁更新的(de)網站,我們無法全部手動去挨個(gè)實現,于是出現了(le)我們常見的(de)信息發布系統CMS,像我們常訪問的(de)各個(gè)門戶站點的(de)新聞頻(pín)道,甚至他(tā)們的(de)其他(tā)頻(pín)道,都是通(tōng)過信息發布系統來(lái)管理(lǐ)和(hé)實現的(de),信息發布系統可(kě)以實現最簡單的(de)信息錄入自動生成靜态頁面,還(hái)能具備頻(pín)道管理(lǐ)、權限管理(lǐ)、自動抓取等功能,對(duì)于一個(gè)大(dà)型網站來(lái)說,擁有一套高(gāo)效、可(kě)管理(lǐ)的(de)CMS是必不可(kě)少的(de)。
除了(le)門戶和(hé)信息發布類型的(de)網站,對(duì)于交互性要求很高(gāo)的(de)社區(qū)類型網站來(lái)說,盡可(kě)能的(de)靜态化(huà)也(yě)是提高(gāo)性能的(de)必要手段,将社區(qū)内的(de)帖子、文章(zhāng)進行實時(shí)的(de)靜态化(huà),有更新的(de)時(shí)候再重新靜态化(huà)也(yě)是大(dà)量使用(yòng)的(de)策略,像Mop的(de)大(dà)雜(zá)燴就是使用(yòng)了(le)這(zhè)樣的(de)策略,網易社區(qū)等也(yě)是如此。
同時(shí),html靜态化(huà)也(yě)是某些緩存策略使用(yòng)的(de)手段,對(duì)于系統中頻(pín)繁使用(yòng)數據庫查詢但是内容更新很小的(de)應用(yòng),可(kě)以考慮使用(yòng)html靜态化(huà)來(lái)實現,比如論壇中論壇的(de)公用(yòng)設置信息,這(zhè)些信息目前的(de)主流論壇都可(kě)以進行後台管理(lǐ)并且存儲再數據庫中,這(zhè)些信息其實大(dà)量被前台程序調用(yòng),但是更新頻(pín)率很小,可(kě)以考慮将這(zhè)部分(fēn)内容進行後台更新的(de)時(shí)候進行靜态化(huà),這(zhè)樣避免了(le)大(dà)量的(de)數據庫訪問請求。
2、圖片服務器分(fēn)離
大(dà)家知道,對(duì)于Web服務器來(lái)說,不管是Apache、IIS還(hái)是其他(tā)容器,圖片是最消耗資源的(de),于是我們有必要将圖片與頁面進行分(fēn)離,這(zhè)是基本上大(dà)型網站都會采用(yòng)的(de)策略,他(tā)們都有獨立的(de)圖片服務器,甚至很多(duō)台圖片服務器。這(zhè)樣的(de)架構可(kě)以降低提供頁面訪問請求的(de)服務器系統壓力,并且可(kě)以保證系統不會因爲圖片問題而崩潰,在應用(yòng)服務器和(hé)圖片服務器上,可(kě)以進行不同的(de)配置優化(huà),比如apache在配置ContentType的(de)時(shí)候可(kě)以盡量少支持,盡可(kě)能少的(de)LoadModule,保證更高(gāo)的(de)系統消耗和(hé)執行效率。
3、數據庫集群和(hé)庫表散列
大(dà)型網站都有複雜(zá)的(de)應用(yòng),這(zhè)些應用(yòng)必須使用(yòng)數據庫,那麽在面對(duì)大(dà)量訪問的(de)時(shí)候,數據庫的(de)瓶頸很快(kuài)就能顯現出來(lái),這(zhè)時(shí)一台數據庫将很快(kuài)無法滿足應用(yòng),于是我們需要使用(yòng)數據庫集群或者庫表散列。
在數據庫集群方面,很多(duō)數據庫都有自己的(de)解決方案,Oracle、Sybase等都有很好的(de)方案,常用(yòng)的(de)MySQL提供的(de)Master/Slave也(yě)是類似的(de)方案,您使用(yòng)了(le)什(shén)麽樣的(de)DB,就參考相應的(de)解決方案來(lái)實施即可(kě)。
上面提到的(de)數據庫集群由于在架構、成本、擴張性方面都會受到所采用(yòng)DB類型的(de)限制,于是我們需要從應用(yòng)程序的(de)角度來(lái)考慮改善系統架構,庫表散列是常用(yòng)并且最有效的(de)解決方案。我們在應用(yòng)程序中安裝業務和(hé)應用(yòng)或者功能模塊将數據庫進行分(fēn)離,不同的(de)模塊對(duì)應不同的(de)數據庫或者表,再按照(zhào)一定的(de)策略對(duì)某個(gè)頁面或者功能進行更小的(de)數據庫散列,比如用(yòng)戶表,按照(zhào)用(yòng)戶ID進行表散列,這(zhè)樣就能夠低成本的(de)提升系統的(de)性能并且有很好的(de)擴展性。sohu的(de)論壇就是采用(yòng)了(le)這(zhè)樣的(de)架構,将論壇的(de)用(yòng)戶、設置、帖子等信息進行數據庫分(fēn)離,然後對(duì)帖子、用(yòng)戶按照(zhào)闆塊和(hé)ID進行散列數據庫和(hé)表,最終可(kě)以在配置文件中進行簡單的(de)配置便能讓系統随時(shí)增加一台低成本的(de)數據庫進來(lái)補充系統性能。
4、緩存
緩存一詞搞技術的(de)都接觸過,很多(duō)地方用(yòng)到緩存。網站架構和(hé)網站開發中的(de)緩存也(yě)是非常重要。這(zhè)裏先講述最基本的(de)兩種緩存。高(gāo)級和(hé)分(fēn)布式的(de)緩存在後面講述。
架構方面的(de)緩存,對(duì)Apache比較熟悉的(de)人(rén)都能知道Apache提供了(le)自己的(de)緩存模塊,也(yě)可(kě)以使用(yòng)外加的(de)Squid模塊進行緩存,這(zhè)兩種方式均可(kě)以有效的(de)提高(gāo)Apache的(de)訪問響應能力。
網站程序開發方面的(de)緩存,Linux上提供的(de)Memory Cache是常用(yòng)的(de)緩存接口,可(kě)以在web開發中使用(yòng),比如用(yòng)Java開發的(de)時(shí)候就可(kě)以調用(yòng)MemoryCache對(duì)一些數據進行緩存和(hé)通(tōng)訊共享,一些大(dà)型社區(qū)使用(yòng)了(le)這(zhè)樣的(de)架構。另外,在使用(yòng)web語言開發的(de)時(shí)候,各種語言基本都有自己的(de)緩存模塊和(hé)方法,PHP有Pear的(de)Cache模塊,Java就更多(duō)了(le),.net不是很熟悉,相信也(yě)肯定有。
5、鏡像
鏡像是大(dà)型網站常采用(yòng)的(de)提高(gāo)性能和(hé)數據安全性的(de)方式,鏡像的(de)技術可(kě)以解決不同網絡接入商和(hé)地域帶來(lái)的(de)用(yòng)戶訪問速度差異,比如ChinaNet和(hé)EduNet之間的(de)差異就促使了(le)很多(duō)網站在教育網内搭建鏡像站點,數據進行定時(shí)更新或者實時(shí)更新。在鏡像的(de)細節技術方面,這(zhè)裏不闡述太深,有很多(duō)專業的(de)現成的(de)解決架構和(hé)産品可(kě)選。也(yě)有廉價的(de)通(tōng)過軟件實現的(de)思路,比如Linux上的(de)rsync等工具。
6、負載均衡
負載均衡将是大(dà)型網站解決高(gāo)負荷訪問和(hé)大(dà)量并發請求采用(yòng)的(de)終極解決辦法。
負載均衡技術發展了(le)多(duō)年,有很多(duō)專業的(de)服務提供商和(hé)産品可(kě)以選擇,我個(gè)人(rén)接觸過一些解決方法,其中有兩個(gè)架構可(kě)以給大(dà)家做(zuò)參考。
硬件四層交換
第四層交換使用(yòng)第三層和(hé)第四層信息包的(de)報頭信息,根據應用(yòng)區(qū)間識别業務流,将整個(gè)區(qū)間段的(de)業務流分(fēn)配到合适的(de)應用(yòng)服務器進行處理(lǐ)。 第四層交換功能就象是虛 IP,指向物(wù)理(lǐ)服務器。它傳輸的(de)業務服從的(de)協議(yì)多(duō)種多(duō)樣,有HTTP、FTP、NFS、Telnet或其他(tā)協議(yì)。這(zhè)些業務在物(wù)理(lǐ)服務器基礎上,需要複雜(zá)的(de)載量平衡算(suàn)法。在IP世界,業務類型由終端TCP或UDP端口地址來(lái)決定,在第四層交換中的(de)應用(yòng)區(qū)間則由源端和(hé)終端IP地址、TCP和(hé)UDP端口共同決定。
在硬件四層交換産品領域,有一些知名的(de)産品可(kě)以選擇,比如Alteon、F5等,這(zhè)些産品很昂貴,但是物(wù)有所值,能夠提供非常優秀的(de)性能和(hé)很靈活的(de)管理(lǐ)能力。Yahoo中國當初接近2000台服務器使用(yòng)了(le)三四台Alteon就搞定了(le)。軟件四層交換
大(dà)家知道了(le)硬件四層交換機的(de)原理(lǐ)後,基于OSI模型來(lái)實現的(de)軟件四層交換也(yě)就應運而生,這(zhè)樣的(de)解決方案實現的(de)原理(lǐ)一緻,不過性能稍差。但是滿足一定量的(de)壓力還(hái)是遊刃有餘的(de),有人(rén)說軟件實現方式其實更靈活,處理(lǐ)能力完全看你配置的(de)熟悉能力。
軟件四層交換我們可(kě)以使用(yòng)Linux上常用(yòng)的(de)LVS來(lái)解決,LVS就是Linux Virtual Server,他(tā)提供了(le)基于心跳線heartbeat的(de)實時(shí)災難應對(duì)解決方案,提高(gāo)系統的(de)魯棒性,同時(shí)可(kě)供了(le)靈活的(de)虛拟VIP配置和(hé)管理(lǐ)功能,可(kě)以同時(shí)滿足多(duō)種應用(yòng)需求,這(zhè)對(duì)于分(fēn)布式的(de)系統來(lái)說必不可(kě)少。
一個(gè)典型的(de)使用(yòng)負載均衡的(de)策略就是,在軟件或者硬件四層交換的(de)基礎上搭建squid集群,這(zhè)種思路在很多(duō)大(dà)型網站包括搜索引擎上被采用(yòng),這(zhè)樣的(de)架構低成本、高(gāo)性能還(hái)有很強的(de)擴張性,随時(shí)往架構裏面增減節點都非常容易。這(zhè)樣的(de)架構我準備空了(le)專門詳細整理(lǐ)一下(xià)和(hé)大(dà)家探討(tǎo)。
對(duì)于大(dà)型網站來(lái)說,前面提到的(de)每個(gè)方法可(kě)能都會被同時(shí)使用(yòng)到,我這(zhè)裏介紹得(de)比較淺顯,具體實現過程中很多(duō)細節還(hái)需要大(dà)家慢(màn)慢(màn)熟悉和(hé)體會,有時(shí)一個(gè)很小的(de)squid參數或者apache參數設置,對(duì)于系統性能的(de)影(yǐng)響就會很大(dà),希望大(dà)家一起討(tǎo)論,達到抛磚引玉之效。