CDN原理簡析

CDN(Content Delivery Network,內容分發網絡)將源站的內容發佈到接近用戶的網絡「邊緣」,用戶能夠就近獲取所需數據,不只下降了網絡的擁塞情況、提升請求的響應速度,也可以減小源站的負載壓力。php

不少同窗都比較熟悉CDN的做用和功能,可是可能也會像我以前同樣,對CDN的原理不是十分了解。因此本文旨在對CDN的工做原理和核心組件進行簡要的描述。緩存

1. 訪問源站的過程

爲了更加清楚地展現CDN的原理,咱們首先回顧一下不使用緩存直接到源站請求數據的過程:服務器

如上圖所示,若是要訪問的網站名爲:"join.qq.com",客戶端首先會在本機的hosts文件和hosts緩存中查找該域名對應的IP地址;若是本機中沒有此信息,則會到咱們的本地DNS進行詢問該域名對應的IP地址;若是本地DNS中仍然沒有該域名的IP信息時,則會由本地DNS依次向根DNS頂級域DNS權威DNS進行詢問,最終本地DNS將IP地址發送給客戶端。客戶端經過IP地址向遠程的源站服務器發出HTTP請求並獲取相應的數據內容。網絡

以上是經過DNS的迭代解析模式獲取域名對應的IP地址併發送HTTP請求的過程。源站的提供商經過配置權威DNS將源站的域名與提供服務的服務器主機進行綁定,使客戶端經過DNS服務能夠順利地獲取源站域名對應的IP地址並經過IP地址與源站進行通訊。併發

DNS的記錄類型

爲了方便後續的討論,須要瞭解DNS是如何對查詢請求進行應答的。負載均衡

在DNS系統中,最多見的資源記錄方式是Internet類記錄,該記錄由包含4個字段的數據構成:Name、Value、Type、TTL。其中Name和Value能夠理解爲一對鍵值對,可是其具體含義取決於Type的類型,TTL記錄了該條記錄應當從緩存中刪除的時間。在資源記錄的類型中中,最爲常見且重要的類型Type主要有:ide

  1. A記錄(Address)網站

    A記錄用於描述目標域名到IP地址的映射關係,將目標域名與A記錄的Name字段進行匹配,將成功匹配的記錄的Value字段的內容(IP地址)輸出到DNS迴應報文中。code

  2. NS記錄(Name Server)cdn

    NS記錄用於描述目標域名到負責解析該域名的DNS的映射關係,根據目標域名對NS記錄的Name字段進行匹配,將成功匹配的記錄的Value字段(負責解析目標域名的DNS的IP地址)輸出到DNS迴應報文中。

  3. CNAME記錄

    CNAME記錄用於描述目的域名和別名的對應關係,若是說A記錄能夠將目標域名轉換爲對應主機的IP地址,那麼CNAME記錄則能夠將一個域名(別名)轉換爲另外一個域名,若是多條CNAME記錄指向同一個域名,則能夠將多個不一樣的域名的請求指向同一臺服務器主機。而且,CNAME記錄一般還對應了一條A記錄,用於提供被轉換的域名的IP地址。

2. 經過CDN獲取緩存內容的過程

在上一章節中主要介紹了經過DNS服務直接訪問源站的請求響應過程。與其不一樣的是,CDN將咱們對源站的請求導向了距離用戶較近的緩存節點,而非源站。

如圖所示是經過CDN進行請求響應的過程圖。經過圖中能夠看出,在DNS解析域名時新增了一個全局負載均衡系統(GSLB),GSLB的主要功能是根據用戶的本地DNS的IP地址判斷用戶的位置,篩選出距離用戶較近的本地負載均衡系統(SLB),並將該SLB的IP地址做爲結果返回給本地DNS。SLB主要負責判斷緩存服務器集羣中是否包含用戶請求的資源數據,若是緩存服務器中存在請求的資源,則根據緩存服務器集羣中節點的健康程度、負載量、鏈接數等因素篩選出最優的緩存節點,並將HTTP請求重定向到最優的緩存節點上。

爲了更清晰地說明CDN的工做原理,下面以客戶端發起對"join.qq.com/video.php"的HTTP請求爲例進行說明:

  1. 用戶發起對"join.qq.com/video.php"的HTTP請求,首先須要經過本地DNS經過"迭代解析"的方式獲取域名"join.qq.com"的IP地址;
  2. 若是本地DNS的緩存中沒有該域名的記錄,則向根DNS發送DNS查詢報文;
  3. 根DNS發現域名的前綴爲"com",則給出負責解析com頂級DNS的IP地址;
  4. 本地DNS向頂級DNS發送DNS查詢報文;
  5. 頂級DNS發現域名的前綴爲"qq.com",在本地記錄中查找負責該前綴的權威DNS的IP地址並進行回覆;
  6. 本地DNS向權威DNS發送DNS查詢報文;
  7. 權威DNS查找到一條NAME字段爲"join.qq.com"的CNAME記錄(由服務提供者配置),該記錄的Value字段爲"join.qq.cdn.com";而且還找到另外一條NAME字段爲"join.qq.cdn.com"的A記錄,該記錄的Value字段爲GSLB的IP地址;
  8. 本地DNS向GSLB發送DNS查詢報文;
  9. GSLB根據本地DNS的IP地址判斷用戶的大體位置爲深圳,篩選出位於華南地區且綜合考量最優的SLB的IP地址填入DNS迴應報文,做爲DNS查詢的最終結果;
  10. 本地DNS回覆客戶端的DNS請求,將上一步的IP地址做爲最終結果回覆給客戶端;
  11. 客戶端根據IP地址向SLB發送HTTP請求:"join.qq.com/video.php";
  12. SLB綜合考慮緩存服務器集羣中各個節點的資源限制條件、健康度、負載狀況等因素,篩選出最優的緩存節點後迴應客戶端的HTTP請求(狀態碼爲302,重定向地址爲最優緩存節點的IP地址);
  13. 客戶端接收到SLB的HTTP回覆後,重定向到該緩存節點上;
  14. 緩存節點判斷請求的資源是否存在、過時,將緩存的資源直接回復給客戶端,不然到源站進行數據更新再回復。

其中較爲關鍵的步驟爲6~9,與普通的DNS過程不一樣的是,這裏須要服務提供者(源站)配置它在其權威DNS中的記錄,將直接指向源站的A記錄修改成一條CNAME記錄及其對應的A記錄,CNAME記錄將目標域名轉換爲GSLB的別名,A記錄又將該別名轉換爲GSLB的IP地址。經過這一系列的操做,將解析源站的目標域名的權力交給了GSLB,以至於GSLB能夠根據地理位置等信息將用戶的請求引導至距離其最近的"緩存節點",減緩了源站的負載壓力和網絡擁塞。

以上主要介紹了目前CDN中最爲常見的工做方式,這種工做方式利用CNAME將域名和目標IP之間進行解耦,將目標IP的解析權下放到GSLB中,方便實現更多自定義的功能,是一種更加靈活的方式。

相關文章
相關標籤/搜索