1. 程式人生 > >CDN架構以及原理分析

CDN架構以及原理分析

在不同地域的使用者訪問網站的響應速度存在差異,為了提高使用者訪問的響應速度、優化現有Internet中資訊的流動,需要在使用者和伺服器間加入中間層CDN. 使使用者能以最快的速度,從最接近使用者的地方獲得所需的資訊,徹底解決網路擁塞,提高響應速度,是目前大型網站使用的流行的應用方案.

1. CDN 概述

  • CDN的全稱是Content Delivery Network,即內容分發網路。其目的是通過在現有的Internet中增加一層新的CACHE(快取)層,將網站的內容釋出到最接近使用者的網路"邊緣"的節點,使使用者可以就近取得所需的內容,提高使用者訪問網站的響應速度。從技術上全面解決由於網路頻寬小、使用者訪問量大、網點分佈不均等原因,提高使用者訪問網站的響應速度。 cdn_overview.gif
  • Cache層的技術,消除資料峰值訪問造成的結點裝置阻塞。Cache伺服器具有快取功能,所以大部分網頁物件(Web page object),如html, htm, php等頁面檔案,gif,tif,png,bmp等圖片檔案,以及其他格式的檔案,在有效期(TTL)內,對於重複的訪問,不必從原始網站重新傳送檔案實體, 只需通過簡單的認證(Freshness Validation)- 傳送幾十位元組的Header,即可將本地的副本直接傳送給訪問者。由於快取伺服器通常部署在靠近使用者端,所以能獲得近似區域網的響應速度,並有效減少廣域頻寬的消耗。不僅能提高響應速度,節約頻寬,對於加速Web伺服器,有效減輕源伺服器的負載是非常有效的。
  • 根據加速物件不同,分為 客戶端加速 和 伺服器加速
    • 客戶端加速 : Cache部署在網路出口處,把常訪問的內容快取在本地,提高響應速度和節約頻寬;
    • 伺服器加速 : Cache部署在伺服器前端,作為Web伺服器的代理快取機,提高Web伺服器的效能,加速訪問速度 
      如果多臺Cache加速伺服器且分佈在不同地域,需要通過有效地機制管理Cache網路,引導使用者就近訪問(比如通過DNS引導使用者),全域性負載均衡流量,這是CDN內容傳輸網路的基本思想.
  • CDN對網路的優化作用主要體現在如下幾個方面  - 解決伺服器端的“第一公里”問題  - 緩解甚至消除了不同運營商之間互聯的瓶頸造成的影響  - 減輕了各省的出口頻寬壓力  - 緩解了骨幹網的壓力  - 優化了網上熱點內容的分佈

2. CDN 的工作原理

2.1. 傳統訪問過程(未加速快取服務)

我們先看傳統的未加快取服務的訪問過程,以便了解CDN快取訪問方式與未加快取訪問方式的差別:

normal.png

由上圖可見,使用者訪問未使用CDN快取網站的過程為:

  1. 使用者輸入訪問的域名,作業系統向 LocalDns 查詢域名的ip地址.
  2. LocalDns向 ROOT DNS 查詢域名的授權伺服器(這裡假設LocalDns快取過期)
  3. ROOT DNS將域名授權dns記錄迴應給 LocalDns
  4. LocalDns得到域名的授權dns記錄後,繼續向域名授權dns查詢域名的ip地址
  5. 域名授權dns 查詢域名記錄後,迴應給 LocalDns
  6. LocalDns 將得到的域名ip地址,迴應給 使用者端
  7. 使用者得到域名ip地址後,訪問站點伺服器
  8. 站點伺服器應答請求,將內容返回給客戶端.

2.2. CDN訪問過程(使用快取服務)

CDN網路是在使用者和伺服器之間增加Cache層,主要是通過接管DNS實現,將使用者的請求引導到Cache上獲得源伺服器的資料
下面讓我們看看訪問使用CDN快取後的網站的過程:

cdn.png

通過上圖,我們可以瞭解到,使用了CDN快取後的網站的訪問過程變為:

  1. 使用者輸入訪問的域名,作業系統向 LocalDns 查詢域名的ip地址.
  2. LocalDns向 ROOT DNS 查詢域名的授權伺服器(這裡假設LocalDns快取過期)
  3. ROOT DNS將域名授權dns記錄迴應給 LocalDns
  4. LocalDns得到域名的授權dns記錄後,繼續向域名授權dns查詢域名的ip地址
  5. 域名授權dns 查詢域名記錄後(一般是CNAME),迴應給 LocalDns
  6. LocalDns 得到域名記錄後,向智慧排程DNS查詢域名的ip地址
  7. 智慧排程DNS 根據一定的演算法和策略(比如靜態拓撲,容量等),將最適合的CDN節點ip地址迴應給 LocalDns
  8. LocalDns 將得到的域名ip地址,迴應給 使用者端
  9. 使用者得到域名ip地址後,訪問站點伺服器
  10. CDN節點伺服器應答請求,將內容返回給客戶端.(快取伺服器一方面在本地進行儲存,以備以後使用,二方面把獲取的資料返回給客戶端,完成資料服務過程)

通過以上的分析我們可以得到,為了實現對普通使用者透明(使用快取後用戶客戶端無需進行任何設定)訪問,需要使用DNS(域名解析)來引導使用者來訪問Cache伺服器,以實現透明的加速服務. 由於使用者訪問網站的第一步就是 域名解析 ,所以通過修改dns來引導使用者訪問是最簡單有效的方式.

2.3. CDN網路的組成要素

對於普通的Internet使用者,每個CDN節點就相當於一個放置在它周圍的網站伺服器. 
通過對dns的接管,使用者的請求被透明地指向離他最近的節點,節點中CDN伺服器會像網站的原始伺服器一樣,響應使用者的請求. 
由於它離使用者更近,因而響應時間必然更快.

從上面圖中 虛線圈起來的那塊,就是CDN層,這層是位於 使用者端 和 站點伺服器之間.

  • 智慧排程DNS(比如f5的3DNS) 智慧排程DNS是CDN服務中的關鍵系統.當用戶訪問加入CDN服務的網站時,域名解析請求將最終由 智慧排程DNS 負責處理.
    它通過一組預先定義好的策略,將當時最接近使用者的節點地址提供給使用者,使使用者可以得到快速的服務.
    同時它需要與分佈在各地的CDN節點保持通訊,跟蹤各節點的健康狀態,容量等,確保將使用者的請求分配到就近可用的節點上.
  • 快取功能服務
    • 負載均衡裝置(如lvs,F5的BIG/IP)
    • 內容Cache伺服器(如squid)
    • 共享儲存(根據快取資料量多少決定是否需要)

3. CDN 智慧排程Dns 例項分析

  • 分析img.alibaba.com域名 在系統中,執行dig命令,輸出如下:
      #dig img.alibaba.com       
      
      ; 部分省略
      
      ;; QUESTION SECTION:
      ;img.alibaba.com.		IN	A
      
      ;; ANSWER SECTION:
      img.alibaba.com.	600	IN	CNAME	img.alibaba.com.edgesuite.net.
      img.alibaba.com.edgesuite.net. 7191 IN	CNAME	img.alibaba.com.georedirector.akadns.net.
      img.alibaba.com.georedirector.akadns.net. 3592 IN CNAME	a1366.g.akamai.net.
      a1366.g.akamai.net.	12	IN	A	204.203.18.145
      a1366.g.akamai.net.	12	IN	A	204.203.18.160
      
      ; 部分省略
    
    從上面查詢結果可以看出 img.alibaba.com. CNAME img.alibaba.com.edgesuite.net. 後面的CNAME是由 Akamai(CDN服務商) 去跳轉到 智慧排程器上的.
  • 分析www.discovery.com域名 在系統中,繼續執行dig命令,輸出如下:
      #dig www.discovery.com
      
      ; 部分省略
      
      ;; QUESTION SECTION:
      ;www.discovery.com.		IN	A
      
      ;; ANSWER SECTION:
      www.discovery.com.	1077	IN	CNAME	www.discovery.com.edgesuite.net.
      www.discovery.com.edgesuite.net. 21477 IN CNAME	a212.g.akamai.net.
      a212.g.akamai.net.	20	IN	A	204.203.18.154
      a212.g.akamai.net.	20	IN	A	204.203.18.147
      
      ; 部分省略
    
    從上面查詢結果可以看出 www.discovery.com. IN CNAME www.discovery.com.edgesuite.net. 後面的CNAME是由 Akamai(CDN服務商) 去跳轉到 智慧排程器上的. 總結:一般來說,網站需要使用到CDN服務時,一般都是將需要加速訪問的域名 CNAME到 CDN服務商的域名上.
    快取服務和排程功能都是由服務商來完成.

4. CDN的 智慧排程Dns 簡化實現

4.1. 排程策略說明

在使用者請求解析域名的時候,智慧DNS判斷使用者的LocalDns的IP,然後跟DNS伺服器內部的IP表範圍匹配一下,看看使用者是電信還是網通使用者,然後給使用者返回對應的IP地址 
這裡使用的是靜態拓撲的方法,只是判斷LocalDns的IP.要想使用更復雜的排程演算法可以考慮商業產品,如F5的3DNS.

4.2. 假設CDN節點規劃

在這裡我們將使用 BIND 的View功能來實現運營商的區分,假設我們在每個運營商的機房都放有一個CDN節點,列表如下:

4.3. bind view 配置

  • 以下是named.conf配置檔案的部分擷取,只是涉及到 View 的部分,其他細節可參考網際網路.
      acl "cnc_iprange"{   //定義ip範圍(網通)
      192.168.1.0/24;  
      192.168.2.0/24;
      //此處只是示例,其他省略
      };  
      
      acl "tel_iprange"{  //定義ip範圍(電信)
      192.168.3.0/24;  
      192.168.4.0/24;
      //其他省略
      };
       
      acl "edu_iprange"{  //定義ip範圍(教育網)
      192.168.5.0/24;  
      192.168.6.0/24;
      //其他省略
      };
       
      acl "default_iprange"{ //定義ip範圍(預設)
      192.168.7.0/24;  
      192.168.8.0/24;
      //其他省略
      }; 
      
      
      view "CNC" {
      	Match-clients{cnc_iprange};
      	zone "." IN {
      		    type hint;
      		    file "named.root";
      	};
      
      	zone "localhost" IN {
      		    type master;
      		    file "localhost.zone";
      		    allow-update { none; };
      	};
      	
      	zone "cdntest.com" IN {
          		type master;
          		file "cnc_cdntest.zone";
      	};
      };
      
      view "TEL" {
      	Match-clients{tel_iprange};
      	zone "." IN {
      		    type hint;
      		    file "named.root";
      	};
      
      	zone "localhost" IN {
      		    type master;
      		    file "localhost.zone";
      		    allow-update { none; };
      	};
      	
      	zone "cdntest.com" IN {
          		type master;
          		file "tel_cdntest.zone";
      	};
      };
      
      view "EDU" {
      	Match-clients{edu_iprange};
      	zone "." IN {
      		    type hint;
      		    file "named.root";
      	};
      
      	zone "localhost" IN {
      		    type master;
      		    file "localhost.zone";
      		    allow-update { none; };
      	};
      	
      	zone "cdntest.com" IN {
          		type master;
          		file "edu_cdntest.zone";
      	};
      };
      
      view "DEFAULT" {
      	Match-clients{default_iprange};
      	zone "." IN {
      		    type hint;
      		    file "named.root";
      	};
      
      	zone "localhost" IN {
      		    type master;
      		    file "localhost.zone";
      		    allow-update { none; };
      	};
      	
      	zone "cdntest.com" IN {
          		type master;
          		file "default_cdntest.zone";
      	};
      };
    
  • zone檔案的配置說明 這4個zone配置檔案(cnc_cdntest.zone,tel_cdntest.zone,edu_cdntest.zone,default_cdntest.zone)中,只有www.cndtest.com的A記錄不一樣,其他的都是一樣.
cnc_cdntest.zone 192.168.0.1
tel_cdntest.zone 192.168.0.2
edu_cdntest.zone 192.168.0.3
default_cdntest.zone 192.168.0.4

以上只列出了 www.cdntest.com 的A記錄地址,其他關於zone的語法 請參考網際網路.

  • 域名解析流程簡要說明
  1. 授權DNS 判斷使用者使用的 LocalDns的ip地址,匹配上述設定的ip範圍,如果範圍在網通,就將網通對應的ip地址(192.168.0.1),迴應給LocalDns(其他依此類推)
  2. LocalDns 將得到的域名ip地址,迴應給 使用者端 (域名解析完成) 說明:再此過程中,我們簡化了主DNS 到 智慧DNS 之間的CNAME過程(為了簡要說明問題). 
    這裡使用的是靜態拓撲(根據ip範圍)的方法,也稱為地域化方法,只是判斷LocalDns的IP.
  • 此簡化方案中的存在的問題
  1. 如果使用者設定錯誤的dns,可能會導致使用者訪問比原來慢(比如網通使用者設定了電信的DNS)
  2. 不能判斷CDN節點伺服器的健康狀態和容量狀態,可能會把使用者定向到不可用的CDN節點
  3. 由於靜態拓撲方法,可能存在使用者訪問的CDN節點不是最優化和最快的
  4. .....可能還有其他想不到的....

5. 總結(Summary)

在建立CDN網路時,最關鍵的就是 智慧排程DNS,這個是CND網路總協調,通過高效的排程演算法,可以使使用者得到最佳的訪問體驗.
其次就是 CND節點的管理,比如涉及到 內容的同步機制,配置檔案的更新等等,都需要有一套機制來保證.
當然在大型網站中,也要考建設CDN體系的成本和回報率.