微信支付二面:你知道什么是內容分發網絡嗎?
1. 前言
大家好,我是所長大白(●—●)。
今天和大家聊聊內容分發網絡的那些事兒,希望大家有所收獲。
2. 為什么需要CDN
今天的主角是CDN,我們先看下百度百科對CDN的定義:
CDN的全稱是Content Delivery Network,即內容分發網絡。
CDN是構建在現有網絡基礎之上的智能虛擬網絡,依靠部署在各地的邊緣服務器,通過中心平臺的負載均衡、內容分發、調度等功能模塊,使用戶就近獲取所需內容,降低網絡擁塞,提高用戶訪問響應速度和命中率。
原來CDN并非網絡基礎設施,而是構建在實體網絡基礎設施之上的一個"應用層",并且是部署在各地的一個龐大的分布式網絡系統。
2.1 互聯網中的三個一公里
互聯網數據傳輸是個復雜的過程,整體來看可以分為三個一公里,如圖展示了互聯網數據流動的三個主要階段:
第一公里
網站服務器接入互聯網公網的鏈路,這里的帶寬也決定了網站的負載能力,也稱為網站的接入帶寬,也就小破站和大站的區別。
中間一公里
中間一公里主要是接入網、城域網、骨干網組成的鏈路實體,其中會涉及多家運營商,也就出現了運營商之間互聯互通的數據交換問題,是影響比較大的一個環節。
最后一公里
這是用戶接入互聯網獲取信息的最后環節,換句話說就是你們小區的網絡、你們家樓的網,往往這部分的帶寬不高,高速路很寬很長,可是到你家還是泥土路,也很糟糕。
2.2 運營商的互聯互通問題
運營商之間數據的互聯互通問題,比如A市聯通要訪問A市電信的數據資源,按照互聯互通的規則限制,不同運營商的數據要在指定的交換中心進行數據交換,假如交換中心位于較遠的B市,那么就存在如下圖的關系:
換句話說,本來兩個運營商是同一個城市的,但由于運營商的網絡差異需要到幾百公里之外的交換中心所在的城市進行數據交換,實現資源的訪問。
對于不同運營商間的互聯互通,一般是采用BGP peering對等的方式進行,兩家運營商相互協商,在特定地點建立連接和交換,從而實現運營商A的用戶對于運營商B的網絡中資源的訪問。
在中國,運營商之間通過“國家級互聯網骨干直聯點”進行連接,2001到2014年國內只有北上廣三個直聯點,導致跨網訪問體驗極差,流量無法本地中轉需要長途迂回,大大增加了延遲。
三批國家級互聯網骨干直聯點:
第一批2001年投入使用:北京、上海、廣州
第二批2014年投入使用:成都、鄭州、武漢、西安、沈陽、南京、重慶
第三批2017年投入使用:杭州、貴陽、福州
2.3 用戶&網站&運營商的共同苦惱
試想北美的海外用戶要訪問在服務器在深圳的資源,物理距離就有幾萬公里,算上三個一公里的消耗,恐怕用戶的體驗會非常糟糕。
同樣的,網站服務器的接入帶寬是有限的,對于海量用戶的接入訪問非常容易出現擁塞,這樣很容易把網站服務器壓垮。
同時,對于運營商來說也很糟糕,骨干網充斥著大量相同的請求,網絡基建壓力很大,如果把這些請求在本地處理掉該多好!
可見,如果沒有CDN這一層Cache應用,網站、用戶、運營商都會很崩潰。
CDN的思想和電商物流建立的區域倉庫、前置倉庫很像,用戶下單后優先在最近的倉庫配貨,極限情況下幾小時就可以送到用戶手里,用戶體驗好、物流壓力小。
3. CDN的基本原理
CDN是個非常復雜的大系統,作為普通的開發人員,我們抓住重點理解精髓就好。
3.1 CDN和DNS的調度
我們訪問資源時會使用DNS進行解析獲取資源服務器的IP地址進行數據交互,那么在使用CDN之后會發生什么變化呢?
- 傳統模式下DNS的調度過程
圖中我們看到用戶從LocalDNS開始查詢,如果找不到就到根權威DNS服務器,再向頂級權威DNS服務器訪問,依次迭代最終獲取待訪問域名的IP地址。
- 有CDN參與的DNS調度過程
前面我們曾經提到CDN是構建在承載網上的一個Cache應用層,也就是CDN作為用戶和網站服務器之間的Cache來參與整個過程。
這樣就出現一個問題:用戶如何獲取CDN資源節點的IP地址呢?
沒錯,其中一種常見的調度方案就是DNS調度,如圖所示:
前半部分和傳統模式類似,重要的區別在于專用DNS調度服務器的出現。
就是圖中的TenCent DNS Server,這臺專用DNS調度服務器根據CDN系統內部節點的位置、負載情況、資源分配等因素選出最優的CDN資源節點IP地址返回給用戶。
3.2 域名加速和CDN專用調度過程
要實現CDN資源節點的調度,需要網站做一些準備工作:
- 網站去CDN服務商進行域名加速
比如為源站abc.com到阿里云進行域名加速,配置完成后阿里云會自動關聯生成加速域名的別名如abc.com.aliyuncdn.net,這個別名也稱為CNAME。
這里我們提兩個重要的概念:CNAME和A記錄,它們是理解CDN的基礎概念。
CNAME記錄,也叫別名記錄,比如www.xx.com的別名是www.yy.com,CNAME記錄是一種指向關系,把www.yy.com指向了www.xx.com,一個域名可以有多個別名,存在多對一的關系。
A記錄,即Address記錄,我們可以把它理解為一種域名和IP地址的映射關系,比如www.abc.com對應的IP地址是1.1.1.1。
由于加速域名已經進行了CDN的CNAME配置,在權威DNS服務器的解析下得到的并不是IP地址而是CNAME,這一步非常關鍵。
- 權威DNS服務器的請求轉發
當用戶訪問abc.com時,傳統的權威DNS服務器對abc.com進行解析時得到的是abc.com.aliyuncdn.net這個配置的CNAME,從而通過CNAME順利將請求轉到CDN服務商專用的DNS服務器,由該服務器返回CDN的資源節點。
3.3 httpDNS調度和302調度
除了DNS調度,還有httpDNS調度、302調度等場景,來簡單看一下。
- httpDNS調度
HTTPDNS技術是一種針對DNS防劫持的有效手段,以HTTP的方式代替傳統DNS協議傳遞解析結果,能夠有效避開DNS層面的攔截和故障。該方案可以根據客戶端的來訪IP,直接通過Httpdns服務器獲取最精準的解析結果,避免因為DNS多出口,DNS攻擊導致的DNS解析失敗的問題。
客戶端直接調用HttpDNS接口獲取緩存服務器IP組,再擇優向IP組中的緩存服務器發送請求,替代常規DNS調度策略,適用于客戶端,且客戶端需稍作修改進行HttpDNS接口調用。
- 302調度
基于終端用戶的IP,做HTTP的精確重定向,需要協議支持、具有相當的時延,一般用于流媒體類加速場景。
該調度方式是通過DNS解析獲得CDN的GLSB集群的IP地址,用戶發送HTTP請求,GLSB服務器返回302 Found,將訪問重定向到合適的服務節點。
該方式也存在著一些不足:僅限HTTP的應用,可拓展性不足,調度過程多了302跳轉的重定向過程,相對DNS調度時延較長
httpsDNS和302調度都有自己的優勢和使用場景,不同的網站可以采用一種或者多種調度方案來綜合實施加速,三種方案并不對立,而是相互補充。
3.4 CDN內部架構簡介
有了CDN的加速,用戶就可以訪問近距離的服務器節點,大大提升了用戶體驗,同時源站的帶寬壓力也得到了分流,運營商骨干網壓力也隨之降低,看起來確實是個win-win-win的方案呀。
我們以阿里云官方文檔為藍本進行展開:
- 調度系統
支持DNS、HTTPDNS和302調度模式,當終端用戶發起訪問請求時,用戶的訪問請求會先進行域名DNS解析,然后通過CDN的調度系統處理用戶的解析請求,就是我們前面介紹的CDN參與下的DNS調度過程。
- 質量系統
實時監測緩存系統中的所有節點和鏈路的實時負載以及健康狀況,根據用戶請求中攜帶的IP地址解析用戶的運營商和區域歸屬,綜合鏈路質量信息為用戶分配一個最佳接入節點。
這里算是進行CDN節點選擇的一個策略和質量監控的閉環系統。
- 緩存系統
用戶在最佳接入節點訪問數據,如果節點已經緩存了資源,會直接將資源返回給用戶,如果L1和L2節點都沒有緩存請求的資源,此時回源站去獲取資源并存儲到緩存系統。
- 支撐系統
支撐服務系統包括數據智能和配置管理系統,實現資源監測和數據分析,例如對CDN加速域名的QPS、帶寬、HTTP狀態碼、PV、UV等數據進行監控。
3.5 靜態資源和動態資源的加速
CDN本質上就是一層Cache,有緩存就一定會有數據不一致問題,以及哪些資源適合做緩存,哪些不適合的問題。
- 靜態資源
如果每個用戶訪問得到的資源一樣,就像電視臺播放節目,大家看到的都一樣,并非個性化的結果,這類資源就可以稱為靜態資源,比如網站的圖片、視頻、軟件安裝包等。
這些資源變化很小,因此非常使用CDN加速,對改善網站性能效果明顯。
- 動態資源
區別于靜態資源,動態資源則更傾向于接口、個性化內容,用戶每次請求得到的結果可能不同,這些資源并不適合CDN場景,如果強行使用會帶來數據更新緩慢和不一致問題,但是動態資源有其特有的加速方法。
動態資源就意味著回源站進行數據請求,這其中就涉及到最優回源路徑的選擇,讓路更好走,數據獲取更快捷,實現動態資源的加速。
所以CDN也并非萬金油,我們要合理使用。
4. CDN的商業簡史
鏡頭拉回到20世紀90年代,當時全球范圍內網絡基礎設施還很薄弱,尤其在骨干網接入用戶越來越多,數據的長距離傳輸效果很差,已經阻礙了新興網絡科學的發展。
4.1 Akamai的誕生
這個現象很快被萬維網的發明人Tim Berners Lee注意并提出來,隨后他和麻省理工學院應用數學專家 Tom Leighton 教授討論該問題。
Tim Berners Lee教授
在意識到這問題的重大意義后,Tom Leighton教授帶領著研究生 Danny Lewin 和其他幾位頂級研究人員一起嘗試用數學問題解決網絡擁堵問題。
Tom Leighton教授
最終他們使用數學算法,處理內容的動態路由安排,解決了這個難題。
故事還沒有完,史隆管理學院的 MBA 學生 Jonathan Seelig 加入了 Leighton 的隊伍中,為這支技術隊伍插上了商業的翅膀,最終于 1998 年 8 月 20 日正式成立公司,命名為 Akamai。
時至今日,Akamai仍然是一家承載全球15%-30%網絡流量,客戶涉及谷歌、臉書、微軟等知名互聯網公司。
Akamai在全球部署150000多臺服務器,這些服務器部署在全球90多個國家,800多個城市,1000多個運營商的2500多個節點上。
4.2 CDN在中國的發展
和Akamai同一年誕生的還有中國第一家CDN公司藍汛ChinaCache。
隨著互聯網的發展,后續又出現了網宿科技、帝聯、快網等公司,在2014年之后各大互聯網公司紛紛推出了自己的云服務,其中佼佼者便是阿里云、騰訊云、金山云、七牛云等云服務商CDN公司。
圖片來自網絡
其中阿里云目前在國內市場份額第一,大約覆蓋了1/3的市場需求。
阿里云在全球擁有2800+節點。中國內地擁有2300+節點,覆蓋31個省級區域;海外、中國香港、中國澳門和中國臺灣擁有500+節點,覆蓋70多個國家和地區。全網帶寬輸出能力達150 Tbps。
目前在用戶需求、技術革新、市場競爭等多因素影響下,各大CDN服務商都開始進行轉型和技術優化,給用戶更好的體驗、更安全、更靈活的產品方案,前景廣闊發展迅猛。
5.總結
本文通過介紹CDN的定義和功能、互聯網三個一公里的數據流動等問題,讓我們對CDN要解決什么問題及其重要意義有了初步認識。
進一步,通過傳統DNS調度和使用CDN加速后的調度過程,闡述了CDN資源節點是如何被用戶端感知的。
同時以阿里云為藍本介紹了CDN網絡架構的基本組成部分,以及靜態資源和動態資源不同的加速方式。
最后從商業的角度介紹了互聯網之父提出的長距離傳輸帶來的網絡擁塞問題、麻省理工教授創辦第一家CDN公司、再到中國CDN的發展情況。
CDN是個復雜的工程,文章篇幅和筆者能力所限,只能和大家分享這么多了,希望對朋友們有所幫助,我們下期再見!