一、CDN的用途
目前,CDN主要是分幾個方向發展,比如靜態內容的分發、視頻流媒體的分發、動態資源的加速、源站保護等,其中最基本的是用來做靜態內容分發。阿里CDN現在最大的用途是用作淘寶所有圖片的分發。視頻流媒體的分發功能使用,發展速度也非常之快。CDN一些特色功能的應用,如動態資源的加速,還有SSL的接入、SPDY的接入等。CDN還有一個功能是源站保護,它可以通過各種安全防御,實現源站流量的減少。
二、CDN的加速原理
CDN最大的特色在于加速。那么,CDN是如何實現各種“加速”,發揮“加速”功用呢?如下圖所示,CDN有很多節點,通過域名實現就近接入。當用戶發起一個請求后,CDN會回源取,然后把文件就近緩存在那個節點的服務器上。假設北京的用戶到北京節點只需4毫秒,后面寫了一個90%的請求其實都直接命中到了服務器,那么還有10%的流量回到了二級cache節點。而二級cache節點也是同樣的緩存服務器,假設它的命中率也是90%,那么最終只有1%的流量到源站。如果純粹回到源站可能需88毫秒,而通過訪問CDN就會大大縮短時間,甚至4毫秒就可以讓用戶拿到一個文件。這是CDN實現加速的基本原理。
三、阿里CDN分布
CDN加速的載體在于節點,阿里CDN節點分布可謂星羅棋布,如下圖所示。阿里CDN服務器原先主要用于淘寶圖片的分發,在全國32省(市、區)均有服務器,有200多個節點,在一線城市運營商均有機房,甚至在外國也有30余個節點分布,以提供國外用戶的加速服務。
四、阿里CDN應用
這兩天,我去拜訪了一些客戶。他們把阿里云的CDN與業界其他一些比較有名的商業CDN進行比較統計,得出的結論是:阿里云CDN的平均延遲大概能有10%到20%的下降。
阿里從2008年開始,就著手自建CDN。不知不覺阿里云已成為世界上最大的圖片CDN。這可能跟中國的網上購物習慣有關——一個商品需要幾十張圖片進行介紹。這使得阿里云圖片CDN可能跟某些視頻CDN流量有的一拼。從2014年3月起,阿里CDN正式開啟商業化運營模式。商業化運營對阿里云CDN的需求,跟圖片CDN區別是非常大的,這對于阿里云有很多的挑戰。原來的圖片CDN,對于阿里云來說,主要是每年大促期間帶來的壓力,至少到2012年,阿里云CDN唯一任務就是為了“雙十一”。那時,阿里云會做很多預案以應對瘋狂的流量。下面這一張是CDN的流量圖,就可以看到阿里云2009到2012年,阿里云整個水位是非常滿的。這對于阿里云CDN來說,主要的挑戰在于:做到良好的均衡性。比如這個節點要把流量定量切到另外一個節點,阿里云做了很多的工作。另外,阿里云在節點內對軟件穩定性和性能等方面也做很多優化。比如說現在一個節點能服務40G,但是有時候節點面對突然涌過來的大流量時,你甚至來不及調度。這就要求你的軟件至少需要扛過大于40G的能力。每年阿里云會做5次以上的壓測。在跑滿40G的情況下面,連續跑一個星期,檢驗以保障阿里云CDN節點不會掛掉,能夠繼續提供比較可靠的服務。這對于軟件的可靠性方面,壓力也是非常大的。
從去年開始,阿里云整個團隊的開發方向就轉向做對外服務。從2013年開始,阿里云CDN的服務能力已經遠超阿里云自用的能力。就像阿里云一些PE所說,阿里云CDN團隊基本上可以坐在那里喝著茶看著雙十一的流量就可以了。
現在阿里CDN的目標是:做到能夠快速、安全、易用,能幫用戶減少成本。
下面是CDN的一些關鍵組件:
l IP庫
l 調度系統
l 緩存系統
l 刷新系統
l 日志系統
CDN需要知道用戶從哪里來,才能調度, IP數據庫阿里云已經做了好幾年。如果你們想去查一下某個IP是從哪里來的,ip.taobao.com這個外部的接口可以用。為了提高準確性,阿里云還會拿淘寶的收貨IP做對比,查是否這個IP是屬于這個地區的。現在在市一級的準確率能做到96%左右。ECS用戶應該可以免費調用阿里云IP庫的接口。
現在CDN有兩個維度可以進行調度。一是地域的概念,比如說你去瀏覽器里面輸一個www.taobao.com,域名查詢請求會提交到運營商本地的DNS服務器,DNS服務器有一個迭代查詢的過程,最后到了調度中心。調度服務器會根據源IP。比如你是北京電信的DNS的IP,就將你調度到北京電信的機房去。二是CDN是有高可用性的,調度中心在不停的監控所有節點的健康狀況,一旦發現這個節點有問題,會將用戶切換到另外一個節點。
上圖是CDN節點的緩存系統,LVS是4層的代理,Tengine主要進行并進行負載均衡,swift是一個高效的緩存服務器,作靜態文件的緩存用。Tengine和Swift進行一致性hash,可以提高命中率。其他還有一些控制機器,做刷新和配置這些功能。
上圖是Swift的緩存架構淘汰邏輯。現在阿里云能做到內存、SSD、SATA三級緩存、可以適應各種尺寸的文件。阿里云的服務器既能做圖片的緩存,也能做視頻大文件緩存,熱對象會自動上升到內存,冷對象會被淘汰到SATA。為了提高IO性能,阿里云沒有使用文件系統,直接使用整個裸磁盤。在裸盤上,阿里云實現了Squid的COSS文件系統。COSS文件系統中都是一個Stripe進行IO寫操作。阿里云使用8M一個Stripe,新來的文件就append在Stripe里面,每次都是8M的寫,這樣就可以提高IOPS。當Stripe滿以后,寫SSD時,看原有的內容是否熱的,如果是熱點,就放到內存。如果是冷的,就淘汰到內存。
去年阿里CDN開始對外應用以后,用戶增加非常迅速。原來以配制文件的形式管理的配置系統,已經不能滿足業務需求。于是,阿里云開發了一個加載配制模塊,它是lazy的。它的局部性效果非常明顯,雖然阿里云線上有幾萬個域名,但在一個節點上,阿里云發現也就一兩千個域名在服務,所以按需加載的方式較好。另外阿里云也做了很多優化,10萬域名只占500兆內存,非常高效。同時,阿里云也能做到全網分鐘級別配置分發,總體來說,阿里云的配制可以做到高可靠、可運維。
有時,CDN上的緩存文件更新了,我要把它刪掉。刷新需要全網分發,而全網的每一臺機器,每一個cache節點全部要刷,因為我不知道文件存在哪里,都是廣播的,而現在,阿里云按調度頻道來刷,就能減少一定量的刷新。另外,阿里云增加了合并功能。比如,現在有100個URL過來刷新,可以合并為一次提交到Cache服務器,從而減少刷新的QPS。此外,Swift支持正則和目錄刷新,只需提交一個請求就可以刷很多內容。現在從統計數據上看,全球節點99%以上能做到1分鐘的刷新。
目前,阿里云阿里內部已經實現了海量日志搜集與分析系統。原來阿里云也是用syslog來搜集日志,在40G跑滿時,syslog丟包非常嚴重。特別是在對外商用以后,日志需要計費,對可靠性要求非常高,所以后來就開發了一個傳輸日志和實時分析系統。同時,內部也做了一些優化,比如合并功能,多條日志合并后再發到日志服務器上,使用LZO進行流式壓縮,最終收集到中心。現在阿里云可以做到產生的日志10分鐘傳到OSS上以供下載。這個速度在業界來說是非常快的。現在,阿里云整個CDN的量級大概每天有幾百T的訪問日志,最終都會導入到阿里云ODPS上進行大數據分析,比如用戶行為分析。
阿里CDN針對TCP協議棧的做了優化,比如說阿里云做了基于時間序的丟包發現機制,TCP的包是有序號的,阿里云按照序號來查看,如果發現高序號的TCP的ACK,但是低的沒有發過來。阿里云會以更快的一個重傳機制來確保阿里云低序丟失的包能夠快速發過來。結合自適應的初始窗口等單邊優化措施,最終阿里云將小對象的平均RT降低20%以上。
這個功能是頁面內容優化,就是按照前端優化準則進行自動化的內容調整。比如說減少頁面中請求的數量。阿里云會做一些靜態資源文件合并。還有就是盡可能減少頁面大小,阿里云會主動刪除頁面空白符,還有一個智能Gzip,通過主動發起JS異步請求,進行探測,即使沒有Accept-Encoding頭也會主動做壓縮。CDN這邊也在跟前端的同學一起來做,比如做一個UA的數據庫,去保存每一個User Agent對應的分辨率,不同的分辨率選擇不同尺寸的圖片。
CDN其實不僅僅是靜態內容的HTTP加速,還可以做TCP協議的加速。如上圖所示案例顯示,阿里云最近發現臺灣用戶訪問淘寶頁面非常慢,特別是從國內到國外這個鏈路是比較差的。阿里云在臺灣有節點,香港有節點,上海有節點,臺灣到上海延時有200毫秒,臺灣到香港是20毫秒,香港到上海60毫秒。阿里云發現,從臺灣、香港再回來反倒更短,所以做了CDN之間的路由優化,對TCP連接進行加速。這個圖最終會有很多節點,就是一個有向圖,阿里云在每一個CDN節點上做相互節點之間的網絡探測,檢測整個網絡的丟包率和延時,構建出一個有權值的表格,然后阿里云去計算最短路徑。
流媒體這個業務跟圖片有很大的區別。圖片的文件大小只有30到50K,但是視頻的平均文件大小可能會到500K到2M。首先,流媒體對于CDN節點的流量沖擊會非常大,基于傳統的DNS調度有緩存時間,一般有5到10分鐘的延時,甚至有一些節點都調不走。阿里云這邊就設計了一個中心式的,基于HTTP協議的調度方法。當請求某個URL的時候,CDN根據節點的負載會直接返回資源或者302重定向,作精確調度。幾乎就沒有延時時間,甚至可以在每個節點的機器間相互調度。
最近阿里云這邊在做無線加速的產品,阿里云現在使用了HTTP DNS。無線APP有自己的客戶端,HTTP DNS集成在APP SDK中,當APP啟動時會發起一個定期異步的請求,去中心請求域名解析,然后把IP保存下來。當下次發起真實請求時,可以直接去請求了。所以HTTP DNS可以節省域名解析的時延,也可以避免國內的一些運營商作的域名劫持。
另外一個就是做了SPDY的優化,多路優化有什么好處呢,一個是復用連接,減少連接數,提高頁面打開的速度,就手機淘寶這邊的經驗來看,做SPDY鏈路復用最終是能有20%到30%加載頁面時間的降低。
最后一個是安全功能,現在CDN提供了4、7層的DDoS安全防御和WAF,可以使用戶免于攻擊,并提供一站式解決方案。CDN可以提供源站保護功能,靜態資源CDN可以緩存,最終落到源站的流量都會合并,流量是非常小的。現在安全服務是不額外收費的。
這是7層攻擊的一個案例,經常有一些用戶說,你們怎么防攻擊的流量算我錢,實際上防攻擊不是免費的。這是我昨天截的圖,這是7層的攻擊,突然間針對原來那個小站有15萬QPS的攻擊流量,它的響應大小是15KB。可以看到只要打開安全功能,CDN已經擋了99%以上的攻擊,并保證它的正常服務,幫用戶節省了17Gbps的流量費用。
新聞熱點
疑難解答