CDN 原理入門,你學會了嗎?
概述
CDN? 的全稱是 Content Delivery Network,即內(nèi)容分發(fā)網(wǎng)絡,基本思路是: 盡可能避開互聯(lián)網(wǎng)上有可能影響數(shù)據(jù)傳輸速度和穩(wěn)定性的瓶頸和環(huán)節(jié), 使內(nèi)容傳輸?shù)酶旄€(wěn)定。
圖片來源: https://www.researchgate.net/figure/Content-Delivery-Network_fig1_221632001
CDN 技術原理
CDN? 的 基本原理為反向代理,反向代理(Reverse Proxy)方式是指以代理服務器來接受 Internet? 上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡上的服務器, 并將從服務器上得到的結果返回給 Internet? 上請求連接的客戶端,此時代理服務器對外就表現(xiàn)為一個節(jié)點服務器。通過部署更多的反向代理服務器,來實現(xiàn) 多節(jié)點 CDN 架構。
CDN? 主要使用了 負載均衡、動態(tài)路由? 和 內(nèi)容壓縮 來提高其性能和可靠性:
? 分布式存儲: 采用可擴展的系統(tǒng)架構,利用多節(jié)點、多位置、多種方式存儲數(shù)據(jù)
? 負載均衡: 可以將流量均勻地分配到多個節(jié)點服務器上,從而避免某些服務器過度負載而導致響應時間延遲
? 動態(tài)路由: 可以根據(jù)網(wǎng)絡流量和服務器負載情況來選擇最優(yōu)的路徑和服務器來響應用戶請求
? 內(nèi)容壓縮: 可以將內(nèi)容文件壓縮到更小的體積,以減少網(wǎng)絡傳輸?shù)臅r間和成本
簡單地理解,CDN 就是客戶端和真實服務器之間的一層高效的緩存。
傳統(tǒng)網(wǎng)站訪問過程
在說明 CDN? 的技術優(yōu)勢之前,我們先來看看傳統(tǒng)網(wǎng)站的 HTTP 請求 訪問過程。大部分開發(fā)者應該都熟悉 HTTP 協(xié)議基礎流程,下面以請求一個圖片文件來舉例說明。
1.客戶端瀏覽器輸入網(wǎng)址,如 https://www.example.com/logo.png
2.瀏覽器請求 DNS? 服務器,查詢 https://www.example.com/logo.png? 對應的源服務器 IP 地址
3. DNS 服務器返回對應的 IP 地址
4. 瀏覽器向服務器發(fā)起 TCP 連接
5. 瀏覽器通過建立的 TCP? 連接發(fā)送 HTTP 請求圖片文件
6. 服務器向瀏覽器發(fā)送圖片文件
7. 瀏覽器將接收到的圖片文件渲染,完成本次請求
傳統(tǒng)網(wǎng)站訪問過程
如果我們要加入 CDN 的話,是加到哪個步驟呢?
根據(jù)上面描述的步驟不難發(fā)現(xiàn),從第 3 步開始,客戶端瀏覽器就和真實的服務器開始建立連接了,連接建立完成后,客戶端瀏覽器就直接從服務器獲取數(shù)據(jù), 這顯然不是我們需要的,因為這樣所有的客戶端都會直接連接服務器,會嚴重增加服務器的負載。
我們再來看第 2 步,瀏覽器在訪問真實的服務器之前,會先通過 DNS? 查詢域名對應源服務器的 IP? 地址,如果 DNS? 返回的是 CDN? 服務器的 IP? 地址, 那么后面的流程就會變?yōu)? 客戶端瀏覽器就直接從 CDN? 服務器獲取數(shù)據(jù),接下來的工作就會全部轉(zhuǎn)交給 CDN 了,如何完成這項工作呢?
將域名 www.example.com 的 CNAME 記錄解析到 CDN 服務商即可,CDN 服務商的 DNS 服務器也稱為權威服務器 (細節(jié)請看上篇文章: DNS 原理)。
接入 CDN 網(wǎng)站訪問過程
1. 客戶端瀏覽器輸入網(wǎng)址,如 https://www.example.com/logo.png
2. 瀏覽器請求 DNS? 服務器,查詢 https://www.example.com/logo.png? 對應的服務器 IP 地址
3. 由于域名的 CNAME? 記錄解析到了 CDN? 服務商,所以這里 DNS? 服務器會返回 CDN? 服務商提供的 CDN 節(jié)點服務器的地址
4. 瀏覽器向 CDN? 節(jié)點服務器發(fā)起 TCP 連接
5. 瀏覽器通過建立的 TCP? 連接發(fā)送 HTTP 請求圖片文件
6. CDN? 節(jié)點服務器使用內(nèi)部專用 DNS? 解析出域名對應的源服務器 IP 地址
7. CDN 節(jié)點服務器向源服務器發(fā)起TCP連接
8. CDN? 節(jié)點服務器通過建立的 TCP? 連接發(fā)送 HTTP 請求圖片文件
9. CDN 服節(jié)點務器接收到圖片文件后,在本地保存一份,作為緩存使用,減少源服務器的回源流量
10. CDN 節(jié)點服務器向瀏覽器發(fā)送圖片文件
11. 瀏覽器將接收到的圖片文件渲染,完成本次請求
接入 CDN 網(wǎng)站訪問過程
中央節(jié)點如何選擇提供服務的 CDN 節(jié)點
一般會綜合考慮以下幾個方面:
- ? 網(wǎng)絡成本
- ? 流量分布
- ? 源站負載
- ? 地理位置
這里以 地理位置 舉例說明:
- 1. 用戶訪問 CDN? 服務商的權威 DNS 服務器
- 2. DNS? 服務器獲取用戶的 IP 地址
- 3. 根據(jù)用戶 IP 地址查詢用戶所在地
- 4. 返回離用戶最近的 CDN? 節(jié)點的 IP? 地址,比如用戶離北京近,就返回北京的 CDN? 節(jié)點的 IP 地址
按照地理位置訪問 CDN 節(jié)點過程
如何提高 CDN 緩存命中率
- ? 在流量高峰來臨前,將熱門資源提前預熱到 CDN 節(jié)點
- ? 合理配置文件緩存過期時間,如將靜態(tài)文件緩存過期時間設置為 1 個月甚至更久
- ? 消除 URL 中文件名稱后面的參數(shù),如 https://www.example.com/logo.png? 和 https://www.example.com/logo.png?versinotallow=123 應該被視作同一個文件處理
- ? 超大文件設置分片回源策略,如 視頻文件?, APP 安裝包 等
不適合使用 CDN 的場景
- ? 請求客戶端和服務器物理距離很近,比如同機房、同機架的內(nèi)網(wǎng)服務
- ? 用戶分布在同一地理區(qū)域,如同城服務、本地門戶網(wǎng)站
- ? 動態(tài)文件或接口,比如更新很頻繁的文件,使用 CDN 反而會增加響應耗時
數(shù)據(jù)如何回源
還是以剛才的 https://www.example.com/logo.png? 為例,CDN 節(jié)點服務器會先把這張圖片緩存起來,下次有相同的請求到達時,直接返回緩存的圖片,從而減少回源流量。
這里提到的 緩存? 是一個很復雜的功能,下面是阿里的 HTTP 緩存服務器,名字叫 Swift。
阿里 - CDN 節(jié)點
圖中是一個 CDN? 節(jié)點,用戶的請求從 LVS?(LVS是一個四層的負載均衡組件)的入口來,先由 LVS? 做一次 4 層的負載均衡, 然后轉(zhuǎn)到一臺 Tengine?(阿里在 Nginx? 的基礎上開發(fā)的服務器)上,Tengine? 做一致性哈希,選擇一臺 Swift 服務器去做緩存數(shù)據(jù)回源。
阿里 - Swift 架構
首先可以看到,Swift? 是一個多線程的程序,每個線程啟動一個 epoll? 來充分發(fā)揮多核的處理能力,并且盡量減少線程間的上下文切換,一個請求盡量在一個線程處理。除此之外,還能看到 內(nèi)存緩存,SSD 緩存,SATA 緩存。Swift? 有熱點淘汰和提升機制,將熱文件放在內(nèi)存里,次熱文件放在 SSD 上,最后才是 SATA 盤。叔度 (阿里 CDN 負責人) 指出,Tengine? 和 Swift? 是通過 Spdy 協(xié)議 來通信的,從而優(yōu)化 HTTP 的傳輸效率。
小結
CDN 的原理是: 基于分布式架構,通過將源服務器上的內(nèi)容分發(fā)到多個節(jié)點服務器上,使用戶能夠從最近的服務器中獲取所需內(nèi)容。這些節(jié)點服務器被稱為 邊緣服務器,它們通常位于不同的地理位置,并通過高速互聯(lián)網(wǎng)連接互相交換數(shù)據(jù)。用戶通過接入離他們最近的 邊緣服務器 來獲取所需的內(nèi)容,從而降低了響應時間和延遲,提高了網(wǎng)站的訪問速度。
Reference
- ? 如何自建低成本 CDN ?[1]
- ? 阿里云 - DCDN[2]
- ? 阿里云 - 提高CDN緩存命中率[3]
- ? 騰訊云 - CDN[4]
- ? 騰訊云 - SCDN[5]
- ? 百度百科 - CDN[6]
- ? CDN的原理以及其中的一些技術[7]
引用鏈接
[1]? 如何自建低成本 CDN ?: ??https://www.v2ex.com/t/877718??
[2]? 阿里云 - DCDN: ??https://www.aliyun.com/product/dcdn?spm=5176.7933777.J_3207526240.59.329a496e4a1hku??
[3]? 阿里云 - 提高CDN緩存命中率: ??https://help.aliyun.com/document_detail/123330.html??
[4]? 騰訊云 - CDN: ??https://cloud.tencent.com/product/cdn??
[5]? 騰訊云 - SCDN: ??https://cloud.tencent.com/product/scdn??
[6]? 百度百科 - CDN: ??https://baike.baidu.com/item/內(nèi)容分發(fā)網(wǎng)絡/4034265??
[7]? CDN的原理以及其中的一些技術: https://colobu.com/2016/09/23/CDN-introduction/