1. 程式人生 > >計算機網路--詳解CDN

計算機網路--詳解CDN

注:本文內容摘抄自CDN詳解 — 不挑食的程式設計師,博主在其基礎上進行了少量修改並加入了部分原創,感謝,侵刪~

之前我們已經學習過快取機制以及Web代理,但對於大型網站的構建,這些還遠遠不夠。要想真正的構建一個流行的網站,內容分發網路(Content Delivery Network)簡稱CDN,是一項不可或缺的技術。

什麼是CDN?

以下內容摘自維基百科:

內容分發網路(CDN)是指一種通過網際網路互相連線的計算機網路系統,利用最靠近每位使用者的伺服器,更快、更可靠地將音樂、圖片、視訊、應用程式及其他檔案傳送給使用者。

如果對整個CDN系統做一個簡單的描述:

CDN系統主要由4大部分組成,每部分都由叢集所構成。這4部分分別由CDN專屬DNS伺服器、全域性負載均衡裝置、區域負載均衡裝置、CDN快取伺服器(邊緣節點)構成。除過CDN專屬DNS伺服器,其他3部分叢集都有源伺服器上對應資源的全部或部分副本。CDN系統通過各部分的負載均衡演算法,最終指示客戶端使用附近最優的邊緣節點中的一臺快取伺服器作為服務端,從而提高Web應用的效能。

CDN的基本工作過程

在傳統的Web模型中,發出請求後一般要經過如下幾個步驟:

  1. 使用者在自己的瀏覽器中輸入要訪問的網站域名。
  2. 瀏覽器向本地DNS伺服器請求對該域名的解析。
  3. 本地DNS伺服器中如果快取有這個域名的解析結果,則直接響應使用者的解析請求。
  4. 本地DNS伺服器中如果沒有關於這個域名的解析結果的快取,則以迭代方式向整個DNS系統請求解析,獲得應答後將結果反饋給瀏覽器。
  5. 瀏覽器得到域名解析結果,就是該域名相應的服務裝置的IP地址 。
  6. 瀏覽器獲取IP地址之後,經過標準的TCP握手流程,建立TCP連線。
  7. 瀏覽器向伺服器發起HTTP請求。
  8. 伺服器將使用者請求內容傳送給瀏覽器。
  9. 經過標準的TCP揮手流程,斷開TCP連線。

在網站和使用者之間加入CDN以後,使用者不會有任何與原來不同的感覺。從巨集觀上來看,一個典型的CDN使用者訪問排程流程如下:

  1. 當用戶點選網站頁面上的內容URL,先經過本地DNS系統解析,如果本地DNS伺服器沒有相應域名的快取,則本地DNS系統會將域名的解析權交給CNAME指向的CDN專用DNS伺服器
  2. CDN的DNS伺服器將CDN的 全域性負載均衡裝置 IP地址返回給使用者。
  3. 使用者向CDN的全域性負載均衡裝置發起URL訪問請求。
  4. CDN全域性負載均衡裝置根據使用者IP地址,以及使用者請求的URL,選擇一臺使用者所屬區域的區域負載均衡裝置,並將請求轉發到此裝置上。
  5. 基於以下這些條件的綜合分析之後,區域負載均衡裝置會選擇一個最優的快取伺服器節點
    ,並從快取伺服器節點處得到快取伺服器的IP地址,最終將得到的IP地址返回給全域性負載均衡裝置:
    • 根據使用者IP地址,判斷哪一個邊緣節點距使用者最近;
    • 根據使用者所請求的URL中攜帶的內容名稱,判斷哪一個邊緣節點上有使用者所需內容;
    • 查詢各個邊緣節點當前的負載情況,判斷哪一個邊緣節點尚有服務能力。
  6. 全域性負載均衡裝置把伺服器的IP地址返回給使用者。
  7. 使用者向快取伺服器發起請求,快取伺服器響應使用者請求,將使用者所需內容傳送到使用者終端。如果這臺快取伺服器上並沒有使用者想要的內容,而區域均衡裝置依然將它分配給了使用者,那麼這臺伺服器就要向它的上一級快取伺服器請求內容,直至追溯到網站的源伺服器將內容拉到本地。

CDN全域性負載均衡裝置與CDN區域負載均衡裝置根據使用者IP地址,將域名解析成相應節點中快取伺服器的IP地址,實現使用者就近訪問,從而提高服務端響應內容的速度。

理論上,最簡單的CDN網路只有一個CDN專用DNS伺服器,一個全域性負載均衡裝置,然後各節點一臺快取伺服器,即可執行。

CDN的部署架構

CDN系統設計的首要目標是儘量減少使用者的訪問響應時間,為達到這一目標,CDN系統應該儘量將使用者所需要的內容存放在距離使用者最近的位置。也就是說,負責為使用者提供內容服務的快取裝置應部署在物理上的網路邊緣位置,我們稱這一層為CDN邊緣層。CDN系統中負責全域性性管理和控制的裝置組成中心層,中心層同時儲存著基本上最完善的內容副本,當邊緣層裝置未命中時,會向中心層請求,如果在中心層仍未命中,則需要中心層向源站回源。

不同CDN系統設計之間存在差異,中心層可能具備使用者服務能力,也可能不直接提供服務,只向下級節點提供內容。如果CDN網路規模較大,邊緣層裝置直接向中心層請求內容或服務會造成中心層裝置壓力過大,就要考慮在邊緣層和中心層之間部署一個區域層,負責一個區域的管理和控制,也儲存部分內容副本供邊緣層訪問。

實際上,邊緣層、區域層、中心層分別對應於邊緣節點、區域負載均衡裝置、全域性負載均衡裝置。

節點是CDN系統中最基本的部署單元,每個節點都是由伺服器叢集組成。一個CDN系統由大量的、地理位置上分散的POP(point-of-presence)節點組成,為使用者提供就近的內容訪問服務。

CDN節點網路主要包含CDN骨幹點和POP點。CDN骨幹點和CDN POP點在功能上不同。

中心和區域節點一般稱為骨幹點,主要作為內容分發和邊緣未命中時的服務點;

邊緣節點又被稱為POP(point-of-presence)節點,CDN POP點主要作為直接向用戶提供服務的節點。

從節點構成上來說(微觀上),CDN骨幹點、POP點都由快取裝置和本地負載均衡裝置構成,它與全域性負載均衡裝置及區域負載均衡裝置屬於不同視角下的東西,可以分開實現,也可以抽象出介面,對上層透明。

快取裝置和本地負載均衡裝置的連線方式有兩種:一種是旁路方式,一種是穿越方式。我們只說穿越方式。

在穿越方式下,SLB(Server Load Balancer)本地負載均衡一般由L4-7交換機實現,SLB向外提供可訪問的公網IP地址,我們可以將其稱之為VIP。每臺快取伺服器僅分配私網IP地址,該臺SLB下的所有快取伺服器構成一個服務組。所有使用者請求和媒體流都經過該SLB裝置,再由SLB裝置進行向上向下轉發。SLB實際上承擔了NAT(Network Address Translation,網路地址轉換)功能,向用戶遮蔽了單臺快取伺服器裝置的IP地址。

也就是說,我們所訪問的全域性負載均衡裝置,區域負載均衡裝置,CDN邊緣節點伺服器的IP地址,實際上都是VIP。這種方式是CDN系統中應用較多的方式,優點是具有較高的安全性和可靠性。

CDN的功能架構

CDN基於這樣的原理:

  1. 挑選最優裝置為使用者提供服務;
  2. 如果某個內容被很多使用者所需要,它就被快取到距離使用者最近的節點中。

CDN公司在整個網際網路上部署數以百計的CDN伺服器(Cache),這些伺服器通常在運營商的IDC(網際網路資料中心Internet Data Center)中,儘量靠近接入網路和使用者。當內容的提供者更新內容時,CDN向快取伺服器重新分發這些被重新整理的內容。CDN提供一種機制,當用戶請求內容時,該內容能夠由以最快速度交付的快取伺服器來向用戶提供,這個挑選”最優”的過程就叫做負載均衡。被選中的最優快取伺服器可能最靠近使用者,或者有一條與使用者之間條件最好的路徑。

關於國內有名的CDN公司,我們熟知的包括阿里雲、騰訊雲、百度雲等等,他們都對外提供CDN服務。

從功能上劃分,典型的CDN系統架構由分發服務系統、負載均衡系統和運營管理系統三大部分組成。

分發服務系統

該系統的主要作用是實現將內容從內容源中心向邊緣的推送和儲存,承擔實際的內容資料流的全網分發工作和麵向終端使用者的資料請求服務。分發服務系統最基本的工作單元就是許許多多的快取伺服器,快取伺服器負責直接響應終端使用者的訪問請求,把快取在本地的內容快速地提供給使用者。同時快取伺服器還負責與源站點進行內容同步,把更新的內容以及本地沒有的內容從源站點獲取並儲存在本地。

一般來說,根據承載內容型別和服務種類的不同,分發服務系統會分為多個子服務系統,如網頁加速子系統、流媒體加速子系統、應用加速子系統等。每個子服務系統都是一個分散式服務叢集,由一群功能近似的、在地理位置上分佈部署的快取伺服器或快取伺服器叢集組成,彼此間相互獨立。每個子服務系統裝置叢集的數量根據業務發展和市場需要的不同,少則幾十臺,多則可達上萬臺,對外形成一個整體,共同承擔分發服務工作。快取伺服器裝置的數量、規模、總服務能力是衡量一個CDN系統服務能力的最基本的指標。

分發服務系統在承擔內容的更新、同步和響應使用者需求的同時,還需要向上層的排程控制系統提供每個快取伺服器的健康狀況資訊、響應情況,有時還需要提供內容分佈資訊,以便排程控制系統根據設定的策略決定由哪個快取伺服器(組)來響應使用者的請求最優。

負載均衡系統

負載均衡系統是一個CDN系統的神經中樞,主要功能是負責對所有發起服務請求的使用者進行訪問排程,確定提供給使用者的最終實際訪問地址。大多數CDN系統的負載均衡系統是分級實現的,這裡以最基本的兩級排程體系進行簡要說明。一般而言,兩級排程體系分為全域性負載均衡(GSLB)和本地負載均衡(SLB)

我們剛說的全域性負載均衡裝置及區域負載均衡裝置都屬於全域性負載均衡,本地負載均衡裝置則屬於本地負載均衡。

其中,全域性負載均衡(GSLB)主要根據使用者就近性原則,通過對每個服務節點進行”最優”判斷,確定向用戶提供服務的快取伺服器叢集的物理位置。最通用的GSLB實現方法是基於DNS解析的方式實現,也有一些系統採用了應用層重定向等方式來解決。本地負載均衡(SLB)主要負責節點內部的裝置負載均衡,當用戶請求從 GSLB排程到SLB時,SLB會根據節點內各快取伺服器裝置的實際能力或內容分佈等因素對使用者進行重定向,常用的本地負載均衡方法有基於4層排程、基於7層排程、鏈路負載排程等。

運營管理系統

CDN的運營管理系統與一般的電信運營管理系統類似,分為運營管理和網路管理兩個子系統。

運營管理子系統是CDN系統的業務管理功能實體,負責處理業務層面的與外界系統互動所必需的一些收集、整理、交付工作,包含客戶管理、產品管理、計費管理、統計分析等功能。

網路管理子系統實現對CDN系統的網路裝置管理、拓撲管理、鏈路監控和故障管理,為管理員提供對全網資源進行集中化管理操作的介面,通常是基於Web方式實現的。

在CDN系統中,不僅分發服務系統和排程控制系統是分散式部署的,運營管理系統也是分散式部署的,每個節點都是運營管理資料的生成點和採集點,通過日誌和網管代理等方式上報資料。可以說,CDN本身就是一個大型的具有中央控制能力的分散式服務系統。

試著使用一下騰訊雲提供的CDN服務吧,或許會對你理解運營管理系統有幫助。

為什麼需要CDN?

當下的網際網路應用都包含大量的靜態內容,但靜態內容以及一些準動態內容又是最耗費頻寬的,特別是針對全國甚至全世界的大型網站,如果這些請求都指向主站的伺服器的話,不僅是主站伺服器受不了,單埠500M左右的頻寬也扛不住,所以大多數網站都需要CDN服務。

根本上的原因是,訪問速度對網際網路應用的使用者體驗、口碑、甚至說直接的營收都有巨大的影響,任何的企業都渴望自己站點有更快的訪問速度。而HTTP傳輸時延對web的訪問速度的影響很大,在絕大多數情況下是起決定性作用的,這是由TCP/IP協議的一些特點決定的。物理層上的原因是光速有限、通道有限,協議上的原因有丟包、慢啟動、擁塞控制等。

這就是你使用CDN的第一個也是最重要的原因:為了加速網站的訪問。

除了加速網站的訪問之外,CDN還有一些作用:

1. 實現跨運營商、跨地域的全網覆蓋

互聯不互通、區域ISP地域侷限、出口頻寬受限制等種種因素都造成了網站的區域性無法訪問。CDN加速可以覆蓋全球的線路,通過和運營商合作,部署IDC資源,在全國骨幹節點合理部署CDN邊緣分發儲存節點,充分利用頻寬資源,平衡源站流量。阿里雲在國內有500+節點,海外300+節點,覆蓋主流國家和地區不是問題,可以確保CDN服務的穩定和快速。

2. 保障你的網站安全

CDN的負載均衡和分散式儲存技術,可以加強網站的可靠性,相當無無形中給你的網站添加了一把保護傘,應對絕大部分的網際網路攻擊事件。防攻擊系統也能避免網站遭到惡意攻擊。

3. 異地備援

當某個伺服器發生意外故障時,系統將會呼叫其他臨近的健康伺服器節點進行服務,進而提供接近100%的可靠性,這就讓你的網站可以做到永不宕機。

4. 節約成本

投入使用CDN加速可以實現網站的全國鋪設,你根據不用考慮購買伺服器與後續的託管運維,伺服器之間映象同步,也不用為了管理維護技術人員而煩惱,節省了人力、精力和財力。

5. 讓你更專注業務本身

CDN加速廠商一般都會提供一站式服務,業務不僅限於CDN,還有配套的雲端儲存、大資料服務、視訊雲服務等,而且一般會提供7x24運維監控支援,保證網路隨時暢通,你可以放心使用。並且將更多的精力投入到發展自身的核心業務之上。

其它

流量劫持

其實,CDN本身就是一種DNS劫持,只不過是良性的。不同於黑客強制DNS把域名解析到自己的釣魚IP上,CDN則是讓DNS主動配合,把域名解析到臨近的伺服器上。

劫持通常分為兩類:

  1. 域名劫持,又稱DNS劫持,通常是指域名指向到非正常IP(惡意IP),該惡意IP通過反向代理的方式,在能返回網頁正常內容的情況,可能插入惡意程式碼、監聽網民訪問、劫持敏感資訊等操作。通常驗證一個域名是否被劫持的方法是PING一個域名,如果發現PING出來的IP不是您的伺服器真實IP,則可以確定被劫持了。

  2. 資料劫持,通常由電信運營商中某些員工等勾結犯罪分子,在公網中進行資料支援,插入,此類情況極隱蔽,不會改變使用者域名解析IP,而是直接資料流經運營商寬頻時在網頁中挺入內容,此類情況,建議網頁啟用HTTPS加密,可以解決這一問題(通訊是加密的,運營商無法插入惡意內容)。

如果使用CDN服務,當源站向CDN返回被劫持的內容時,此時CDN將獲取不到正確的網頁內容(而是經運營商篡改強制植入廣告的頁面),此時可能導致該內容在CDN中長時間快取,發現這種問題,可以清理CDN快取,一般即可恢復正常。

CDN快取

CDN邊緣節點快取策略因服務商不同而不同,但一般都會遵循HTTP標準協議,通過HTTP快取機制來設定CDN邊緣節點資料快取時間。

當客戶端向CDN節點請求資料時,CDN節點會判斷快取資料是否過期,若快取資料並沒有過期,則直接將快取資料返回給客戶端;否則,CDN節點就會向源站發出回源請求(back to the source request),從源站拉取最新資料,更新本地快取,並將最新資料返回給客戶端。

CDN服務商一般會提供基於檔案字尾、目錄多個維度來指定CDN快取時間,為使用者提供更精細化的快取管理。

CDN快取時間會對回源率產生直接的影響。若CDN快取時間較短,CDN邊緣節點上的資料會經常失效,導致頻繁回源,增加了源站的負載,同時也增大了訪問延時;若CDN快取時間太長,會帶來資料更新慢的問題。開發者需要增對特定的業務,來做特定的資料快取時間管理。

CDN邊緣節點對開發者是透明的,相比於瀏覽器Ctrl+F5的強制重新整理來使瀏覽器本地快取失效,開發者可以通過CDN服務商提供的“重新整理快取”介面來達到清理CDN邊緣節點快取的目的。這樣開發者在更新資料後,可以使用重新整理快取功能來強制CDN節點上的快取過期,保證客戶端在訪問時,拉取到最新的資料。

總結

  1. 熟悉CDN系統的請求與響應流程;
  2. 熟悉CDN系統的部署架構及功能架構;
  3. 掌握CDN系統中全域性負載均衡與本地負載均衡的相關概念;
  4. 掌握CDN系統中全域性負載均衡裝置、區域負載均衡裝置、本地負載均衡裝置間各個的功能及相關概念;
  5. 瞭解使用CDN的好處;
  6. 瞭解流量劫持與CDN快取。

參考閱讀