我是風箏,公衆號「古時的風箏」,一個兼具深度與廣度的程序員鼓勵師,一個本打算寫詩卻寫起了代碼的田園碼農! 文章會收錄在 JavaNewBee 中,更有 Java 後端知識圖譜,從小白到大牛要走的路都在裏面。前端
當你在訪問淘寶、京東準備剁手的時候,雖然進入頁面的時候有不少的圖片、不少的內容,可是加載起來確很快,讓你剁手的動做如水般絲滑。嗖的一下好看的商品圖片就出來了,嗖的一下就付款了。固然圖片算是比較小的資源了,那些視頻網站呢,每個視頻好幾百M、好幾個G,同時有好多的請求過來,就算服務器能抗住,帶寬能跟的上嗎?git
難道就是靠大廠背後充足的服務器、寬帶資源以及過硬的優化技術外嗎?固然了,這確定是必要的條件,除此以外就靠咱們今天要說的 CDN 技術了。程序員
什麼是 CDN
CDN即內容分發網絡(Content Delivery Network)的簡稱,是創建在承載網基礎上的虛擬分佈式網絡,可以將源站內容(包括各種動靜態資源)智能緩存到全球各節點服務器上。這樣不只方便了用戶就近獲取內容,提升了資源的訪問速度,也分擔了源站壓力。github
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 的狀況下,一次資源請求的路徑是什麼樣子的呢。
一、首先用戶在瀏覽器輸入域名,好比進入天貓主頁;
二、用戶所在的電腦查詢 hosts 中看是否有對應的 IP ,若是有就直接請求 IP;
三、若是沒有在本地緩存,則向本地 DNS 發起請求,本地 DNS 查找域名對應的 IP(通常是 A 記錄);
四、若是本地 DNS 沒有找到,則向上級 DNS 服務器請求,一級一級的知道查到最頂級 DNS 服務器;
五、向找到的域名對應的 IP 發起請求;
六、資源所在的集羣向客戶端返回請求的資源,好比圖片、樣式文件、視頻文件等;
有了 CDN 以後
當有了 CDN 接入以後,事情就稍微變得複雜了一點。
一、用戶在瀏覽器輸入域名,好比進入天貓主頁;
二、用戶所用的電腦向本地 DNS 服務器請求,查詢域名的IP地址;
三、本地 DNS 服務器中若是緩存有這個域名的記錄,則直接響應用戶的解析請求,不然本地DNS向根DNS 查詢域名的受權服務器;
四、根DNS將域名受權DNS記錄返回給本地DNS;
五、本地 DNS 獲得域名的受權DNS記錄後,繼續向域名受權DNS查詢域名的IP地址;
六、域名受權DNS查詢域名記錄後(通常是CNAME),返回給本地DNS;
七、本地DNS獲得域名記錄後,向智能DNS查詢域名的IP地址;
八、智能DNS根據必定的算法和策略(好比靜態拓撲,容量等),將最合適的CDN節點IP地址返回給 本地DNS;
九、本地DNS將獲得的域名IP地址,返回給用戶終端;
十、用戶獲得域名IP地址後,訪問站點服務器;
十一、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 服務的性能有以下幾個指標:
- 延時:指一個數據包從用戶的計算機發送到網站服務器,而後再當即從網站服務器返回用戶計算機的來回時間。延時越低,性能越好。
- 下載速度:指用戶從網絡上或者網絡服務器上下載的數據時的傳輸速度。下載速度越快,性能越好。
- 打開速度:指用戶打開網站的速度。打開速度越快,性能越好。
- 丟包率:指用戶在網絡傳輸中所丟失數據包數量佔所發送數據組的比率。
- 回源率:回源率分爲回源請求數比例及回源流量比例兩種。
- 回源請求數比:指邊緣節點對於沒有緩存、緩存過時(可緩存)和不可緩存的請求佔所有請求記錄的比例。越低則性能越好。
- 回源流量比:回源流量是回源請求文件大小產生的流量和請求自己產生的流量。因此回源流量比=回源流量/(回源流量+用戶請求訪問的流量),比值越低,性能越好。
- 緩存命中率:指終端用戶訪問加速節點時,該節點已緩存了要被訪問的數據的次數佔所有訪問次數的比例。緩存命中率越高,性能越好。
好處
一、本地Cache加速,提升了企業站點(尤爲含有大量圖片和靜態頁面站點)的訪問速度,並大大提升以上性質站點的穩定性;
二、鏡像服務消除了不一樣運營商之間互聯的瓶頸形成的影響,實現了跨運營商的網絡加速,保證不一樣網絡中的用戶都能獲得良好的訪問質量;
三、遠程訪問用戶根據DNS負載均衡技術,智能自動選擇Cache服務器,選擇最快的Cache服務器,加快遠程訪問的速度;
四、帶寬優化:自動生成服務器的遠程Mirror(鏡像)cache服務器,遠程用戶訪問時從cache服務器上讀取數據,減小遠程訪問的帶寬、分擔網絡流量、減輕原站點WEB服務器負載等功能;
五、集羣抗攻擊:普遍分佈的CDN節點加上節點之間的智能冗餘機制,能夠有效地預防黑客入侵以及下降各類DDos攻擊對網站的影響,同時保證較好的服務質量 。
壯士且慢,先給點個贊吧,老是被白嫖,身體吃不消!
公衆號「古時的風箏」,Java 開發者,全棧工程師,bug 殺手,擅長解決問題。 一個兼具深度與廣度的程序員鼓勵師,本打算寫詩卻寫起了代碼的田園碼農!堅持原創乾貨輸出,你可選擇如今就關注我,或者看看歷史文章再關注也不遲。長按二維碼關注,跟我一塊兒變優秀!