天天看點

『CDN』讓你的網站通路起來更加柔順絲滑

我是風筝,公衆号「古時的風筝」,一個兼具深度與廣度的程式員鼓勵師,一個本打算寫詩卻寫起了代碼的田園碼農!

文章會收錄在 JavaNewBee 中,更有 Java 後端知識圖譜,從小白到大牛要走的路都在裡面。

當你在通路淘寶、京東準備剁手的時候,雖然進入頁面的時候有很多的圖檔、很多的内容,但是加載起來卻很快,讓你剁手的動作如水般絲滑。嗖的一下好看的商品圖檔就出來了,嗖的一下就付款了。當然圖檔算是比較小的資源了,那些視訊網站呢,每一個視訊好幾百M、好幾個G,同時有好多的請求過來,就算伺服器能抗住,帶寬能跟的上嗎?

難道就是靠大廠背後充足的伺服器、寬帶資源以及過硬的優化技術了嗎?當然了,這肯定是必要的條件,除此之外就靠我們今天要說的 CDN 技術了。

什麼是 CDN

CDN即内容分發網絡(Content Delivery Network)的簡稱,是建立在承載網基礎上的虛拟分布式網絡,能夠将源站内容(包括各類動靜态資源)智能緩存到全球各節點伺服器上。這樣不僅友善了使用者就近擷取内容,提高了資源的通路速度,也分擔了源站壓力。

CDN(Content Delivery Network)是指内容分發網絡,也稱為内容傳送網絡,這個概念始于1996年,是美國麻省理工學院的一個研究小組為改善網際網路的服務品質而提出的。為了能在傳統IP網上釋出豐富的寬帶媒體内容,他們提出在現有網際網路基礎上建立一個内容分發平台專門為網站提供服務,并于1999年成立了專門的CDN服務公司,為Yahoo提供專業服務。由于CDN是為加快網絡通路速度而被優化的網絡覆寫層,是以被形象地稱為“網絡加速器”。

CDN 的核心就是加快網絡通路速度,看下面這張圖,不同地方的終端使用者會通路到最近的 CDN 伺服器,而 CDN 伺服器上的内容是源伺服器叢集上的,不管是通過主動拉取還是被動接收的,總之資料内容是一緻的,而且離使用者最近,擷取成本最小速度更快。

『CDN』讓你的網站通路起來更加柔順絲滑

現在國内一些比較有實力的大公司會自建 CDN 網絡,用來提升服務性能,當然,成本也是很巨大的,想想看啊,友善使用者就近擷取内容就意味着要在各個地方建立内容節點伺服器,就不說向全世界提供服務,就面向整個中國,就要有多少個節點吧。

好在現在很多國内雲服務提供商都有 CDN 服務,可以大大降低自建 CDN 的成本。

使用場景

從 CDN 含義本身分析,内容分發網絡嘛,肯定是需要快速擷取内容的場景才需要 CDN。這些内容包括以下這些:

  1. 網站中的靜态資源檔案,比如圖檔、js 腳本、樣式檔案等小檔案;
  2. 大檔案,比如一些軟體下載下傳站、一些視訊、圖像資源下載下傳站等;
  3. 線上音頻、視訊網站,比如網易雲音樂、騰訊視訊等;

比如我打開天貓商城看了一下,看到其中很多靜态檔案都來自于不同的域名,有很多域名中帶着 CDN 字樣,明顯都是來自于 CDN 節點的。

『CDN』讓你的網站通路起來更加柔順絲滑

那都是靜态檔案啊,動态内容能不能也放到 CDN 上呢?那這就變味兒了,CDN 隻放靜态内容可以快速簡單的實作,如果加入動态内容,那不就成了多機房分布式部署了嗎。倒也不是沒有折中的辦法,邊緣計算就是這樣一種政策,邊緣節點既能做 CDN,也具備一些計算能力,可以有一些簡單的動态執行能力。這就不在讨論的範圍之内了。

如果你做過前端開發的話,可能用過一些 JavaScript 開發CDN,比如七牛雲和又拍雲等等。

『CDN』讓你的網站通路起來更加柔順絲滑

原理

沒有 CDN 的請求路徑

在沒有 CDN 的情況下,一次資源請求的路徑是什麼樣子的呢。

1、首先使用者在浏覽器輸入域名,比如進入天貓首頁;

2、使用者所在的電腦查詢 hosts 中看是否有對應的 IP ,如果有就直接請求 IP;

3、如果沒有在本地緩存,則向本地 DNS 發起請求,本地 DNS 查找域名對應的 IP(一般是 A 記錄);

4、如果本地 DNS 沒有找到,則向上級 DNS 伺服器請求,一級一級的知道查到最頂級 DNS 伺服器;

5、向找到的域名對應的 IP 發起請求;

6、資源所在的叢集向用戶端傳回請求的資源,比如圖檔、樣式檔案、視訊檔案等;

有了 CDN 之後

當有了 CDN 接入之後,事情就稍微變得複雜了一點。

1、使用者在浏覽器輸入域名,比如進入天貓首頁;

2、使用者所用的電腦向本地 DNS 伺服器請求,查詢域名的IP位址;

3、本地 DNS 伺服器中如果緩存有這個域名的記錄,則直接響應使用者的解析請求,否則本地DNS向根DNS 查詢域名的授權伺服器;

4、根DNS将域名授權DNS記錄傳回給本地DNS;

5、本地 DNS 得到域名的授權DNS記錄後,繼續向域名授權DNS查詢域名的IP位址;

6、域名授權DNS查詢域名記錄後(一般是CNAME),傳回給本地DNS;

7、本地DNS得到域名記錄後,向智能DNS查詢域名的IP位址;

8、智能DNS根據一定的算法和政策(比如靜态拓撲,容量等),将最合适的CDN節點IP位址傳回給 本地DNS;

9、本地DNS将得到的域名IP位址,傳回給使用者終端;

10、使用者得到域名IP位址後,通路站點伺服器;

11、CDN節點伺服器應答請求,将内容傳回給用戶端,CDN伺服器同時在本地進行儲存,以備下次使用。

下面的流程圖畫出了整個請求過程。

『CDN』讓你的網站通路起來更加柔順絲滑

大緻的流程就是上面的樣子,真實情況下,智能 DNS 可能更加複雜一些。因為一個地區的 CDN 很可能不是單純的一台機器或一個叢集,而是一個小範圍的分布式部署。

比如全國範圍内是一個大的 CDN 網絡,那智能 DNS 其實就是一個智能負載均衡器,它會根據一系列的名額,比如地理位置、線路等情況傳回一個 IP 位址,這個位址可能并不是一個 CDN 伺服器的 IP,而是一個小範圍的智能負載均衡器位址,這個負載均衡器可能協調的某一個省的 CDN 節點,當定向到這個負載均衡器之後,又會根據一系列的名額,将傳回一個最合适的 CDN 節點的 IP 給用戶端。

CDN 核心部件

智能 DNS

智能排程DNS是CDN服務中的關鍵系統,當使用者通路加入CDN服務的網站時,域名解析請求将最終由 “智能排程DNS”負責處理。它通過一組預先定義好的政策,将當時最接近使用者的節點位址提供給使用者,使使用者可以得到快速的服務。同時它需要與分布在各地的CDN節點保持通信,跟蹤各節點的健康狀态、容量等資訊,確定将使用者的請求配置設定到就近可用的節點上。

緩存功能服務

負載均衡器

CDN 節點通常都是以叢集或者區域叢集的形式存在的,負載均衡器可以将請求分派到最合适的 CDN 伺服器上。負載均衡器可能是硬體 F5,也可能是 LVS、HA、Nginx 等軟體形式。

内容緩存伺服器

CND 提供的就是内容加速,當然要有地方存内容了。如果是小的靜态檔案還好,如果是大的視訊檔案等,那對大容量的存儲和高速讀也是有一定要求的。

内容管理服務

最開始内容都是存儲在源伺服器中的,那總得想辦法讓内容存儲到各個 CDN 節點上。那通過什麼方式呢,最簡單的辦法就是當用戶端通路的某個 CDN 之後,發現裡面沒有需要的内容,就到源伺服器上去拉取。

内容傳輸可以有兩種模式,一種推模式,一種拉模式。推模式是源伺服器像各個 CDN 節點主動推送,這種方式就比較靈活了,但是實作比較複雜,假設有個管理控制台,管理者選擇某些需要推送的檔案,然後選擇需要推送的 CDN 節點,點選推送按鈕,将檔案主動推送過去。

名額

通用名額

衡量 CDN 服務的性能有如下幾個名額:

  • 延時:指一個資料包從使用者的計算機發送到網站伺服器,然後再立即從網站伺服器傳回使用者計算機的來回時間。延時越低,性能越好。
  • 下載下傳速度:指使用者從網絡上或者網絡伺服器上下載下傳的資料時的傳輸速度。下載下傳速度越快,性能越好。
  • 打開速度:指使用者打開網站的速度。打開速度越快,性能越好。
  • 丢包率:指使用者在網絡傳輸中所丢失資料包數量占所發送資料組的比率。
  • 回源率:回源率分為回源請求數比例及回源流量比例兩種。
    • 回源請求數比:指邊緣節點對于沒有緩存、緩存過期(可緩存)和不可緩存的請求占全部請求記錄的比例。越低則性能越好。
    • 回源流量比:回源流量是回源請求檔案大小産生的流量和請求本身産生的流量。是以回源流量比=回源流量/(回源流量+使用者請求通路的流量),比值越低,性能越好。
  • 緩存命中率:指終端使用者通路加速節點時,該節點已緩存了要被通路的資料的次數占全部通路次數的比例。緩存命中率越高,性能越好。

好處

1、本地Cache加速,提高了企業站點(尤其含有大量圖檔和靜态頁面站點)的通路速度,并大大提高以上性質站點的穩定性;

2、鏡像服務消除了不同營運商之間互聯的瓶頸造成的影響,實作了跨營運商的網絡加速,保證不同網絡中的使用者都能得到良好的通路品質;

3、遠端通路使用者根據DNS負載均衡技術,智能自動選擇Cache伺服器,選擇最快的Cache伺服器,加快遠端通路的速度;

4、帶寬優化:自動生成伺服器的遠端Mirror(鏡像)cache伺服器,遠端使用者通路時從cache伺服器上讀取資料,減少遠端通路的帶寬、分擔網絡流量、減輕原站點WEB伺服器負載等功能;

5、叢集抗攻擊:廣泛分布的CDN節點加上節點之間的智能備援機制,可以有效地預防黑客入侵以及降低各種DDos攻擊對網站的影響,同時保證較好的服務品質 。

這位英俊潇灑的少年,如果覺得還不錯的話,給個推薦可好!

公衆号「古時的風筝」,Java 開發者,全棧工程師,bug 殺手,擅長解決問題。

一個兼具深度與廣度的程式員鼓勵師,本打算寫詩卻寫起了代碼的田園碼農!堅持原創幹貨輸出,你可選擇現在就關注我,或者看看曆史文章再關注也不遲。長按二維碼關注,跟我一起變優秀!

『CDN』讓你的網站通路起來更加柔順絲滑

人生沒有回頭路,珍惜當下。

CDN