CDN技術(shù)詳解
197 ,7.1 CDN概述 CDN 是Content Delivery Network 首字母縮寫,譯成中文就是內(nèi)容分發(fā)網(wǎng)絡(luò)。使用CDN 技術(shù)的主要目的在于增加訪問速度
197
,7.1 CDN概述 CDN 是Content Delivery Network 首字母縮寫,譯成中文就是內(nèi)容分發(fā)網(wǎng)絡(luò)。使用
CDN 技術(shù)的主要目的在于增加訪問速度、解決南北互聯(lián)(中國適用)、提高用戶體驗等。
最早的商業(yè)CDN 服務(wù)可能誕生于1999年,但本人聞之CDN 這個業(yè)務(wù)則是2005年的事情了。到了2006年的春天,我有幸得到一個CDN 設(shè)計方面的工作,這才有機會全面了解CDN 原理、設(shè)計、部署以及運營等。
7.1.1 為什么使用CDN
(1)解決網(wǎng)站高流量、大并發(fā)的問題。我們知道,任何一個物理設(shè)備,其負(fù)載都有一個極限。為了應(yīng)對訪問量突增,使用CDN 服務(wù)是一個好的系統(tǒng)擴容方案。
(2)解決南北互聯(lián)問題。我國的網(wǎng)絡(luò)是劃江而治的格局,因為利益之爭,各網(wǎng)絡(luò)服務(wù)商之間并不是通力協(xié)作,而是采取各種手段相互限制。這就導(dǎo)致各網(wǎng)之間的互聯(lián)互通存在很大的問題,具體表現(xiàn)為:電信的用戶訪問放置在網(wǎng)通機房的服務(wù)器,響應(yīng)時間特別長,反之亦然。使用CDN 技術(shù),可以讓電信的用戶訪問電信的內(nèi)容緩存服務(wù)器,網(wǎng)通的用戶訪問網(wǎng)通的內(nèi)容緩存服務(wù)器。通過這樣一種策略,繞開了網(wǎng)絡(luò)運營商之間人為設(shè)置的障礙。
(3)訪問加速。CDN 采用緩存技術(shù),把訪問對象緩存起來,有的技術(shù)甚至能把對象緩存到內(nèi)存(如Varnish ),這在效果上表現(xiàn)出來的即是訪問加速。
(4)降低總體運營成本。在一些互聯(lián)互通比較好的第三方BGP 機房,其帶寬費高達(dá)300 ~ 400元/兆/月,而二、
三線城市單線接入的帶寬費100M 一年的費用才5萬左右。使用CDN 運營方案,我們把源站放在BGP 機房,而把緩存服務(wù)器放置在帶寬費用較低的其他地方。因為CDN 的大部分流量被轉(zhuǎn)移到緩存服務(wù)器上,源站只有較小的訪問請求,因此總體運營成本大幅降低。
(5)提高網(wǎng)站的可用性。源站的訪問量變得很小,這意味著源站系統(tǒng)有更低的負(fù)載,更低的磁盤I/O,防故障的幾率大大降低。對于緩存服務(wù)器,多個服務(wù)器做成集群,保證了整個系統(tǒng)的高可用。
198
第7章 簡單CDN (6)防DDOS 攻擊。攻擊負(fù)載被分配到不同的物理服務(wù)器,客觀上起到防DDOS 的作用。
7.1.2 CDN適用的場合
任何一門技術(shù),都有一定的適用范圍,CDN 也不例外。實踐證明,CDN 對于靜態(tài)對象的加速和發(fā)布具有很好的效果,但對于動態(tài)的網(wǎng)站,則效果不佳。為了使用CDN 技術(shù)所帶來的好處,我們可以通過動態(tài)內(nèi)容靜態(tài)化、靜態(tài)內(nèi)容分離(如動態(tài)站點里的圖片)等方式,來加速訪問和增強用戶體驗。
有哪些對象是靜態(tài)可緩存的呢?這包括html 頁面文件、視頻文件、JS 文件、CSS 文件、EXE 文件、圖片文件(JPEG 、GIF 、PNG )等。
7.1.3 CDN的組成
CDN 是一種組合技術(shù),包括源站、緩存服務(wù)器、智能DNS 、客戶端等幾個部分。 ? 源站指發(fā)布內(nèi)容的原始站點。新增、刪除和更改網(wǎng)站的文件,都是在源站上進(jìn)
行的;緩存服務(wù)器抓取的對象也全部來自于源站。
緩存服務(wù)器是直接提供給用戶訪問的站點資源,有一個或數(shù)個服務(wù)器組成;當(dāng)一個用戶發(fā)起訪問時,他的訪問請求被智能DNS 定位到離他較近的緩存服務(wù)器。如果訪問所需的內(nèi)容沒有被緩存,則緩存服務(wù)器向鄰近的緩存服務(wù)器或直接向源站抓取內(nèi)容,然后再返還給用戶;如果用戶所請求的內(nèi)容剛好在緩存里面,則直接把內(nèi)容返還給用戶。
智能DNS 是整個CDN 的核心,它負(fù)責(zé)根據(jù)用戶的來源,將其訪問請求轉(zhuǎn)向到離用戶較近或較合適的緩存服務(wù)器,如把長沙電信的用戶請求轉(zhuǎn)向到長沙電信機房的緩存服務(wù)器。實現(xiàn)智能DNS 的一種技術(shù)是:Bind View ,在Bind 9以后的版本,都應(yīng)該支持View 視圖這個功能。另外還有一個方案,即DNS 輪詢方式。
客戶端即發(fā)起訪問的普通用戶,一般的訪問方式是瀏覽器。這個不再做說明。 ? ? ?
除了前面列舉的組件外,還有一個可選項目,即用來進(jìn)行內(nèi)部域名以及源站的域名解析。因為是可選的,因此也可以通過使用本地hosts 指定主機名來代替。
199
接下來,我們以圖示來總結(jié)一下CDN 各組件間的關(guān)系和訪問流程。
圖7-1 CDN 各部分間的關(guān)系
圖7-1展示了兩種比較典型的訪問場景,這兩種場景,基本上能反映整個CDN 的工作機制。
? 場景一:當(dāng)“A 網(wǎng)用戶”訪問被CDN 加速的站點 http://www.formyz.cn時,
從本地的DNS 查詢域名,最終可能在全局智能DNS 服務(wù)器得到域名所對應(yīng)的IP 地址,即圖7-1所示“A 網(wǎng)的緩存服務(wù)器”的IP ;接著“A 網(wǎng)用戶”瀏覽器向“A 網(wǎng)的緩存服務(wù)器”發(fā)起訪問請求,幸運的是所需的默認(rèn)頁面文件index.htm 正好被緩存在“A 網(wǎng)的緩存服務(wù)器”里,于是緩存服務(wù)器立即返還數(shù)據(jù),完成一次訪問請求。
? 場景二:當(dāng)“B 網(wǎng)用戶”訪問被CDN 加速的站點 http://www.formyz.cn時,
從本地的DNS 查詢域名,最終可能在全局智能DNS 服務(wù)器得到域名所對應(yīng)的IP 地址,即圖7-1所示“B 網(wǎng)的緩存服務(wù)器”的IP ;接著“B 網(wǎng)用戶”瀏覽器向“B 網(wǎng)的緩存服務(wù)器”發(fā)起訪問請求,但是緩存服務(wù)器并沒有緩存默認(rèn)頁面文件index.html ,它需要先從源站取得這個對象,緩存并把內(nèi)容返還給“B 網(wǎng)用戶”。“B 網(wǎng)緩存服務(wù)器”通過“內(nèi)部DNS ”知道源站在哪里。
7.1.4 CDN的基本特點
CDN 的基本特點可概括為:內(nèi)容緩存、就近訪問以及以DNS 視圖方式根據(jù)用戶來200
第7章 簡單CDN 源確定其訪問位置。
? 內(nèi)容緩存:緩存服務(wù)器從源站取得所需數(shù)據(jù),然后暫存在本地的硬盤或內(nèi)存。
使用這種緩存機制的好處是:內(nèi)容自動更新;無多個服務(wù)器數(shù)據(jù)相互同步問題。 就近訪問:讓用戶的訪問請求轉(zhuǎn)向到離用戶最近或最易于訪問的緩存服務(wù)器。 以DNS 視圖方式根據(jù)用戶來源確定其訪問位置:即讓電信的用戶訪問電信的緩存服務(wù)器,網(wǎng)通的用戶訪問網(wǎng)通的緩存服務(wù)器。 ? ?
7.1.5 什么是簡單CDN
簡單CDN 這個概念,是相對于復(fù)雜CDN 來定義的。因此,我們先來了解一下什么是復(fù)雜的CDN 。
籠統(tǒng)一點講,CDN 服務(wù)提供商所運營的環(huán)境,就是復(fù)雜CDN 。就緩存服務(wù)器而言,其結(jié)構(gòu)是分層次的,一般可劃分為核心節(jié)點和邊緣節(jié)點,并且同一層級的相鄰節(jié)點之間又可形成姐妹關(guān)系,亦即在同一個集群下的節(jié)點互為姐妹關(guān)系。為了保證最高的性能和效率,不提倡跨網(wǎng)或跨物理范圍的節(jié)點形成姐妹關(guān)系。為了更直觀地理解這個結(jié)構(gòu)和由此產(chǎn)生的好處,這里以一個最長訪問路徑的圖示來說明,如圖7-2所示。
源站服務(wù)器
圖7-2 緩存服務(wù)器相互關(guān)系
201
,說明如下: (1)用戶向某邊緣服務(wù)器(邊緣A )發(fā)起訪問請求,所需內(nèi)容沒有被緩存。 (2)邊緣服務(wù)器(邊緣A )于是詢問其鄰居,是否緩存了用戶所需的請求對象,鄰居節(jié)點也沒有緩存所需的對象。 (3)邊緣服務(wù)器(邊緣A )轉(zhuǎn)而向某個父節(jié)點(核心A )請求文件,如果該父節(jié)
點仍然無所需的文件,則該父節(jié)點詢問其鄰居;如果鄰居也沒有所需的文件,則把請求轉(zhuǎn)給源站。
(4)源站返回數(shù)據(jù)給核心節(jié)點(核心A ),并緩存數(shù)據(jù)在該節(jié)點。
(5)核心節(jié)點(核心A )返還數(shù)據(jù)給邊緣節(jié)點(邊緣A ),并緩存數(shù)據(jù)在該節(jié)點。
(6)邊緣節(jié)點返還數(shù)據(jù)給用戶,一次最長路徑的訪問完成。
這種分層機制,既能保證最高的可用性,又能最大限度地減少向上一級節(jié)點的網(wǎng)絡(luò)流量。
除了緩存服務(wù)器結(jié)構(gòu)上的差異外,復(fù)雜CDN 還具備以下一些特性。
? 緩存服務(wù)器布點范圍廣,服務(wù)器數(shù)量龐大。
? 復(fù)雜的日志處理系統(tǒng)。因為計費依賴于訪問日志。
? 詳細(xì)的視圖劃分。例如精確到每個省的IP 地址段。
? 預(yù)加載機制。
當(dāng)我們了解了復(fù)雜CDN 以后,再來了解簡單CDN 就容易多了。所謂簡單CDN
,就是節(jié)點層次簡單、服務(wù)器數(shù)量有限、能實現(xiàn)有限規(guī)模站點加速和發(fā)布的平臺。通常情況下,我們不必為實現(xiàn)CDN 帶來的好處而部署復(fù)雜的
CDN 系統(tǒng),這將花費巨大的人力、物力。
7.2 簡單CDN 的設(shè)計
202
第7章 簡單CDN 7.2.1 簡單CDN 設(shè)計的基本原則
簡單CDN 設(shè)計主要考慮以下幾點。
? 選點合理,能覆蓋大部分網(wǎng)絡(luò)用戶。最起碼得在電信和網(wǎng)通機房放置緩存服務(wù)
器,如果經(jīng)費充裕,把教育網(wǎng)也考慮進(jìn)來。
系統(tǒng)本身具備很好的高可用特性。用戶的訪問主要集中在緩存服務(wù)器,緩存服務(wù)器之間使用集群技術(shù)就能得到比較高的系統(tǒng)可用性。
核算自建簡單CDN 的成本,使之有較好的性價比。如果自建一個CDN 遠(yuǎn)比購買CDN 服務(wù)商所花費的資金還高(目前國內(nèi)商用CDN 每兆帶寬為50元/月,基數(shù)是1G ),基本上沒必要自己建立CDN 了。
系統(tǒng)應(yīng)該具備很好的伸縮能力,以適應(yīng)各種業(yè)務(wù)變化。如增加布點、增加設(shè)備、增加站點等。 ? ? ?
7.2.2 需求描述
欲對3個Web 服務(wù)進(jìn)行加速。為了描述方便,使用域名來進(jìn)行說明。這3個加速站點為圖片站點 images.sery.cn 、下載站點dl.sery.cn 、主站 www.sery.cn ,3個站點全部是靜態(tài)內(nèi)容,其頁面文件主要是.html (htm )、.exe 、.css 、.jpeg 、.js 等,非常適合被緩存。
服務(wù)的主要目標(biāo)用戶包括電信線路的用戶、網(wǎng)通線路的用戶、教育網(wǎng)的用戶,其他線路的用戶(如科技網(wǎng)、長城寬帶等)訪問請求被轉(zhuǎn)向到網(wǎng)通線路的緩存服務(wù)器。為了實現(xiàn)這個目標(biāo),我們可能需要放置4組服務(wù)器來做緩存,即電信1組,網(wǎng)通2組,教育網(wǎng)1組。
7.2.3 簡單CDN 的設(shè)計
需求明確之后,接下來的設(shè)計工作包括:布點選取、工具選取、CDN 結(jié)構(gòu)設(shè)計等幾部分。
1.布點選取
布點包括源站、全局智能DNS 和緩存服務(wù)器集群。
? 源站及全局智能DNS 選擇互聯(lián)互通性較好的第三方BGH 機房;因為使用CDN
服務(wù)的站點數(shù)量有限,故在緩存服務(wù)器以主機名的方式尋址源站。
203
,? 緩存服務(wù)器共4組,選擇二線或三線城市的機房托管,能節(jié)省大量的資金(北京、上海等城市帶寬價格大概在300 ~ 400元/兆/月,而偏遠(yuǎn)一點二三線城市(如安陽)1G 帶寬的年總費用才8 ~ 10萬)。 2.工具選取
工具包括操作系統(tǒng)、DNS 軟件、緩存服務(wù)器軟件、負(fù)載均衡軟件、源站軟件以及定制的腳本。
? 所有的服務(wù)器均使用32位的CentOS 5.x。曾經(jīng)使用過64位的系統(tǒng),但在執(zhí)行
緩存服務(wù)器的緩存清理操作時,有些小問題。
? DNS 使用Bind-9.4.0。低于9.4.0的版本,可能不支持視圖View ,沒有視圖功
能,智能DNS 就無法實現(xiàn)。
? 緩存服務(wù)器有兩種選擇,一種是Squid ,另一種是Varnish 。Squid 多用在復(fù)雜
CDN 場景,它能實現(xiàn)緩存服務(wù)器間的層級關(guān)系(鄰居形成姊妹、邊緣節(jié)點與核心節(jié)點形成父子關(guān)系),功能強大而配置復(fù)雜;Varnish 為后起之秀,配置簡單而性能卓越,維護(hù)起來也比較簡單,因此本案選擇Varnish 作為緩存工具。
? 負(fù)載均衡由Ipvsadm 和Keepalived 兩部分組成。Ipvsadm 是核心,負(fù)責(zé)包轉(zhuǎn)發(fā)
和負(fù)載分?jǐn)?;Keepalived 為框架,負(fù)責(zé)故障隔離和失敗切換FailOver 。
? 可做Web 服務(wù)的軟件比較多,因為站點為簡單的靜態(tài)文件,選擇Nginx 比較
省事。
? 定制腳本的主要目的是自動刷新緩存服務(wù),把這個腳本放在某個服務(wù)器上,
只需執(zhí)行一次(也可使用Crontab 自動調(diào)用)就能實現(xiàn)所有緩存服務(wù)器的緩存清理。
3.CDN 結(jié)構(gòu)設(shè)計
我們可以根據(jù)CDN 的角色來設(shè)計整個結(jié)構(gòu),這些角色包括源站、智能DNS 及緩存服務(wù)器3大部分,根據(jù)布點選擇和其他因素綜合考慮,可以繪出整個CDN 的布局結(jié)構(gòu)圖如圖7-3所示。
204
第7章 簡單CDN
圖7-3 CDN 服務(wù)器布局
從圖7-3中可以看出有兩組緩存服務(wù)器放置在網(wǎng)通機房,這兩組服務(wù)器不在同一個物理位置。這樣做的主要目的是:Bind 規(guī)劃視圖View 時,能收集到的地址比較有限,不再收集列表的其他IP 地址段,則統(tǒng)統(tǒng)轉(zhuǎn)發(fā)給網(wǎng)通B 機房的服務(wù)器;另外網(wǎng)通B 機房的帶寬比較便宜,機器數(shù)量也比較多,跟其他網(wǎng)段的互聯(lián)互通還可以。
(1)源站
源站為內(nèi)容的原始發(fā)布,盡管采用CDN 技術(shù)以后源站的負(fù)荷會變得很小,但為了有較高的可用性,可以把它部署成負(fù)載均衡集群。
(2)智能DNS
智能DNS 是用來實現(xiàn)用戶訪問轉(zhuǎn)向功能的,即通過建立訪問列表,判斷用戶的訪問來源,確定其訪問對象的位置。在本案中,建立電信、網(wǎng)通、教育網(wǎng)3個IP 地址列表,未在這3個列表中的稱為其他;每個列表關(guān)聯(lián)一個Bind 的視圖View ,那么一共有4個視圖View 。地址列表可以自己收集,也可以花錢購買,地址列表越大,DNS 定向準(zhǔn)確性越高。
(3)緩存服務(wù)器
緩存服務(wù)器是CDN 環(huán)境使用量最大的設(shè)備。為保證緩存服務(wù)本身的高可用,每個布點的服務(wù)器都以負(fù)載均衡集群的方式存在。根據(jù)以往的經(jīng)驗,訪問負(fù)荷比較重的機器,非常容易損壞硬盤,因此在設(shè)計時,盡可能地緩存內(nèi)容到內(nèi)存中,以增加訪問的速度和延長機器的壽命。據(jù)說,一些CDN 運營商已經(jīng)開始用固態(tài)盤來做緩存空間。
205
在簡單CDN 的運行環(huán)境中,由于我們所使用的資源有限(服務(wù)器數(shù)量有限、帶寬有限),很可能出現(xiàn)超負(fù)荷運行的情況,如單個服務(wù)器TCP 連接數(shù)過高、CPU 負(fù)載過大、流量峰值帶寬超出合同規(guī)定的范圍等。為了隨時掌握整個系統(tǒng)的運行情況,并能對其進(jìn)行快速反應(yīng)和調(diào)整,因此必須有監(jiān)控系統(tǒng)對其服務(wù)、資源進(jìn)行實時監(jiān)控。 為了對設(shè)計有一個整體把握,將上文所做的敘述做一個匯總,如表7-1所示。
表7-1 CDN設(shè)計匯總
7.3 簡單CDN 的實現(xiàn)
這里所講“簡單CDN 的實現(xiàn)”主要偏重于技術(shù)上的實現(xiàn),即怎么部署相應(yīng)的服務(wù)和運行它。根據(jù)從簡到繁的順序,我們依次描述源站、緩存服務(wù)器及全局智能DNS 的部署及運行。
7.3.1 源站的部署和運行
源站W(wǎng)eb 服務(wù)既可以是Apache ,也可以是Nginx 。基于性能和部署簡單考慮,選用Nginx 做Web 工具。
1.安裝Nginx
(1)下載最新的穩(wěn)定版到當(dāng)前目錄:
206