做爲一名程序員,你真正瞭解CDN技術嗎?

本文導讀:java

  • 物流倉庫配送如何加速瀏覽器

  • 靜態資源文件部署方式緩存

  • 靜態資源加速之CDN技術服務器

  • 解析過程當中的名詞解釋網絡

  • 最後的總結架構


一、物流倉庫配送如何加速

咱們仍是從生活中購物的例子來展開。負載均衡

將時光倒回到幾年前,在那時候個人老家縣城裏,若是你從京東APP上購物下單,起碼須要等上個幾天時間,才能將商品送到你的手中。運維

由於他們的物流倉庫中心當時並無在縣城裏來建設,因此通常可能從地市或者省會(看作區域倉庫)物流倉庫去查找是否有庫存,若是區域物流倉庫仍是沒有庫存,則可能會從北京物流倉庫(看作中心倉庫)發貨,一旦中心倉庫也無貨,那就只能從廠商進貨了(看作源站)。分佈式

可是,如今不同了,無論你是身在一線城市仍是在老家,從京東網站上購物(默認以自營商品爲主)下單,基本隔天就能收到貨了,快遞小哥送貨效率都是同樣的。網站

這就是京東強大的物流優點,將物流倉庫擴建到離老百姓最近的地方,使得用戶購物體驗獲得了很是大的提高。

經過這個案例,咱們就理解了商品送貨的加速過程。

商品有普通商品,大件商品等,這些商品最開始都是備貨到中心物流倉庫,中心物流倉庫能夠認爲是幾乎是最全的商品倉庫中心。

當區域物流倉庫建設好以後,就能夠將這些商品提早備貨到區域倉庫,進一步提升商品送達時間。

當倉庫在縣城裏建設後,就能夠將這些商品提早備貨到縣城倉庫,只要倉庫離你愈來愈近,你下單後不須要費那麼大的周折,從區域或中心倉庫發貨了,甚至你均可以去當地倉庫某個點上門自提了。

以下圖所示:

物流倉庫示意圖

縣城倉庫就是離用戶最近的倉庫,也就是在用戶與中心倉庫之間經過增長多級中間倉庫,就近發貨,加快送貨速度,提高了用戶體驗。

二、靜態資源文件部署方式

那麼,若是在網絡上,當你訪問一個購物商城時,點擊進入商品詳情頁,能夠看到會有大量圖片以及廣告視頻,這些都屬於靜態資源,那麼這些靜態資源用戶是如何訪問到的?

最開始,咱們考慮部署個 Nginx 集羣,每臺機器上都會存儲這些靜態資源,能夠經過某個服務將文件上傳到其中一臺機器,而後 rsync 方式分發到其餘 Nginx 機器上。對於小的靜態資源文件這麼作沒有問題。

可是,對於圖片、視頻這些資源可能從幾M到幾百M不等,是不建議放到 Nginx 集羣上的,並且也不建議使用分佈式緩存,分佈式緩存自己也不建議存儲過大的Key。假設你的確這麼作了,把 Nginx 集羣或者分佈式緩存都部署在北京機房,當用戶訪問這些資源時,因爲要通過多個骨幹網絡上的傳輸,會致使網絡延遲高,給你在視覺上感受就是圖片沒法加載,視頻播放卡頓的現象。

此時,我想你也不會有興趣在繼續等下去了,對於電商網站來講用戶就此流失了。

一般,咱們能夠將小的靜態資源文件使用 Nginx 集羣當作源站,而對於流媒體音視頻數據,會使用單獨的分佈式存儲做爲源站。所謂源站,即你的靜態數據原始存儲的地方。爲了達到高可用的、高穩定性的目的,結合企業成本考量,通常要部署成 BGP 多線機房。

BGP 機房示意圖以下所示:

BGP 機房示意圖

所謂的 BGP,它能夠實現讓網站在各運營商線路之間實現互聯互通,作到全部互聯運營商的用戶訪問網站都很快,結合用戶網絡選擇最優質的網絡鏈路。所以,BGP 機房帶寬的成本更高。

BGP 機房帶寬成本通常在80~400元/M,因此假設每 1M 流量按照 100元算,那麼 1G 流量就是 10 萬塊的,若是是幾十或者上百 G流量,這個成本可想而知了。

三、靜態資源加速之 CDN 技術

在上面的案例中,咱們知道了用戶訪問靜態資源,會直接訪問 BGP 源站,帶寬成本是很昂貴的。一個網站用戶會分佈在全國各地,甚至是分佈在全球,如何讓用戶更快的訪問這些靜態資源呢?

咱們也能夠借鑑物流倉庫的例子來理解,跟物流倉庫相似,固然是這些靜態資源離用戶越近,訪問就越快了。由此,CDN 技術應運而生了。

什麼是 CDN 技術?

CDN 的全稱是 (Content Delivery Network/Content Distribution Network),即內容分發網絡。CDN解決的問題是在網絡中增長一層CACHE(緩存)層,將源站的資源分發到距離用戶最近的網絡"邊緣"節點上,使用戶就近訪問內容,提升網站響應速度,避免網絡擁塞,保證了用戶訪問資源的速度和體驗。

增長 CDN 節點後,以下圖所示:

用戶訪問CDN

CDN 的分發架構:

跟物流倉庫作個類比:中心倉庫物流就是至關於 CDN 中心節點,區域物流倉庫至關於 CDN 區域節點,縣城物流倉庫中心就至關於 CDN 邊緣節點。

CDN 分發架構示意圖:

CDN 分發架構示意圖

當前 CDN 技術應用是很是廣泛的,有實力的公司,也會自建 CDN,並且有本身的CDN研發團隊支撐,提供了更加穩定可靠的 CDN 服務。可是大多數公司,仍是會選擇專業的 CDN 廠商,若是你的服務部署在雲上,能夠選擇阿里雲、騰訊雲提供的 CDN 服務。此外,還能夠選擇老牌的 CDN 廠商,如網宿和藍汛。

CDN 工做原理:

那麼用戶是如何訪問到離他最近的 CDN 節點的呢?

咱們仍是用一張圖來總體理解下,更加直觀:

CDN 工做原理

上述這張圖解決了兩個問題:

訪問域名如何映射到 CDN 地址的

如何找到離用戶最近的 CDN 節點

接下來,咱們根據上面兩個問題,結合圖示來詳解下這個流程。 

1. 訪問域名如何映射到CDN地址

當你經過瀏覽器訪問 static.example.com 域名時,假設這就是個靜態域名,而且作了 CDN 靜態資源加速。

1)首先會通過本地 DNS 解析器,查看下本機 /etc/hosts 文件是否存在域名對應的IP,若是找到,直接使用該 IP 發起請求。不然,執行步驟2)。

2)因爲本地 DNS 服務器解析,若是在本地 DNS 緩存中找到域名對一個IP,則直接用該 IP 訪問。不然,繼續步驟3)。

3)本地 DNS 服務器會向根域名服務器發起請求,根域名服務器返回頂級 DNS 域名服務器地址,讓你去它那裏查找。

4)本地 DNS 服務器會向頂級 DNS 域名服務器發起請求,.com 頂級域名服務器返回權威 DNS 域名服務器地址,讓你去它那裏查找。

5)本地 DNS 服務器繼續向 example.com 權威 DNS 域名服務器發起請求,權威 DNS 域名服務器一看這個域名我能解析,發現是有作過CDN加速域名配置,它會 CNAME 到 static.xxx.example.cdn.com 域名。

到此,其實咱們經過訪問靜態域名 static.example.com 通過一番波折,終於找到了 CDN 域名地址。

若是你不須要找離用戶最近的節點,經過 static.xxx.example.cdn.com 域名就能夠找到正確的 IP 地址了。

2. 如何找到離用戶最近的 CDN 節點

結合上圖,繼續解析若是找到距離用戶最近的 CDN 節點。

1)本地 DNS 服務器會將 static.xxx.example.cdn.com 會向第一層 GSLB 全局負載均衡發起請求,第一層全局負載均衡會根據用戶所在運營商網絡分析,好比移動運營商,返回 CNAME 到如 static.yd.example.cdn.com 域名地址。

2)本地 DNS 服務器會繼續向第二層 GSLB 全局負載均衡發起請求,第二層全局負載均衡依據 DNS 地理位置判斷,返回 SLB CDN 負載均衡地址。

3)本地 DNS 服務器從返回的多個 CDN 節點 IP 中,能夠經過本地簡單輪詢的方式去選擇一個 CDN IP 訪問。

此時,最終經過 GSLB 全局負載均衡找到的這些 CDN 節點,就是離用戶最近的 CDN 節點了。

什麼是 GSLB?

GSLB(Global Server Load Balance),即全局負載均衡,它的含義是對於部署在不一樣地域的服務器之間作負載均衡。一方面可讓流量均衡負載到它下面的服務器上,另外一方面能根據地理位置判斷,找到離用戶最近的服務器。

找到了離用戶最近的 CDN 節點,並不必定能直接從該 CDN 節點上獲取對應的資源,若是資源不存在,會繼續從上級區域或中心 CDN 節點查找,若是都不存在,最終就會回源到源站獲取資源,而後設置 CDN 緩存失效時間。

通常對於一些小的靜態資源文件,存儲在源站,由 CDN 節點主動拉取方式來訪問的。

對於大的音視頻流媒體文件,能夠經過 CDN 廠商提供的接口提早將資源寫入到 CDN 某一個節點上,再由 CDN 內部機制將資源分發到其餘 CDN 節點上。

可是,即便主動同步資源,也是存在延時的,最終可能會致使回源,而回源帶寬成本又是很大的。因此,咱們在使用 CDN 的時候就有必要關注 CDN 命中率和源站帶寬狀況。

四、解析過程當中的名詞解釋

CNAME( Canonical Name ):

它能夠將一個域名解析到另一個域名。

舉個例子:

當你使用 docs.example.com 去訪問一些資源時,但願經過 docs-xyz.example.com 也能訪問相同的這些資源,你能夠在 DNS 解析服務商添加一條 CNAME 記錄,將 docs-xyz.example.com 指向 docs.example.com,添加後,全部訪問 docs-xyz.example.com 的請求都會被轉發到 docs.example.com 域名。

CNAME 域名:

接入 CDN 時,在 CDN 廠商控制檯添加完加速域名後,會獲得一個 CDN 給你分配的 CNAME 域名, 須要在你的 DNS 解析服務商添加 CNAME 記錄,將本身的加速域名指向這個 CNAME域名,這樣該域名全部的請求才會都將轉向 CDN 的節點,達到加速效果。

DNS (Domain Name System):

域名解析服務。

將域名解析爲網絡上可識別的IP地址。服務器之間認識的都是IP,但用戶習慣記憶的都是域名,因此域名與IP地址之間關係是一對一的。它們之間的轉換工做,就稱爲域名解析,由專門的解析器來完成域名解析,可參見上述圖中的 DNS 解析過程。

五、最後的總結

你們可能以爲做爲一名工程師,離上述提到的 CDN 技術很遙遠,忽略 CDN 技術的重要性,好像都是運維乾的事情,與我何干。這個想法是錯誤的,我們的思惟不能太過於侷限,若是你作一些直播、視頻相關技術,多多少少確定能接觸到這塊的技術。

你有沒有考慮過抖音、快手上的短視頻的整個流程,A城市用戶上傳視頻後,通過轉碼分發後,B城市用戶很快就能看到了,視頻播放也是很是流暢,這其中也是得益於 CDN 分發技術的應用。

本文經過引入物流倉庫的例子與 CDN 技術作個類比,對於 CDN 分發架構有了感官認識。

同時對 CDN 解析工做原理作了進一步剖析,你們經過 CDN 工做原理分析的那張圖好好理解一下,裏面包含了 DNS 解析的詳細過程,DNS GSLB 是如何查找離用戶最近節點的。

CDN 是各大系統的門面,更擅長緩存靜態數據、圖片、流媒體數據。CDN 做爲一種特殊的緩存,它的命中率和高可用性也是咱們須要重點關注的。

有收穫掃碼關注 Java愛好者社區 支持,公衆號:javatech_cbo 原創乾貨及時推送!

歡迎關注個人公衆號,掃二維碼關注得到更多精彩文章,與你一同成長~
Java愛好者社區

相關文章
相關標籤/搜索