來源公眾號JAVA愛好者社區 ,
作者東升的思考
本文導讀:
- 物流倉庫配送如何加速
- 靜態資源文件部署方式
- 靜態資源加速之CDN技術
- 解析過程中的名詞解釋
- 最后的總結
1、物流倉庫配送如何加速
我們還是從生活中購物的例子來展開。
將時光倒回到幾年前,在那時候我的老家縣城里,如果你從京東App上購物下單,起碼需要等上個幾天時間,才能將商品送到你的手中。
因為他們的物流倉庫中心當時并沒有在縣城里來建設,所以一般可能從地市或者省會(看做區域倉庫)物流倉庫去查找是否有庫存,如果區域物流倉庫還是沒有庫存,則可能會從北京物流倉庫(看做中心倉庫)發貨,一旦中心倉庫也無貨,那就只能從廠商進貨了(看做源站)。
但是,現在不一樣了,不管你是身在一線城市還是在老家,從京東網站上購物(默認以自營商品為主)下單,基本隔天就能收到貨了,快遞小哥送貨效率都是一樣的。
這就是京東強大的物流優勢,將物流倉庫擴建到離老百姓最近的地方,使得用戶購物體驗得到了非常大的提升。
通過這個案例,我們就理解了商品送貨的加速過程。
商品有普通商品,大件商品等,這些商品最開始都是備貨到中心物流倉庫,中心物流倉庫可以認為是幾乎是最全的商品倉庫中心。
當區域物流倉庫建設好之后,就可以將這些商品提前備貨到區域倉庫,進一步提高商品送達時間。
當倉庫在縣城里建設后,就可以將這些商品提前備貨到縣城倉庫,只要倉庫離你越來越近,你下單后不需要費那么大的周折,從區域或中心倉庫發貨了,甚至你都可以去當地倉庫某個點上門自提了。
如下圖所示:
縣城倉庫就是離用戶最近的倉庫,也就是在用戶與中心倉庫之間通過增加多級中間倉庫,就近發貨,加快送貨速度,提升了用戶體驗。
2、靜態資源文件部署方式
那么,如果在網絡上,當你訪問一個購物商城時,點擊進入商品詳情頁,可以看到會有大量圖片以及廣告視頻,這些都屬于靜態資源,那么這些靜態資源用戶是如何訪問到的?
最開始,我們考慮部署個 Nginx 集群,每臺機器上都會存儲這些靜態資源,可以通過某個服務將文件上傳到其中一臺機器,然后 rsync 方式分發到其他 Nginx 機器上。對于小的靜態資源文件這么做沒有問題。
但是,對于圖片、視頻這些資源可能從幾M到幾百M不等,是不建議放到 Nginx 集群上的,而且也不建議使用分布式緩存,分布式緩存本身也不建議存儲過大的Key。假設你的確這么做了,把 Nginx 集群或者分布式緩存都部署在北京機房,當用戶訪問這些資源時,由于要經過多個骨干網絡上的傳輸,會導致網絡延遲高,給你在視覺上感覺就是圖片無法加載,視頻播放卡頓的現象。
此時,我想你也不會有興趣在繼續等下去了,對于電商網站來說用戶就此流失了。
通常,我們可以將小的靜態資源文件使用 Nginx 集群當做源站,而對于流媒體音視頻數據,會使用單獨的分布式存儲作為源站。所謂源站,即你的靜態數據原始存儲的地方。為了達到高可用的、高穩定性的目的,結合企業成本考量,一般要部署成 BGP 多線機房。
BGP 機房示意圖如下所示:
所謂的 BGP,它可以實現讓網站在各運營商線路之間實現互聯互通,做到所有互聯運營商的用戶訪問網站都很快,結合用戶網絡選擇最優質的網絡鏈路。因此,BGP 機房帶寬的成本更高。
BGP 機房帶寬成本一般在80~400元/M,所以假設每 1M 流量按照 100元算,那么 1G 流量就是 10 萬塊的,如果是幾十或者上百 G流量,這個成本可想而知了。
3、靜態資源加速之 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 節點
接下來,我們根據上面兩個問題,結合圖示來詳解下這個流程。
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 命中率和源站帶寬情況。
4、解析過程中的名詞解釋
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 解析過程。
5、最后的總結
大家可能覺得作為一名工程師,離上述提到的 CDN 技術很遙遠,忽略 CDN 技術的重要性,好像都是運維干的事情,與我何干。這個想法是錯誤的,咱們的思維不能太過于局限,如果你做一些直播、視頻相關技術,多多少少肯定能接觸到這塊的技術。
你有沒有考慮過抖音、快手上的短視頻的整個流程,A城市用戶上傳視頻后,經過轉碼分發后,B城市用戶很快就能看到了,視頻播放也是非常流暢,這其中也是得益于 CDN 分發技術的應用。
本文通過引入物流倉庫的例子與 CDN 技術做個類比,對于 CDN 分發架構有了感官認識。
同時對 CDN 解析工作原理做了進一步剖析,大家通過 CDN 工作原理分析的那張圖好好理解一下,里面包含了 DNS 解析的詳細過程,DNS GSLB 是如何查找離用戶最近節點的。
CDN 是各大系統的門面,更擅長緩存靜態數據、圖片、流媒體數據。CDN 作為一種特殊的緩存,它的命中率和高可用性也是我們需要重點關注的。