文|邵海楊,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)稱(chēng)“八線合一”的機(jī)房開(kāi)始嶄露頭角?;ヂ?lián)網(wǎng)的廣泛性使得網(wǎng)民分散在全國(guó)各地,由于全國(guó)地區(qū)的經(jīng)濟(jì)發(fā)展和互聯(lián)網(wǎng)建設(shè)的不平衡,實(shí)際網(wǎng)民的體驗(yàn)往往受限于最后一公里的速度。在技術(shù)大噴井的年代,一些無(wú)聊或者有目的黑客攻擊也開(kāi)始涌現(xiàn),無(wú)論是滲透還是DDoS攻擊都非常頻繁,時(shí)刻威脅著網(wǎng)站的安全……
上述種種問(wèn)題,作為應(yīng)用服務(wù)提供商,我們要如何解決此類(lèi)問(wèn)題呢?歸根結(jié)底就是要充分利用好CDN(Content Delivery Network,即內(nèi)容分發(fā)網(wǎng)絡(luò))。
CDN的作用可以幫助我們解決哪些問(wèn)題?
緩存代理
緩存代理類(lèi)似內(nèi)容提供商源數(shù)據(jù)中心的一個(gè)透明鏡像,這些內(nèi)容可以在邊緣服務(wù)器中緩存和分發(fā),對(duì)于普通的網(wǎng)絡(luò)用戶(hù)來(lái)講,它通過(guò)智能DNS的篩選,用戶(hù)的請(qǐng)求被透明地指向離他最近的省內(nèi)骨干節(jié)點(diǎn),最大限度的縮短用戶(hù)信息的傳輸距離。在任何時(shí)間、地點(diǎn)或者不同的運(yùn)營(yíng)商之間(尤其在中國(guó)),快速響應(yīng)用戶(hù)請(qǐng)求。
它是通過(guò)在網(wǎng)絡(luò)各處放置節(jié)點(diǎn)服務(wù)器,所以無(wú)需更改源站的網(wǎng)絡(luò)拓?fù)?,而是根?jù)智能路由和用戶(hù)就近原則匹配,從而確保了內(nèi)容快又穩(wěn)定的傳輸,大大提高了用戶(hù)訪問(wèn)網(wǎng)站的響應(yīng)速度。
路由加速
CDN服務(wù)初衷是確??焖倏煽康胤职l(fā)靜態(tài)內(nèi)容,相對(duì)于動(dòng)態(tài)內(nèi)容來(lái)說(shuō),由于動(dòng)態(tài)內(nèi)容必須長(zhǎng)連接來(lái)操持連接和通訊,只是用戶(hù)到服務(wù)商之間的鏈路和質(zhì)量都無(wú)法控制。因此為了提供快速的網(wǎng)絡(luò)體驗(yàn),有必要事先設(shè)置一些最佳路由。如省內(nèi)骨干網(wǎng),雙線機(jī)房,以改善用戶(hù)的網(wǎng)絡(luò)體驗(yàn)。在中國(guó)典型的互聯(lián)互通問(wèn)題上,網(wǎng)絡(luò)游戲加速就是一些最佳實(shí)踐。
安全防護(hù)
利用好了CDN網(wǎng)絡(luò),無(wú)論面對(duì)是滲透還是DDoS攻擊,攻擊的目標(biāo)大都會(huì)被指向到了CDN,進(jìn)而保護(hù)了用戶(hù)源站。因?yàn)镃DN是分布式的,所以即使遭受DDoS攻擊,也具備分散性,大大減少了源站收到毀滅打擊的可能性。在架構(gòu)的前期,還可以通過(guò)CDN做一些前置的安全保護(hù)工作,如攔截SQL注入、XSS跨站、網(wǎng)站掛馬、篡改等黑客攻擊。
節(jié)省成本
CDN節(jié)點(diǎn)機(jī)房只需要在當(dāng)?shù)剡\(yùn)營(yíng)商的單線機(jī)房,或者帶寬相對(duì)便宜的城市,采購(gòu)成本低。由于通過(guò)CDN減輕了源站壓力,節(jié)點(diǎn)越多,源站面對(duì)任何時(shí)間高峰時(shí)的帶寬峰值會(huì)被平均拉低。從而降低了后端服務(wù)器硬件規(guī)模和帶寬的采購(gòu)成本。 由于源站服務(wù)器規(guī)模的減少,后期運(yùn)維成本也大大減少,可謂是一舉多得。
由此可見(jiàn),為了能夠滿足全國(guó)乃至世界各地和多線路運(yùn)營(yíng)商的不同用戶(hù)都有最好的體驗(yàn),構(gòu)建CDN的分布式服務(wù)其重要性不言而喻。但是,在面對(duì)如何根據(jù)自身場(chǎng)景去設(shè)計(jì)一個(gè)CDN架構(gòu),或者如何選擇以一個(gè)適合自己CDN服務(wù)提供商,這里面也有許多問(wèn)題需要考量。
我們要設(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ī)械硬盤(pán)的性能瓶頸,固態(tài)硬盤(pán)的全集成電路化、無(wú)任何機(jī)械運(yùn)動(dòng)部件的革命性設(shè)計(jì),擁有極高的讀取性能。
此環(huán)節(jié),基本上不需要與傳統(tǒng)的SATA,SAS作性能上的比較,SSD的勝出毫無(wú)懸念。而在整體方案中,只需要考慮承受的價(jià)格、容量大小(如120GB,160GB,300GB等規(guī)格)、是否能夠滿足設(shè)計(jì)需求這些問(wèn)題。
作者建議:如果允許, 能使用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)硬盤(pán),可以嘗試它貢獻(xiàn)給開(kāi)源的針對(duì)固態(tài)硬盤(pán)優(yōu)化的F2FS文件系統(tǒng),相當(dāng)不錯(cuò)的選擇
3.I/O Schedulers調(diào)度算法,可以使用CFQ或者Deadline算法
4.內(nèi)核參數(shù)調(diào)整,SSD所在硬盤(pán),echo 0 > /sys/block/sda/queue/rotational
隨機(jī)讀寫(xiě) vs 順序讀寫(xiě)
機(jī)械硬盤(pán)的連續(xù)讀寫(xiě)性很好,但隨機(jī)讀寫(xiě)性能很差。這是因?yàn)榇蓬^移動(dòng)至正確的磁道上需要時(shí)間,隨機(jī)讀寫(xiě)時(shí),也就需要磁頭和探針頻繁的轉(zhuǎn)動(dòng),而機(jī)械結(jié)構(gòu)的磁頭和探針的位置調(diào)整是十分費(fèi)時(shí)的,這就嚴(yán)重影響到硬盤(pán)的尋址速度,進(jìn)而影響到隨機(jī)寫(xiě)入速度。
在存儲(chǔ)小文件(圖片)、OLTP數(shù)據(jù)庫(kù)應(yīng)用時(shí),隨機(jī)讀寫(xiě)性能(IOPS)是最重要指標(biāo)。由于固態(tài)硬盤(pán)沒(méi)有普通硬盤(pán)的機(jī)械結(jié)構(gòu),也不存在機(jī)械硬盤(pán)的尋道問(wèn)題,因此系統(tǒng)能夠在低于1ms的時(shí)間內(nèi)對(duì)任意位置存儲(chǔ)單元完成輸入/輸出操作。
作者經(jīng)驗(yàn)筆記:
1.BIOS里務(wù)必開(kāi)啟AHCI模式(能支持SATA熱插拔和NCQ尋址方式,提速→300%,當(dāng)然內(nèi)核也要支持AHCI模式)
2.SSD的主控芯片相當(dāng)于大腦中樞,非常重要,建議用Intel,Samsung,Marvell等知名品牌
3.SSD更適合應(yīng)用在隨機(jī)讀寫(xiě)場(chǎng)景,因此需要認(rèn)真思考什么場(chǎng)合應(yīng)用
大文件 vs 小文件
大多數(shù)的存儲(chǔ)系統(tǒng)都是針對(duì)大文件而設(shè)計(jì)的,對(duì)小文件而言,大文件的存儲(chǔ)系統(tǒng)無(wú)法適應(yīng)小文件的存儲(chǔ)需求,它造成元數(shù)據(jù)管理、數(shù)據(jù)布局和I/O管理、Cache管理、網(wǎng)絡(luò)開(kāi)銷(xiāo)等方面性能和存儲(chǔ)效率降低。
而且,文件系統(tǒng)的inode是線性存儲(chǔ)的,因此,我們遍歷一個(gè)目錄下的文件,需要讀取的磁盤(pán)的位置是來(lái)回跳躍的。不連續(xù)的讀取意味著磁盤(pán)要不斷的進(jìn)行尋道,那么性能自然可想而知。
作者經(jīng)驗(yàn)筆記:
1.無(wú)論大小文件,首選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ǔ)在磁盤(pán)上,數(shù)據(jù)尋址次數(shù)大大減少,顯著提高I/O吞吐量。
4.XFS在大文件方面,表現(xiàn)得不錯(cuò),可以使用。
5.SSD盡量應(yīng)用在隨機(jī)小文件讀寫(xiě)的應(yīng)用場(chǎng)景,畢竟容量寶貴,在有限的空間保存更多的文件是個(gè)明智之選。
6.有開(kāi)發(fā)實(shí)力的可以選用基于LevelDB或其它的KV存儲(chǔ)作底層文件系統(tǒng),此為后話。
硬件紅利 vs 軟件設(shè)計(jì)
隨著時(shí)間的推移,硬件升級(jí)已經(jīng)突破了摩爾定律,在硬件不斷升級(jí)帶來(lái)的紅利下,我們從最初的雙核到四核、六核、八核心&超線程,從2G、4G內(nèi)存到 8G、16G甚至128G內(nèi)存的情況下,同樣的價(jià)格所帶來(lái)的硬件升級(jí),性能提升也是非??捎^的,因此,設(shè)置合適的硬件淘汰時(shí)間點(diǎn)也很重要,當(dāng)老舊服務(wù)器超過(guò)3~5年的服役期,務(wù)必考慮做新陳代謝式的升級(jí),充分利用好硬件潛力,保證架構(gòu)設(shè)計(jì)平滑有序穩(wěn)定的升級(jí)。
反觀軟件設(shè)計(jì),相對(duì)硬件升級(jí),可談的話題就比較多了,舉個(gè)反例:比如說(shuō) Squid軟件的缺點(diǎn)(當(dāng)然,誕生于1996年的Squid與Apache同樣的古老,昔日的時(shí)代也是立下了汗馬功勞,但時(shí)代進(jìn)步就不能固步自封必須考慮革新):
1. 無(wú)法利用多核優(yōu)勢(shì),造成單核CPU壓力太高;
2. 雞肋的DNS進(jìn)程必須要運(yùn)行;
3. 無(wú)法利用大內(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. 要嘗試新的軟件開(kāi)發(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. 提高磁盤(pán)IO性能;
4. 優(yōu)化網(wǎng)絡(luò)性能;
5. 優(yōu)化路由策略;
6. 數(shù)據(jù)庫(kù)的優(yōu)化;
……
這里就不展開(kāi)詳述了,以后有機(jī)會(huì)再介紹。
我們有哪些開(kāi)源的軟件可供選擇,我們了解它們嗎?
開(kāi)源世界里能夠擔(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)帶寬)
•攻擊防御功能(作用:快速解析,匹配過(guò)濾惡意攻擊)
作為一個(gè)架構(gòu)師,就必須要考慮如何選型,我們從性能、功能、配置上來(lái)進(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í),做正則匹配及頭部過(guò)濾時(shí),CPU消耗只占10%~20%。其它軟件均狂占CPU資源約90%以上,容易成瓶頸導(dǎo)致整個(gè)系統(tǒng)無(wú)響應(yīng)。
•反向代理性能:?jiǎn)渭冝D(zhuǎn)發(fā)效率以?xún)?nèi)存緩存型的Varnish性能最強(qiáng),ATS和Nginx次之,考慮大容量緩存因素,ATS也是個(gè)不錯(cuò)的選擇。Nginx是專(zhuān)門(mén)針對(duì)C10K的產(chǎn)物,性能不錯(cuò),配合自己編寫(xiě)插件,業(yè)務(wù)可塑性很強(qiáng)。
•過(guò)濾規(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è)我們可以通過(guò)Keepalived/Heartbeat來(lái)實(shí)現(xiàn)可用性和可靠性的保證。
作者簡(jiǎn)介:
邵海楊,UPYUN(又拍云)聯(lián)合創(chuàng)始人兼運(yùn)維總監(jiān),來(lái)自杭州Linux用戶(hù)組,新浪微博@海洋之心-悟空 ,資深系統(tǒng)運(yùn)維架構(gòu)師,業(yè)余撰稿人,致力于開(kāi)源軟件及前沿科技的研究和探索。
相關(guān)閱讀