我是風箏,公眾號「古時的風箏」,一個兼具深度與廣度的程式設計師鼓勵師,一個本打算寫詩卻寫起了程式碼的田園碼農!
文章會收錄在 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。這些內容包括以下這些:
- 網站中的靜態資原始檔,比如圖片、js 指令碼、樣式檔案等小檔案;
- 大檔案,比如一些軟體下載站、一些視訊、影像資源下載站等;
- 線上音訊、視訊網站,比如網易雲音樂、騰訊視訊等;
比如我開啟天貓商城看了一下,看到其中很多靜態檔案都來自於不同的域名,有很多域名中帶著 CDN 字樣,明顯都是來自於 CDN 節點的。
那都是靜態檔案啊,動態內容能不能也放到 CDN 上呢?那這就變味兒了,CDN 只放靜態內容可以快速簡單的實現,如果加入動態內容,那不就成了多機房分散式部署了嗎。倒也不是沒有折中的辦法,邊緣計算就是這樣一種策略,邊緣節點既能做 CDN,也具備一些計算能力,可以有一些簡單的動態執行能力。這就不在討論的範圍之內了。
如果你做過前端開發的話,可能用過一些 JavaScript 開發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伺服器同時在本地進行儲存,以備下次使用。
下面的流程圖畫出了整個請求過程。
大致的流程就是上面的樣子,真實情況下,智慧 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 殺手,擅長解決問題。
一個兼具深度與廣度的程式設計師鼓勵師,本打算寫詩卻寫起了程式碼的田園碼農!堅持原創乾貨輸出,你可選擇現在就關注我,或者看看歷史文章再關注也不遲。長按二維碼關注,跟我一起變優秀!