-負(fù)載能力和訪問速度優(yōu)化的常用技術(shù)總結(jié)組件別離DNS負(fù)載均衡不同的web內(nèi)容分布到不同的效勞器上,并劃分子域,利用DNS將請求自然轉(zhuǎn)移到不同的效勞器上。主要可以分為兩大內(nèi)容:1.動態(tài)內(nèi)容,CPU、IO密集型2.靜態(tài)內(nèi)容,IO密集型通過在DNS中配置多個A記錄,將請求轉(zhuǎn)移到集群中不同的效勞器,這有助于具有地域性問題的大型web站點上,DNS可以使用戶就近訪問相應(yīng)的web效勞器。像BIND這樣的DNS效勞軟件提供豐富的調(diào)度策略。但是,如果集群中的主機出現(xiàn)故障的話,需要更新DNS緩存,這通常需要一定的時間。另外,客戶端也可以通過設(shè)置host來繞開DNS調(diào)度??缬蚬蚕韈ookie:將cookie的*圍擴(kuò)大到父域。重定向通過使客戶端重定向,來分散和轉(zhuǎn)移請求壓力,比方一些下載效勞通常都有幾個鏡像效勞器。分布式緩存無法使用頁面級別緩存時,需要考慮直接緩存數(shù)據(jù),比方使用memcached作為緩存。此時,需要考慮并發(fā)寫memcached的問題。另外,當(dāng)memcached橫向規(guī)模擴(kuò)大,效勞器數(shù)量增加時,需要一種對應(yīng)算法,能夠使應(yīng)用程序知道應(yīng)該哪個memcached效勞器〔比方,取模運算〕。分布式緩存能夠自動重建緩存,不必?fù)?dān)憂down機。負(fù)載均衡負(fù)載均衡就是將請求分散,這涉及到應(yīng)當(dāng)如何設(shè)計調(diào)度策略,以讓集群發(fā)揮最大的性能。當(dāng)集群中的主機能力相當(dāng)時應(yīng)當(dāng)盡量平均調(diào)度,能力不均時應(yīng)當(dāng)能者多勞。隨著問題的復(fù)雜,要時刻關(guān)注調(diào)度的性能,不要讓調(diào)度成為性能瓶頸。反向代理負(fù)載均衡反向代理效勞器工作在層,類似代理效勞器,與普通的代理效勞器不同的是,效勞器在代理的后端,而不是客戶端在代理的后端,這類似于NAT,只是NAT工作在網(wǎng)絡(luò)層。同樣是負(fù)載均衡,反向代理效勞器強調(diào)"轉(zhuǎn)發(fā)"而不是"轉(zhuǎn)移",因為它不僅要轉(zhuǎn)發(fā)客戶端的請求,還要轉(zhuǎn)發(fā)效勞端的響應(yīng)??梢杂米鞣聪虼硇谄鞯能浖蠳gin*、lig、Apache,另外目前也有一些專業(yè)的代理轉(zhuǎn)發(fā)設(shè)備能夠工作在應(yīng)用層,例如A10。使用代理轉(zhuǎn)發(fā)要注意以下問題:由于反向代理的轉(zhuǎn)發(fā)特性,使得代理本身很可能成為性能瓶頸。一般對于CPU密集型請求,使用代理比擬適宜,如果是IO密集型的話,這種集群方式很可能無法發(fā)揮最大性能在代理上要開啟**檢查,及時發(fā)現(xiàn)集群中的故障機,從而調(diào)整轉(zhuǎn)發(fā)策略,這通常比DNS方式實時性更好黏滯會話:對于啟動session保存用戶信息,或者后端效勞器使用動態(tài)內(nèi)容緩存. z.-的應(yīng)用,必須將用戶在一段會話中的的請求保持在同一臺效勞器上。代理效勞器一般支持類似的配置。然而,盡量不要使應(yīng)用過于本地化,比方可以使用cookie保存用戶數(shù)據(jù),或者分布式Session或分布式緩存。IP負(fù)載均衡字面上看,便是利用網(wǎng)絡(luò)層進(jìn)展請求轉(zhuǎn)發(fā),類似NAT網(wǎng)關(guān)。然而,使用網(wǎng)關(guān)轉(zhuǎn)發(fā)在帶寬上可能出現(xiàn)瓶頸,因為出口只有一個,所以出口的帶寬要求較高。Linu*中的Netfilter模塊可以通過iptables的配置。比方:對外網(wǎng)端口8001的請求轉(zhuǎn)發(fā)給內(nèi)網(wǎng)*臺效勞器,而對外網(wǎng)端口8002的請求轉(zhuǎn)發(fā)給內(nèi)網(wǎng)另一臺效勞器。這種方式簡單易行,但是無法對調(diào)度做太多配置。LVS-NAT同樣是Linu*中的在網(wǎng)絡(luò)層進(jìn)展轉(zhuǎn)發(fā)的方式,與Netfilter不同,它支持一些動態(tài)調(diào)度算法,比方最小、帶權(quán)重的最小、最短期望延遲等。直接路由直接路由是通過調(diào)度器修改數(shù)據(jù)包的目的MAC地址,轉(zhuǎn)發(fā)請求數(shù)據(jù)包,但是響應(yīng)數(shù)據(jù)包可以直接發(fā)送給外網(wǎng)的方式。這樣做顯而易見的好處就是無需擔(dān)憂網(wǎng)關(guān)瓶頸,但是實際的效勞器和調(diào)度效勞器都需要在WAN交換機上,并且擁有獨立的外網(wǎng)IP地址。這種方式的工作原理略微復(fù)雜:首先每臺效勞器都需要設(shè)置一個IP別名,這個IP別名是面向客戶端的一個虛擬IP,只有代理效勞器對這個IP別名的ARP請求做出響應(yīng),這樣客戶端發(fā)給這個IP的請求包首先會到代理效勞器。然后代理效勞器將這個請求包的目的MAC地址填寫為實際效勞器的MAC地址〔通過*種調(diào)度算法決定目的效勞器〕,由于目標(biāo)效勞器也具有這個IP別名,因此,轉(zhuǎn)發(fā)過來的數(shù)據(jù)包能夠被實際的效勞器接收并處理。最后由于數(shù)據(jù)包的源IP地址還是客戶端請求的IP地址,因此,實際的效勞器將通過交換機直接將響應(yīng)包轉(zhuǎn)發(fā)給客戶端而無需通過代理效勞器。Linu*下可以通過LVS-DR實現(xiàn)直接路由方式IP隧道IP隧道的意思是,調(diào)度器將原始的IP數(shù)據(jù)包封裝在新的IP數(shù)據(jù)包中,以實現(xiàn)調(diào)度,實際的效勞器可以將響應(yīng)數(shù)據(jù)包直接轉(zhuǎn)發(fā)給用戶端。共享文件系統(tǒng)對于一些簡單的提供文件下載的效勞〔包括html中靜態(tài)資源等〕,自然要考慮利用集群來減壓,但是如何使這些資源在集群中的主機上同步呢。NFS一種方案是讓這些主機從同一個地方取數(shù)據(jù)。比方采用NFS〔NetworkFileSystem〕,基于PRC。這種方式簡單易行,但是由于NFS效勞器本身的磁盤吞吐率,或者并發(fā)處理能力以及帶寬等問題,往往很有局限性。冗余分發(fā)另一個方案就是在主機上冗余存儲資源,這樣主機無需訪問共享文件系統(tǒng),只需讀取本地磁盤上的資源即可。但是這也帶來了一個同步的問題,如何同步這些數(shù)據(jù)呢:主動分發(fā)式,還分為單級分發(fā)和多級分發(fā),分發(fā)可以借助SCP、SFTP、協(xié)議WebDAV
擴(kuò)展. z.-單級分發(fā):通過一次分發(fā),就到達(dá)目的,這樣的方案簡單易行,但是性能瓶頸會出現(xiàn)在磁盤壓力和網(wǎng)絡(luò)帶寬,難以擴(kuò)展多級分發(fā):通過屢次分發(fā),才到達(dá)目的地,這樣的方案能夠分散磁盤壓力和網(wǎng)絡(luò)帶寬壓力,而且容易擴(kuò)展,害處是本錢高被動同步式容易理解,可以使用rsync,rsync同步時是根據(jù)最后更新時間進(jìn)展判定是否需要同步的條件的,因此,如果一個文件夾中有的文件數(shù)量太多的話,rsync掃描的時間就很長了,可以通過給文件夾設(shè)置最后更新時間,并合理的規(guī)劃文件目錄,來加快rsync的掃描時間。即使不使用rsync,自己開發(fā)同步程序也可以借助這樣的思想來提升性能。分布式文件系統(tǒng)分布式文件系統(tǒng)工作在用戶進(jìn)程層面上,它是一個管理文件的平臺,內(nèi)部維護(hù)冗余,檢索,追蹤、調(diào)度等工作,通常包含一個物理層面的組織構(gòu)造和邏輯層面的組織構(gòu)造。物理層面的組織構(gòu)造由分布式文件系統(tǒng)自行維護(hù),邏輯層面的組織構(gòu)造面向用戶。其中"追蹤器"起到了關(guān)鍵的作用。MogileFS就是一個開源分布式文件系統(tǒng),用Perl編寫,包含追蹤器、存儲節(jié)點、管理工具,它使用MySQL分布式文件系統(tǒng)的所有信息、使用WebDAV實現(xiàn)文件復(fù)制。其他著名的還有Hadoop。每個文件由一個key定義,需要讀取文件時,指定一個key,追蹤器會返回一個實際的路徑,在訪問這個地址即可獲得文件。甚至可以將這個key對應(yīng)的path用分布式緩存緩存起來,這樣可以減少追蹤器的查詢開銷,但這樣也會失去分布式文件系統(tǒng)的調(diào)度策略的優(yōu)越性。另外,可以利用支持repro*y的反向代理效勞器〔比方:Perlbal〕讓路徑重定向的工作由反向代理效勞器完成。數(shù)據(jù)庫擴(kuò)展1.主從復(fù)制,讀寫別離這種方式是指利用數(shù)據(jù)庫的復(fù)制或鏡像功能,同時在多臺數(shù)據(jù)庫上保存一樣的數(shù)據(jù),并且將讀操作和寫操作分開,寫操作集中在一臺主數(shù)據(jù)庫上,讀操作集中在多臺從數(shù)據(jù)庫上,對于讀取比寫更多的站點適合使用這種方式。如果不想在應(yīng)用程序?qū)用婢S護(hù)這種別離映射,則可以使用數(shù)據(jù)庫反向代理來自動完成對讀寫的別離。2.垂直分區(qū)對于不需要進(jìn)展聯(lián)合查詢的數(shù)據(jù)表可以分散到不同的數(shù)據(jù)庫效勞器上,這稱為垂直分區(qū);當(dāng)然每個分區(qū)自身也可以使用讀寫別離。3.水平分區(qū)將同一個表的記錄拆分到不同的表甚至是效勞器上,稱為水平分區(qū),這往往需要一個穩(wěn)定的算法來保證讀取時能正確從不同的效勞器上取得數(shù)據(jù),比方簡單的對ID取模、*圍劃分、亦或者是保存映射關(guān)系。也可以使用類似代理的產(chǎn)品spock。緩存構(gòu)建高性能web站點時,拋開根底架構(gòu)〔數(shù)據(jù)庫分區(qū)的問題也包括在根底架構(gòu)中了〕,在應(yīng)用程序、編碼層面主要要考慮的問題就是緩存的設(shè)計,合理的緩存設(shè)計可以使提供動態(tài)網(wǎng)頁效勞的性能大幅度提高。當(dāng)然,在架構(gòu)階段設(shè)計緩存解決方案,絕非簡單的技術(shù)問題,需要從業(yè)務(wù)出發(fā),再結(jié)合各種技術(shù)。下面按照一次請求的順序,對每個環(huán)節(jié)的緩存設(shè)計從技術(shù)角度進(jìn)展討論。. z.-1.客戶端緩存可以利用客戶端瀏覽器的緩存機制,來減少瀏覽器對效勞端的請求次數(shù)〔當(dāng)然在效勞端進(jìn)展圖片等資源合并,并結(jié)合css圖片定位技術(shù),也可以減少請求〕,利用好的緩存協(xié)商,可以設(shè)計出靈活的客戶端緩存方案。在頭中下面的內(nèi)容與緩存協(xié)商有關(guān):Last-Modified:動態(tài)頁面通過主動推送該值,暗示瀏覽器在下次請求同一個url的時候,優(yōu)先使用If-Modified-Since值與效勞端進(jìn)展緩存協(xié)商,如果緩存沒有過期,則效勞端可以不用重新計算動態(tài)網(wǎng)頁,通過返回304通知瀏覽器。的靜態(tài)資源往往使用這種方法。但是該方法有一個缺點:有時,文件的最后更改時間雖然改了,但是內(nèi)容卻沒有變,這樣無法充分發(fā)揮瀏覽器緩存的能力。ETag:Web效勞器為每個url生成一個散列值,增加在頭的ETag標(biāo)記中,瀏覽器會優(yōu)先使用If-None-Match加上這個散列值來協(xié)商緩存過期。通過對靜態(tài)文件的內(nèi)容進(jìn)展md5變換,可以生成散列值,這樣可以彌補Last-Modified的缺乏。但是隨之帶來的是效勞端md5變換的計算開銷。E*pires:上述兩種方式,雖然可以使效勞端多少防止了反復(fù)的動態(tài)網(wǎng)頁解析和計算,但瀏覽器還是必須通過請求來進(jìn)展協(xié)商,并沒有真正意義上減少請求的次數(shù)。通過在頭中添加E*pires標(biāo)記可以明確的告知瀏覽器過期形式,瀏覽器會徹底減少請求的次數(shù)。2.反向代理緩存在web效勞器前端,還有反向代理效勞器緩存。反向代理效勞器本質(zhì)上就是代理效勞器,只是將外網(wǎng)的請求轉(zhuǎn)發(fā)給內(nèi)網(wǎng)的web效勞器處理,他們都工作在應(yīng)用層,能夠理解協(xié)議。正向代理效勞器具有緩存、過濾等功能,反向代理效勞器同樣具有緩存的能力,而且還具備一定程度上的平安性。一切友好的動態(tài)程序同樣能夠很好的在反向代理效勞器上實現(xiàn)緩存。重量級的squid、輕量級的varnish、甚至是Ngin*這樣的web效勞器軟件,都可以勝任反向代理效勞。上述的代理效勞器軟件產(chǎn)品,通過各種配置可以緩存基于 協(xié)議的web響應(yīng)。3.Web效勞器緩存Web效勞器有可能支持基于url的緩存〔基于key-value對〕,這類似反向代理緩存。緩存通??梢酝ㄟ^配置存儲在內(nèi)存或磁盤上,在緩存有效期的問題上,通常是基于協(xié)議中的頭部信息判斷。但是使用這樣的機制需要注意:動態(tài)程序會可能變得依賴于特定的web效勞器注意編寫面向緩存友好的動態(tài)程序,會使你的動態(tài)程序更有生命力web效勞器還具有緩存文件描述符〔類似句柄〕的能力,這樣可以減少文件的open操作,同樣是一種減少系統(tǒng)調(diào)用的措施,這對于一些小文件有些效果,因為文件越小花在open上的開銷將越來越占有重要的比例。4.應(yīng)用程序緩存應(yīng)用程序本身可以對動態(tài)內(nèi)容進(jìn)展緩存,這可以表達(dá)在三個層面:. z.-動態(tài)腳本緩存:每次腳本解析都需要消耗一定的時間,為了加快這個速度,一些效勞器端腳本語言都支持動態(tài)腳本的預(yù)編譯,比方我們熟悉的ASP.NET、JSP都有所謂的中間語言,解析這些中間語言會快很多。動態(tài)腳本框架支持的緩存:一些動態(tài)腳本框架支持緩存,同樣在選型的時候要關(guān)注一下這些框架的緩存機制和原理,比方緩存如何存放,過期如何設(shè)置,是否支持局部緩存等。應(yīng)用程序自身實現(xiàn)緩存:應(yīng)用程序根據(jù)特定的業(yè)務(wù)需求獨立設(shè)計緩存。在緩存設(shè)計的具體技術(shù)上有以下幾點:緩存在內(nèi)存,這種方式的優(yōu)點就是減少了磁盤的讀寫,但是內(nèi)存有限,單機不易擴(kuò)展。緩存在分布式緩存,這種方式的優(yōu)點是減少了磁盤讀寫,并提高了可靠性和擴(kuò)展性,但是由于需要網(wǎng)絡(luò)IO,性能稍遜于單機緩存。局部頁面緩存,對于一些頁面無法完整緩存的,可以考慮局部緩存。靜態(tài)化,將靜態(tài)化可以極大的提高性能,因為用戶的請求不需要動態(tài)腳本處理。效勞器系統(tǒng)能力的制約因素:這局部內(nèi)容對于所有的效勞器〔無論是代理效勞器、web效勞器還是其他〕,都具有普遍適用的意義。多進(jìn)程、多線程的選擇和調(diào)度:進(jìn)程切換和線程切換都需要一定的系統(tǒng)開銷,通常使用多線程模型的web效勞器軟件比使用多進(jìn)程,具備更優(yōu)的性能。系統(tǒng)調(diào)用:一些需要從用戶模式切換到內(nèi)核模式的函數(shù)調(diào)用可以稱為系統(tǒng)調(diào)用,比方:翻開文件。系統(tǒng)調(diào)用會有一定程度上的開銷,減少系統(tǒng)調(diào)用是可以加快處理速度的程序設(shè)計細(xì)節(jié)。TCP保持:可以通過保持TCP來減少效勞端和客戶端之間的創(chuàng)立和關(guān)閉TCP的操作。中的Connection:Keep-Alive就有這樣的功能IO模型:由于CPU的速度遠(yuǎn)遠(yuǎn)比IO快,IO延遲往往成為性能瓶頸,因此,IO模型十分重要。各種IO模型:PIO:CPU直接干預(yù)磁盤和內(nèi)存的數(shù)據(jù)交互,即無論是數(shù)據(jù)從內(nèi)存到磁盤還是磁盤到內(nèi)存都要經(jīng)過CPU存放器。這樣的模型,可想而知,CPU有很多時間都需要等待慢速設(shè)備。DMA〔DirectMemoryAccess〕:CPU通過向DMA控制器發(fā)送指令來控制處理數(shù)據(jù),數(shù)據(jù)處理完之后通知CPU,這可以
評論
0/150
提交評論