(轉)高併發高流量的大型網站架構設計(一)

轉自:http://www.csdn.net/article/2012-01-05/310198web

Web2.0的興起,掀起了互聯網新一輪的網絡創業大潮。以用戶爲導向的新網站建設概念,細分了網站功能和用戶羣,不只成功的造就了一大批新生的網站,也極大的方便了上網的人們。但Web2.0以用戶 爲導向的理念,使得新生的網站有了新的特色——高併發,高流量,數據量大,邏輯複雜等,對網站建設也提出了新的要求。算法

本文圍繞高併發高流量的網站架構設計問題,主要研究討論瞭如下內容:緩存

首 先在整個網絡的高度討論了使用鏡像網站,CDN內容分發網絡等技術對負載均衡帶來的便利及各自的優缺點比較。而後在局域網層次對第四層交換技術,包括硬件 解決方案F5和軟件解決方案LVS,進行了簡單的討論。接下來在單服務器層次,本文着重討論了單臺服務器的Socket優化,硬盤級緩存技術,內存級緩存 技術,CPU與IO平衡技術(即以運算爲主的程序與以數據讀寫爲主的程序搭配部署),讀寫分離技術等。在應用層,本文介紹了一些大型網站經常使用的技術,以及 選擇使用該技術的理由。最後,在架構的高度討論了網站擴容,容錯等問題。服務器

本文以理論與實踐相結合的形式,結合做者實際工做中獲得的經驗,具備較普遍的適用性。網絡

1 引言架構

最近十年間,互聯網已經從一個單純的用於科研的,用來傳遞靜態文檔的美國內部網絡,發展成了一個應用於各行各業的,傳送着海量多媒體及動態信息的全球網絡。 從規模上看,互聯網在主機數、帶寬、上網人數等方面幾乎一直保持着指數增加的趨勢,2006年7月,互聯網上共有主機439,286,364 臺,WWW 站點數量達到 96,854,877個 [1]。全球上網人口在2004 年達到 7 億 2900萬 [2],中國的上網人數 在 2006 年 12 月達到了約 1億3700 萬[3]。另外一方面,互聯網所傳遞的內容也發生了巨大的變化,早期互聯網以靜態、文本的公共信息爲主 要內容,而目前的互聯網則傳遞着大量的動態、多媒體及人性化的信息,人們不只能夠經過 互聯網閱讀到動態生成的信息,並且能夠經過它使用電子商務、即時通 信、網上游戲等交互性很強的服務。所以,能夠說互聯網已經再也不僅僅是一個信息共享網絡,而已經成爲了一個無所不在的交互式服務的平臺。併發

1.1 互聯網的發展負載均衡

1.2 互聯網網站建設的新趨勢socket

互聯網不斷擴大的規模,日益增加的用戶羣,以及web2.0[4]的興起,對互聯網網站建設提出了新的要求:tcp

高 性能和高可擴展性。2000 年 5 月,訪問量排名世界第一(統計數據來源[5])的Yahoo [6]聲稱其日頁瀏覽數達到 6 億 2500 萬, 即每秒約 30,000 次HTTP 請求(按每一個頁面瀏覽平均產生 4 次請求計算) 。這樣大規模的訪問量對服務的性能提出了很是高的要求。更爲重要 的是, 互聯網受衆的普遍性,使得成功的互聯網服務的訪問量增加潛力和速度很是大,所以服務系統必須具備很是好的可擴展性,以應付未來可能的服務增加。

支持高度併發的訪問。高度併發的訪問對服務的存儲與併發能力提出了很高的要求,當前主流的超標量和超流水線處理器能處理的併發請求數是有限的,由於隨着併發 數的上升,進程調度的開銷會很快上升。互聯網廣域網的本質決定了其訪問的延遲時間較長,所以一個請求完成時間也較長,按從請求產生到頁面下載完成 3 秒 計算, Yahoo 在 2000 年 5 月時平均有 90,000 個併發請求。並且對於較複雜的服務,服務器每每要維護用戶會話的信息,例如一個互 聯網網站若是天天有 100 萬次用戶會話,每次 20分鐘的話,那平均同時就會有約 14000 個併發會話。

高 可用性。互聯網服務的全球性決定了其天天 24 小時都會有用戶訪問,所以任何服務的中止都會對用戶形成影響。而對於電子商務等應用,暫時的服務停止則意 味着客戶的永久失去及大量的經濟損失,例如ebay.com[7]1999 年 6 月的一次 22小時的網站不可訪問,對此網站的 380萬用戶的忠誠 度形成巨大影響,使得 Ebay 公司不得不支付了近500萬美圓用於補償客戶的損失,而該公司的市值同期降低了 40 億美圓[8]。所以,關鍵互聯網 應用的可用性要求很是高。

1.3 新浪播客的簡介

以 YouTube[9]爲表明的微視頻分享網站近來方興未艾,僅2006年一年,國內就出現近百家仿YouTube的微視頻分享網站[10],試圖複製 YouTube的成功模式。此類網站能夠說是Web2.0概念下的表明網站,具備Web2.0網站全部典型特徵:高併發,高流量,數據量大,邏輯複雜,用 戶分散等等。新浪[11]做爲國內最大的門戶網站,在2005年成功運做新浪博客的基礎上,於2006年末推出了新浪播客服務。新浪播客做爲國內門戶網站 中第一個微視頻分享服務的網站,依靠新浪網站及新浪博客的巨大人氣資源,在推出後不到半年的時間內,取得了巨大的成功:同類網站中上傳視頻數量第1、流量 增加最快、用戶數最多[12],全部這些成績的取得的背後,是巨大的硬件投入,良好的架構支撐和靈活的應用層軟件設計。

2.1 鏡像網站技術

鏡像網站是指將一個徹底相同的站點放到幾個服務器上,分別有本身的URL,這些服務器上的網站互相稱爲鏡像網站[13]。鏡像網站和主站並無太大差異,或 者能夠視爲主站的拷貝。鏡像網站的好處是:若是不能對主站做正常訪問(如服務器故障,網絡故障或者網速太慢等),仍能經過鏡像服務器得到服務。不便之處 是:更新網站內容的時候,須要同時更新多個服務器;須要用戶記憶超過一個網址,或須要用戶選擇訪問多個鏡像網站中的一個,而用戶選擇的,不必定是最優的。 在用戶選擇的過程當中,缺少必要的可控性。

在 互聯網發展的初期,互聯網上的網站內容不多,並且大都是靜態內容,更新頻率底。但由於服務器運算能力低,帶寬小,網速慢,熱門網站的訪問壓力仍是很大。鏡 像網站技術在這種狀況下做爲一種有效解決方案,被普遍採用。隨着互聯網的發展,愈來愈多的網站使用服務器端腳本動態生成內容,同步更新愈來愈困難,對可控 性要求愈來愈高,鏡像技術由於不能知足這類網站的須要,漸漸的淡出了人們的視線。但有一些大型的軟件下載站,由於符合鏡像網站的條件——下載的內容是靜態 的,更新頻率較低,對帶寬,速度要求又比較高,如國外的SourceForge (http://www.SourceForge.net,著名開源軟件託管網站),Fedora(http://fedoraproject.org,RedHat贊助的Linux發行版),國內的華軍軟件園(http://www.onlinedown.net),天空軟件站(http://www.skycn.com)等,還在使用這項技術(圖1)。

圖1 上圖:天空軟件站首頁的鏡像選擇頁面

下圖:SourceForge下載時的鏡像選擇頁面

在網站建設的過程當中,能夠根據實際狀況,將靜態內容做一些鏡像,以加快訪問速度,提高用戶體驗。

2.2 CDN內容分發網絡

CDN 的全稱是Content Delivery Network,即內容分發網絡。其目的是經過在現有的互聯網中增長一層新的網絡架構,將網站的內容發佈到最 接近用戶的網絡「邊緣」,使用戶能夠就近取得所需的內容,分散服務器的壓力,解決互聯網擁擠的情況,提升用戶訪問網站的響應速度。從而解決因爲網絡帶寬 小、用戶訪問量大、網點分佈不均等緣由所形成的用戶訪問網站響應速度慢的問題[14]。

CDN 與鏡像網站技術的不一樣之處在於網站代替用戶去選擇最優的內容服務器,加強了可控制性。CDN實際上是夾在網頁瀏覽者和被訪問的服務器中間的一層鏡像或者說緩 存,瀏覽者訪問時點擊的仍是服務器原來的URL地址,可是看到的內容實際上是對瀏覽者來講最優的一臺鏡像服務器上的頁面緩存內容。這是經過調整服務器的域名 解析來實現的。使用CDN技術的域名解析服務器須要維護一個鏡像服務器列表和一份來訪IP到鏡像服務器的對應表。當一個用戶的請求到來的時候,根據用戶的 IP,查詢對應表,獲得最優的鏡像服務器的IP地址,返回給用戶。這裏的最優,須要綜合考慮服務器的處理能力,帶寬,離訪問者的距離遠近等因素。當某個地 方的鏡像網站流量過大,帶寬消耗過快,或者出現服務器,網絡等故障的時候,能夠很方便的設置將用戶的訪問轉到另一個地方(圖2)。這樣就加強了可控制 性。

圖2 CDN原理示意圖

CDN 網絡加速技術也有它的侷限性。首先,由於內容更新的時候,須要同步更新多臺鏡像服務器,因此它也只適用於內容更新不太頻繁,或者對實時性要求不是很高的網 站;其次,DNS解析有緩存,當某一個鏡像網站的訪問須要轉移時,主DNS服務器更改了IP解析結果,但各地的DNS服務器緩存更新會滯後一段時間,這段 時間內用戶的訪問仍然會指向該服務器,可控制性依然有不足。

目前,國內訪問量較高的大型網站如新浪、網易等的資訊頻道,均使用CDN網絡加速技術(圖3),雖然網站的訪問量巨大,但不管在什麼地方訪問,速度都會很快。但論壇,郵箱等更新頻繁,實時性要求高的頻道,則不適合使用這種技術。

2.1 鏡像網站技術

鏡像網站是指將一個徹底相同的站點放到幾個服務器上,分別有本身的URL,這些服務器上的網站互相稱爲鏡像網站[13]。鏡像網站和主站並無太大差異,或 者能夠視爲主站的拷貝。鏡像網站的好處是:若是不能對主站做正常訪問(如服務器故障,網絡故障或者網速太慢等),仍能經過鏡像服務器得到服務。不便之處 是:更新網站內容的時候,須要同時更新多個服務器;須要用戶記憶超過一個網址,或須要用戶選擇訪問多個鏡像網站中的一個,而用戶選擇的,不必定是最優的。 在用戶選擇的過程當中,缺少必要的可控性。

在 互聯網發展的初期,互聯網上的網站內容不多,並且大都是靜態內容,更新頻率底。但由於服務器運算能力低,帶寬小,網速慢,熱門網站的訪問壓力仍是很大。鏡 像網站技術在這種狀況下做爲一種有效解決方案,被普遍採用。隨着互聯網的發展,愈來愈多的網站使用服務器端腳本動態生成內容,同步更新愈來愈困難,對可控 性要求愈來愈高,鏡像技術由於不能知足這類網站的須要,漸漸的淡出了人們的視線。但有一些大型的軟件下載站,由於符合鏡像網站的條件——下載的內容是靜態 的,更新頻率較低,對帶寬,速度要求又比較高,如國外的SourceForge (http://www.SourceForge.net,著名開源軟件託管網站),Fedora(http://fedoraproject.org,RedHat贊助的Linux發行版),國內的華軍軟件園(http://www.onlinedown.net),天空軟件站(http://www.skycn.com)等,還在使用這項技術(圖1)。

圖1 上圖:天空軟件站首頁的鏡像選擇頁面

在網站建設的過程當中,能夠根據實際狀況,將靜態內容做一些鏡像,以加快訪問速度,提高用戶體驗。

下圖:SourceForge下載時的鏡像選擇頁面

2.2 CDN內容分發網絡

CDN的全稱是Content Delivery Network,即內容分發網絡。其目的是經過在現有的互聯網中增長一層新的網絡架構,將網站的內容發佈到最 接近用戶的網絡「邊緣」,使用戶能夠就近取得所需的內容,分散服務器的壓力,解決互聯網擁擠的情況,提升用戶訪問網站的響應速度。從而解決因爲網絡帶寬 小、用戶訪問量大、網點分佈不均等緣由所形成的用戶訪問網站響應速度慢的問題[14]。

CDN與鏡像網站技術的不一樣之處在於網站代替用戶去選擇最優的內容服務器,加強了可控制性。CDN實際上是夾在網頁瀏覽者和被訪問的服務器中間的一層鏡像或者說緩 存,瀏覽者訪問時點擊的仍是服務器原來的URL地址,可是看到的內容實際上是對瀏覽者來講最優的一臺鏡像服務器上的頁面緩存內容。這是經過調整服務器的域名 解析來實現的。使用CDN技術的域名解析服務器須要維護一個鏡像服務器列表和一份來訪IP到鏡像服務器的對應表。當一個用戶的請求到來的時候,根據用戶的 IP,查詢對應表,獲得最優的鏡像服務器的IP地址,返回給用戶。這裏的最優,須要綜合考慮服務器的處理能力,帶寬,離訪問者的距離遠近等因素。當某個地 方的鏡像網站流量過大,帶寬消耗過快,或者出現服務器,網絡等故障的時候,能夠很方便的設置將用戶的訪問轉到另一個地方(圖2)。這樣就加強了可控制 性。

圖2 CDN原理示意圖

CDN網絡加速技術也有它的侷限性。首先,由於內容更新的時候,須要同步更新多臺鏡像服務器,因此它也只適用於內容更新不太頻繁,或者對實時性要求不是很高的網 站;其次,DNS解析有緩存,當某一個鏡像網站的訪問須要轉移時,主DNS服務器更改了IP解析結果,但各地的DNS服務器緩存更新會滯後一段時間,這段 時間內用戶的訪問仍然會指向該服務器,可控制性依然有不足。

目前,國內訪問量較高的大型網站如新浪、網易等的資訊頻道,均使用CDN網絡加速技術(圖3),雖然網站的訪問量巨大,但不管在什麼地方訪問,速度都會很快。但論壇,郵箱等更新頻繁,實時性要求高的頻道,則不適合使用這種技術。

圖3 新浪網使用ChinaCache CDN服務。

ChinaCache的服務節點全球超過130個,

其中中國節點超過80個,

覆蓋全國主要6大網絡的主要省份[15]。

2.3 應用層分佈式設計

新浪播客爲了得到CDN網絡加速的優勢,又必須避免CDN的不足,在應用層軟件設計上,採起了一個替代的辦法。新浪播客提供了一個供播放器查詢視頻文件地址 的接口。當用戶打開視頻播放頁面的時候,播放器首先鏈接查詢接口,經過接口得到視頻文件所在的最優的鏡像服務器地址,而後再到該服務器去下載視頻文件。這 樣,用一次額外的查詢得到了所有的控制性,而此次查詢的通信流量很是小,幾乎能夠忽略不計。CDN中由域名解析得到的靈活性也保留了下來:由接口程序維護 鏡像網站列表及來訪IP到鏡像網站的對應表便可。鏡像網站中不須要鏡像全部的內容,而是隻鏡像更新速度較慢的視頻文件。這是徹底能夠承受的。

2.4 網絡層架構小結

從整個互聯網絡的高度來看網站架構,努力的方向是明確的:讓用戶就近取得內容,但又要在速度和可控制性之間做一個平衡。對於更新比較頻繁內容,因爲難以保持鏡像網站之間的同步,則須要使用其餘的輔助技術。

3 交換層架構

3.1 第四層交換簡介

按 照OSI[16]七層模型,第四層是傳輸層。傳輸層負責端到端通訊,在IP協議棧中是TCP和UDP所在的協議層。TCP和UDP數據包中包含端口號 (port number),它們能夠惟一區分每一個數據包所屬的協議和應用程序。接收端計算機的操做系統根據端口號肯定所收到的IP包類型,並把它交給合 適的高層程序。IP地址和端口號的組合一般稱做「插口(Socket)」。

第 四層交換的一個簡單定義是:它是一種傳輸功能,它決定傳輸不只僅依據MAC地址(第二層網橋)或源/目標IP地址(第三層路由),並且依據IP地址與 TCP/UDP (第四層) 應用端口號的組合(Socket)[17]。第四層交換功能就像是虛擬IP,指向實際的服務器。它傳輸的數據支持多種協議, 有HTTP、FTP、NFS、Telnet等。

以HTTP協議爲例,在第四層交換中爲每一個服務器組設立一個虛擬IP(Virtue IP,VIP),每組服務器支持某一個或幾個域名。在域名服務器(DNS)中存儲服務器組的VIP,而不是某一臺服務器的真實地址。

當 用戶請求頁面時,一個帶有目標服務器組的VIP鏈接請求發送給第四層交換機。第四層交換機使用某種選擇策略,在組中選取最優的服務器,將數據包中的目標 VIP地址用實際服務器的IP地址取代,並將鏈接請求傳給該服務器。第四層交換通常都實現了會話保持功能,即同一會話的全部的包由第四層交換機進行映射 後,在用戶和同一服務器間進行傳輸[18]。

第四層交換按實現分類,分爲硬件實現和軟件實現。

3.2 硬件實現

第 四層交換的硬件實現通常都由專業的硬件廠商做爲商業解決方案提供。常見的有Alteon[19],F5[20]等。這些產品很是昂貴,可是可以提供很是優 秀的性能和很靈活的管理能力。Yahoo中國當初接近2000臺服務器使用了三四臺Alteon就搞定了[21]。鑑於條件關係,這裏不展開討論。

3.3 軟件實現

第 四層交換也能夠經過軟件實現,不過性能比專業硬件稍差,可是知足必定量的壓力仍是能夠達到的,並且軟件實現配置起來更靈活。 軟件四層交換經常使用的有 Linux上的LVS(Linux Virtual Server),它提供了基於心跳(heart beat)的實時災難應對解決方案,提升了系統的魯 棒性,同時提供了靈活的VIP配置和管理功能,能夠同時知足多種應用需求[22]。

4 服務器優化

4.1 服務器總體性能考慮

對 於價值昂貴的服務器來講,怎樣配置才能發揮它的最大功效,又不至於影響正常的服務,這是在設計網站架構的時候必需要考慮的。常見的影響服務器的處理速度的 因素有:網絡鏈接,硬盤讀寫,內存空間,CPU速度。若是服務器的某一個部件滿負荷運轉仍然低於須要,而其餘部件仍有能力剩餘,咱們將之稱爲性能瓶頸。服 務器想要發揮最大的功效,關鍵的是消除瓶頸,讓全部的部件都被充分的利用起來。

4.2 Socket優化

以 標準的 GNU/Linux 爲例。GNU/Linux 發行版試圖對各類部署狀況都進行優化,這意味着對具體服務器的執行環境來講,標準的發行版可能並 不是最優化的[23]。GNU/Linux 提供了不少可調節的內核參數,可使用這些參數爲服務器進行動態配置,包括影響 Socket 性能的一些重 要的選項。這些選項包含在 /proc 虛擬文件系統中。這個文件系統中的每一個文件都表示一個或多個參數,它們能夠經過 cat 工具進行讀取,或使 用 echo 命令進行修改。這裏僅列出一些影響TCP/IP 棧性能的可調節內核參數[24]:

/proc/sys/net/ipv4/tcp_window_scaling 「1」(1表示啓用該選項,0表示關閉,下同) 啓用 RFC[25] 1323[26] 定義的 window scaling;要支持超過 64KB 的窗口,必須啓用該值。

/proc /sys/net/ipv4/tcp_sack 「1」啓用有選擇的應答(Selective Acknowledgment),經過有選擇地應答亂序接 收到的報文來提升性能(這樣可讓發送者只發送丟失的報文段);對於廣域網通訊來講,這個選項應該啓用,可是這也會增長對 CPU 的佔用。

/proc/sys/net/ipv4/tcp_timestamps 「1」 以一種比重發超時更精確的方法(參閱 RFC 1323)來啓用對 RTT 的計算;爲了實現更好的性能應該啓用這個選項。

/proc /sys/net/ipv4/tcp_mem 「24576 32768 49152」 肯定 TCP 棧應該如何反映內存使用;每一個值的單位都是內存頁 (一般是 4KB)。第一個值是內存使用的下限。第二個值是內存壓力模式開始對緩衝區使用應用壓力的上限。第三個值是內存上限。超過這個上限時能夠將報文 丟棄,從而減小對內存的使用。

/proc /sys/net/ipv4/tcp_wmem 「4096 16384 131072」 爲自動調優定義每一個 socket 使用的內存。第一個值是 爲 socket 的發送緩衝區分配的最少字節數。第二個值是默認值(該值會被 wmem_default 覆蓋),緩衝區在系統負載不重的狀況下能夠增 長到這個值。第三個值是發送緩衝區空間的最大字節數(該值會被 wmem_max 覆蓋)。

/proc/sys/net/ipv4/tcp_westwood 「1」 啓用發送者端的擁塞控制算法,它能夠維護對吞吐量的評估,並試圖對帶寬的總體利用狀況進行優化;對於 WAN 通訊來講應該啓用這個選項。

與 其餘調優努力同樣,最好的方法實際上就是不斷進行實驗。具體應用程序的行爲、處理器的速度以及可用內存的多少都會影響到這些參數對性能做用的效果。在某些 狀況中,一些認爲有益的操做可能偏偏是有害的(反之亦然)。所以,須要逐一試驗各個選項,而後檢查每一個選項的結果,最後得出最適合具體機器的一套參數。

若是重啓了 GNU/Linux 系統,設置的內核參數都會恢復成默認值。爲了將所設置的值做爲這些參數的默認值,可使用 /etc/rc.local 文件,在系統每次啓動時自動將這些參數配置成所須要的值。

在檢測每一個選項的更改帶來的效果的時候,GNU/Linux上有一些很是強大的工具可使用:

  • ping 這是用於檢查主機的可用性的最經常使用的工具,也能夠用於計算網絡帶寬延時。
  • traceroute 打印鏈接到特定網絡主機所通過的一系列路由器和網關的路徑(路由),從而肯定每一個 hop 之間的延時。
  • netstat 肯定有關網絡子系統、協議和鏈接的各類統計信息。
  • tcpdump 顯示一個或多個鏈接的協議級的報文跟蹤信息,其中包括時間信息,可使用這些信息來研究不一樣協議的報文時間。
  • Ethereal 以一個易於使用的圖形化界面提供 tcpump (報文跟蹤)的信息,支持報文過濾功能。
  • iperf 測量 TCP 和 UDP 的網絡性能;測量最大帶寬,並彙報延時和數據報的丟失狀況。
相關文章
相關標籤/搜索