如何精心設(shè)計(jì)CDN架構(gòu)?

2014/07/11 09:29      邵海楊

 

文|邵海楊,UPYUN(又拍云)聯(lián)合創(chuàng)始人兼運(yùn)維總監(jiān)

國(guó)內(nèi),隨著互聯(lián)網(wǎng)的高速發(fā)展,因?yàn)楦鞔笸ㄐ殴镜恼?,造成了南電信北?lián)通互通有局限性,再加上大小且質(zhì)量參差不齊的運(yùn)營(yíng)商,在這特殊的氛圍的互聯(lián)互通下號(hào)稱“八線合一”的機(jī)房開始嶄露頭角?;ヂ?lián)網(wǎng)的廣泛性使得網(wǎng)民分散在全國(guó)各地,由于全國(guó)地區(qū)的經(jīng)濟(jì)發(fā)展和互聯(lián)網(wǎng)建設(shè)的不平衡,實(shí)際網(wǎng)民的體驗(yàn)往往受限于最后一公里的速度。在技術(shù)大噴井的年代,一些無聊或者有目的黑客攻擊也開始涌現(xiàn),無論是滲透還是DDoS攻擊都非常頻繁,時(shí)刻威脅著網(wǎng)站的安全……

上述種種問題,作為應(yīng)用服務(wù)提供商,我們要如何解決此類問題呢?歸根結(jié)底就是要充分利用好CDN(Content Delivery Network,即內(nèi)容分發(fā)網(wǎng)絡(luò))。

CDN的作用可以幫助我們解決哪些問題?

緩存代理

緩存代理類似內(nèi)容提供商源數(shù)據(jù)中心的一個(gè)透明鏡像,這些內(nèi)容可以在邊緣服務(wù)器中緩存和分發(fā),對(duì)于普通的網(wǎng)絡(luò)用戶來講,它通過智能DNS的篩選,用戶的請(qǐng)求被透明地指向離他最近的省內(nèi)骨干節(jié)點(diǎn),最大限度的縮短用戶信息的傳輸距離。在任何時(shí)間、地點(diǎn)或者不同的運(yùn)營(yíng)商之間(尤其在中國(guó)),快速響應(yīng)用戶請(qǐng)求。

它是通過在網(wǎng)絡(luò)各處放置節(jié)點(diǎn)服務(wù)器,所以無需更改源站的網(wǎng)絡(luò)拓?fù)?,而是根?jù)智能路由和用戶就近原則匹配,從而確保了內(nèi)容快又穩(wěn)定的傳輸,大大提高了用戶訪問網(wǎng)站的響應(yīng)速度。

路由加速

CDN服務(wù)初衷是確保快速可靠地分發(fā)靜態(tài)內(nèi)容,相對(duì)于動(dòng)態(tài)內(nèi)容來說,由于動(dòng)態(tài)內(nèi)容必須長(zhǎng)連接來操持連接和通訊,只是用戶到服務(wù)商之間的鏈路和質(zhì)量都無法控制。因此為了提供快速的網(wǎng)絡(luò)體驗(yàn),有必要事先設(shè)置一些最佳路由。如省內(nèi)骨干網(wǎng),雙線機(jī)房,以改善用戶的網(wǎng)絡(luò)體驗(yàn)。在中國(guó)典型的互聯(lián)互通問題上,網(wǎng)絡(luò)游戲加速就是一些最佳實(shí)踐。

安全防護(hù)

利用好了CDN網(wǎng)絡(luò),無論面對(duì)是滲透還是DDoS攻擊,攻擊的目標(biāo)大都會(huì)被指向到了CDN,進(jìn)而保護(hù)了用戶源站。因?yàn)镃DN是分布式的,所以即使遭受DDoS攻擊,也具備分散性,大大減少了源站收到毀滅打擊的可能性。在架構(gòu)的前期,還可以通過CDN做一些前置的安全保護(hù)工作,如攔截SQL注入、XSS跨站、網(wǎng)站掛馬、篡改等黑客攻擊。

節(jié)省成本

CDN節(jié)點(diǎn)機(jī)房只需要在當(dāng)?shù)剡\(yùn)營(yíng)商的單線機(jī)房,或者帶寬相對(duì)便宜的城市,采購成本低。由于通過CDN減輕了源站壓力,節(jié)點(diǎn)越多,源站面對(duì)任何時(shí)間高峰時(shí)的帶寬峰值會(huì)被平均拉低。從而降低了后端服務(wù)器硬件規(guī)模和帶寬的采購成本。 由于源站服務(wù)器規(guī)模的減少,后期運(yùn)維成本也大大減少,可謂是一舉多得。

由此可見,為了能夠滿足全國(guó)乃至世界各地和多線路運(yùn)營(yíng)商的不同用戶都有最好的體驗(yàn),構(gòu)建CDN的分布式服務(wù)其重要性不言而喻。但是,在面對(duì)如何根據(jù)自身場(chǎng)景去設(shè)計(jì)一個(gè)CDN架構(gòu),或者如何選擇以一個(gè)適合自己CDN服務(wù)提供商,這里面也有許多問題需要考量。

我們要設(shè)計(jì)穩(wěn)定高效的CDN架構(gòu)需要考慮哪些因素?

存儲(chǔ)介質(zhì) vs IO的關(guān)系

這里先簡(jiǎn)單的介紹一下SSD介質(zhì)的一些考量。SSD作為采用電子存儲(chǔ)介質(zhì)進(jìn)行數(shù)據(jù)存儲(chǔ)和讀取的一種技術(shù),突破了傳統(tǒng)機(jī)械硬盤的性能瓶頸,固態(tài)硬盤的全集成電路化、無任何機(jī)械運(yùn)動(dòng)部件的革命性設(shè)計(jì),擁有極高的讀取性能。

此環(huán)節(jié),基本上不需要與傳統(tǒng)的SATA,SAS作性能上的比較,SSD的勝出毫無懸念。而在整體方案中,只需要考慮承受的價(jià)格、容量大小(如120GB,160GB,300GB等規(guī)格)、是否能夠滿足設(shè)計(jì)需求這些問題。

作者建議:如果允許, 能使用SSD,就一定要考慮采用,用空間換性能,提升非常明顯。

這里給幾個(gè)SSD實(shí)戰(zhàn)的小貼士:

1.選擇EXT4文件系統(tǒng)+TRIM模式(mount -o defaults,noatime,nodiratime,barrier=0,discard),Btrfs建議少冒險(xiǎn)

2.如果是使用三星的固態(tài)硬盤,可以嘗試它貢獻(xiàn)給開源的針對(duì)固態(tài)硬盤優(yōu)化的F2FS文件系統(tǒng),相當(dāng)不錯(cuò)的選擇

3.I/O Schedulers調(diào)度算法,可以使用CFQ或者Deadline算法

4.內(nèi)核參數(shù)調(diào)整,SSD所在硬盤,echo 0 > /sys/block/sda/queue/rotational

隨機(jī)讀寫 vs 順序讀寫

機(jī)械硬盤的連續(xù)讀寫性很好,但隨機(jī)讀寫性能很差。這是因?yàn)榇蓬^移動(dòng)至正確的磁道上需要時(shí)間,隨機(jī)讀寫時(shí),也就需要磁頭和探針頻繁的轉(zhuǎn)動(dòng),而機(jī)械結(jié)構(gòu)的磁頭和探針的位置調(diào)整是十分費(fèi)時(shí)的,這就嚴(yán)重影響到硬盤的尋址速度,進(jìn)而影響到隨機(jī)寫入速度。

在存儲(chǔ)小文件(圖片)、OLTP數(shù)據(jù)庫應(yīng)用時(shí),隨機(jī)讀寫性能(IOPS)是最重要指標(biāo)。由于固態(tài)硬盤沒有普通硬盤的機(jī)械結(jié)構(gòu),也不存在機(jī)械硬盤的尋道問題,因此系統(tǒng)能夠在低于1ms的時(shí)間內(nèi)對(duì)任意位置存儲(chǔ)單元完成輸入/輸出操作。

作者經(jīng)驗(yàn)筆記:

1.BIOS里務(wù)必開啟AHCI模式(能支持SATA熱插拔和NCQ尋址方式,提速→300%,當(dāng)然內(nèi)核也要支持AHCI模式)

2.SSD的主控芯片相當(dāng)于大腦中樞,非常重要,建議用Intel,Samsung,Marvell等知名品牌

3.SSD更適合應(yīng)用在隨機(jī)讀寫場(chǎng)景,因此需要認(rèn)真思考什么場(chǎng)合應(yīng)用

大文件 vs 小文件

大多數(shù)的存儲(chǔ)系統(tǒng)都是針對(duì)大文件而設(shè)計(jì)的,對(duì)小文件而言,大文件的存儲(chǔ)系統(tǒng)無法適應(yīng)小文件的存儲(chǔ)需求,它造成元數(shù)據(jù)管理、數(shù)據(jù)布局和I/O管理、Cache管理、網(wǎng)絡(luò)開銷等方面性能和存儲(chǔ)效率降低。

而且,文件系統(tǒng)的inode是線性存儲(chǔ)的,因此,我們遍歷一個(gè)目錄下的文件,需要讀取的磁盤的位置是來回跳躍的。不連續(xù)的讀取意味著磁盤要不斷的進(jìn)行尋道,那么性能自然可想而知。

 

作者經(jīng)驗(yàn)筆記:

1.無論大小文件,首選EXT4文件系統(tǒng),Reiserfs/Btrfs不要輕易嘗試(雖然B-tree設(shè)計(jì)先進(jìn))

2.EXT4針對(duì)小文件有所改進(jìn),使用了inode預(yù)分配,這使得inode具有很好的局部性特征,同一目錄文件inode盡量放在一起,加速了目錄尋址與操作性能。

3.EXT4針對(duì)大文件使用了extent/delay/multi的數(shù)據(jù)塊分配策略。這些策略使得大文件的數(shù)據(jù)塊保持連續(xù)存儲(chǔ)在磁盤上,數(shù)據(jù)尋址次數(shù)大大減少,顯著提高I/O吞吐量。

4.XFS在大文件方面,表現(xiàn)得不錯(cuò),可以使用。

5.SSD盡量應(yīng)用在隨機(jī)小文件讀寫的應(yīng)用場(chǎng)景,畢竟容量寶貴,在有限的空間保存更多的文件是個(gè)明智之選。

6.有開發(fā)實(shí)力的可以選用基于LevelDB或其它的KV存儲(chǔ)作底層文件系統(tǒng),此為后話。

硬件紅利 vs 軟件設(shè)計(jì)

隨著時(shí)間的推移,硬件升級(jí)已經(jīng)突破了摩爾定律,在硬件不斷升級(jí)帶來的紅利下,我們從最初的雙核到四核、六核、八核心&超線程,從2G、4G內(nèi)存到 8G、16G甚至128G內(nèi)存的情況下,同樣的價(jià)格所帶來的硬件升級(jí),性能提升也是非??捎^的,因此,設(shè)置合適的硬件淘汰時(shí)間點(diǎn)也很重要,當(dāng)老舊服務(wù)器超過3~5年的服役期,務(wù)必考慮做新陳代謝式的升級(jí),充分利用好硬件潛力,保證架構(gòu)設(shè)計(jì)平滑有序穩(wěn)定的升級(jí)。

反觀軟件設(shè)計(jì),相對(duì)硬件升級(jí),可談的話題就比較多了,舉個(gè)反例:比如說 Squid軟件的缺點(diǎn)(當(dāng)然,誕生于1996年的Squid與Apache同樣的古老,昔日的時(shí)代也是立下了汗馬功勞,但時(shí)代進(jìn)步就不能固步自封必須考慮革新):

1. 無法利用多核優(yōu)勢(shì),造成單核CPU壓力太高;

2. 雞肋的DNS進(jìn)程必須要運(yùn)行;

3. 無法利用大內(nèi)存做緩存加速;

4. COSS設(shè)計(jì)上的先天缺陷,初始化甚至重啟后重建索引慢;

5. 偶然機(jī)器重啟,修復(fù)的效率非常漫長(zhǎng),慢到讓人崩潰。

更多詳情參考:

Varnish Cache 的架構(gòu)筆記,為什么一些古老的軟件正在被新的設(shè)計(jì)思想所淘汰,如Nginx替代Apache,ATS替代Squid,Postfix替代Sendmail等等。

建議:

1. 負(fù)載均衡技術(shù)應(yīng)用得當(dāng),如haproxy,lvs。一方面可以互援互備,另一方面也可以方便輪流升級(jí);

2. 要嘗試新的軟件開發(fā)思路和網(wǎng)絡(luò)模型,如epoll,aio,內(nèi)存加速,連接復(fù)用和事件驅(qū)動(dòng)機(jī)制。

系統(tǒng)優(yōu)化

1. 系統(tǒng)服務(wù)精簡(jiǎn)瘦身;

2. 文件系統(tǒng)性能調(diào)優(yōu);

3. 提高磁盤IO性能;

4. 優(yōu)化網(wǎng)絡(luò)性能;

5. 優(yōu)化路由策略;

6. 數(shù)據(jù)庫的優(yōu)化;

……

這里就不展開詳述了,以后有機(jī)會(huì)再介紹。

我們有哪些開源的軟件可供選擇,我們了解它們嗎?

開源世界里能夠擔(dān)當(dāng)反向代理及緩存的軟件不少,而且各有優(yōu)劣。在這里,我就不一一介紹每個(gè)軟件的介紹了,大家可以自行參考相關(guān)鏈接了解。

CDN架構(gòu)上要充分體現(xiàn)出抗攻擊能力和靈活應(yīng)變的原則。因此,我們將CDN節(jié)點(diǎn)分解成反向代理+緩存加速+攻擊防御這三個(gè)不同層次的功能結(jié)構(gòu)。

•反向代理功能(作用:路由加速,隱藏主節(jié)點(diǎn),負(fù)載均衡)

•緩存加速功能(作用:靜態(tài)推送,節(jié)省后端主節(jié)點(diǎn)帶寬)

•攻擊防御功能(作用:快速解析,匹配過濾惡意攻擊)

作為一個(gè)架構(gòu)師,就必須要考慮如何選型,我們從性能、功能、配置上來進(jìn)行比較篩選。

現(xiàn)在,我們對(duì)這三層功能結(jié)構(gòu)充分了解,在測(cè)試調(diào)優(yōu)及生產(chǎn)線的實(shí)踐檢驗(yàn)中,我們發(fā)現(xiàn):

•HTTP防御性能:HAProxy在應(yīng)對(duì)大流量CC攻擊時(shí),做正則匹配及頭部過濾時(shí),CPU消耗只占10%~20%。其它軟件均狂占CPU資源約90%以上,容易成瓶頸導(dǎo)致整個(gè)系統(tǒng)無響應(yīng)。

•反向代理性能:?jiǎn)渭冝D(zhuǎn)發(fā)效率以內(nèi)存緩存型的Varnish性能最強(qiáng),ATS和Nginx次之,考慮大容量緩存因素,ATS也是個(gè)不錯(cuò)的選擇。Nginx是專門針對(duì)C10K的產(chǎn)物,性能不錯(cuò),配合自己編寫插件,業(yè)務(wù)可塑性很強(qiáng)。

•過濾規(guī)則的可配置性:HAProxy,ATS,Squid均支持規(guī)則文件讀取、ACL定制和熱加載、熱啟動(dòng)。Nginx則不支持外部文件正則匹配,略差一點(diǎn),但可塑性強(qiáng)。

負(fù)載均衡

高可用性:LVS

LVS是個(gè)重量級(jí)、高效穩(wěn)定的四層轉(zhuǎn)發(fā),雖然不能作七層HTTP協(xié)議的識(shí)別,但完全可以架設(shè)在七層之前,與上述的各種軟件搭配使用。

所以,LVS的使用并不會(huì)影響網(wǎng)絡(luò)結(jié)構(gòu),后續(xù)仍然可以想上就上,前提是要兼顧到LVS的單點(diǎn)故障,這個(gè)我們可以通過Keepalived/Heartbeat來實(shí)現(xiàn)可用性和可靠性的保證。

作者簡(jiǎn)介:

邵海楊,UPYUN(又拍云)聯(lián)合創(chuàng)始人兼運(yùn)維總監(jiān),來自杭州Linux用戶組,新浪微博@海洋之心-悟空 ,資深系統(tǒng)運(yùn)維架構(gòu)師,業(yè)余撰稿人,致力于開源軟件及前沿科技的研究和探索。

相關(guān)閱讀