自建CDN技術(shù)選型:Squid Varnish Nginx
CDN的全稱是Content Delivery Network,即內(nèi)容分發(fā)網(wǎng)絡(luò)。其基本思路是盡可能避開互聯(lián)網(wǎng)上有可能影響數(shù)據(jù)傳輸速度和穩(wěn)定性的瓶頸和環(huán)節(jié),使內(nèi)容傳輸?shù)母?、更穩(wěn)定。
使用CDN有3個(gè)好處
- 優(yōu)化跨ISP網(wǎng)絡(luò)訪問速度,在國(guó)內(nèi)大聯(lián)通和大電信之間是世界上最遠(yuǎn)的距離,在國(guó)外,中國(guó)和其他地區(qū)很平行,用cdn可以優(yōu)化全球響應(yīng)速度
- 節(jié)約流量成本,CDN機(jī)房都一般都放在帶寬便宜的小城市,帶寬成本大概是BGP機(jī)房的1/3
- 快速提升性能,對(duì)于結(jié)構(gòu)復(fù)雜的系統(tǒng),部署CDN可以在不改動(dòng)代碼段情況提升網(wǎng)站整體性能,立竿見影
市面上有很多CDN供應(yīng)商,比較著名有:
- Akamai (全球***)
- chinacache
- webluker
- cloudflare
- chinacache
如果需要自己搭建CDN系統(tǒng),有3種主流方案可以選擇
- squid
- varnish
- nginx+memcache
典型用戶
- Squid http://www.squid-cache.org,大多數(shù)CDN供應(yīng)商都用squid
- varnish http://www.varnish-cache.org,用戶較少,sina微博在用
- nginx+memcache 搜狐CDN集群,淘寶的部分業(yè)務(wù)
存儲(chǔ)共享
對(duì)于大規(guī)模網(wǎng)站的CDN,存儲(chǔ)共享是個(gè)強(qiáng)需求。為了消除單點(diǎn),不可能只使用一臺(tái)CDN服務(wù)器,如果只是簡(jiǎn)單做負(fù)載均衡,單臺(tái)CDN server 上需要存儲(chǔ)全部數(shù)據(jù),存儲(chǔ)利用率太低了
- squid支持幾個(gè)實(shí)例并聯(lián),實(shí)際使用的人不多
- varnish 只能用單實(shí)例
- nginx+memcache 天然的分布式存儲(chǔ)
當(dāng)然,采用squid/varnish 也有解決辦法: 需要在它們前面部署一個(gè)支持url hash的負(fù)載均衡設(shè)備(硬件,軟件均可,比如說haproxy)
內(nèi)存存儲(chǔ)的代價(jià)
如果CDN把緩存放在內(nèi)存當(dāng)中,固然性能會(huì)有提升,但是當(dāng)服務(wù)遭遇故障重啟之后,全部數(shù)據(jù)都會(huì)丟失需要重建,這個(gè)時(shí)候
- 會(huì)給后端應(yīng)用服務(wù)器帶來很大的短時(shí)壓力
- 服務(wù)需要較長(zhǎng)的時(shí)間才能完全恢復(fù)
而實(shí)際運(yùn)行當(dāng)中,由于各種原因,CDN服務(wù)重啟的概率相當(dāng)高。
一個(gè)很悲劇的事實(shí)
對(duì)動(dòng)態(tài)網(wǎng)頁(yè)使用CDN,無論squid還是varnish都不能直接用,都需定制代碼。
例如 varnish 會(huì)判斷response的header,如果發(fā)現(xiàn)里面有set-cookie項(xiàng),它就認(rèn)為這個(gè)頁(yè)面不應(yīng)該被緩存。對(duì)于規(guī)模龐大/OOP封裝嚴(yán)密的網(wǎng)站,普通程序員根本意識(shí)不到調(diào)用哪一個(gè)fucntion會(huì)輸出set-cookie,這個(gè)會(huì)導(dǎo)致CDN命中率急劇降低。但你也無力去對(duì)每行代碼做code review,沒有辦法,只能去修改varnish代碼了,這又引入一個(gè)新的維護(hù)成本. Squid也有這個(gè)問題
purge效率
purge就是CDN刪除緩存項(xiàng)的接口,國(guó)內(nèi)的UGC網(wǎng)站,因?yàn)閲?yán)厲的內(nèi)容檢查制度和泛濫的垃圾廣告,刪帖子刪圖片特別頻繁,某些網(wǎng)站可能高達(dá)40%(發(fā)100個(gè)貼,有40個(gè)帖子可能被刪除或者修改),所以對(duì)purge的效率有要求。
squid和varnish purge效率都達(dá)不到國(guó)內(nèi)這種強(qiáng)度要求,nginx+memcache purge性能 要好很多
在當(dāng)前的中國(guó),遇到突發(fā)事件,你要不及時(shí)刪除指定的鏈接,你的老板就可能會(huì)去拍下面這種相片
某門戶網(wǎng)站曾經(jīng)發(fā)生過,某個(gè)鏈接怎么也刪不掉,一慌張把CDN所有緩存都刪了重啟,導(dǎo)致內(nèi)網(wǎng)流量瞬間暴漲,各業(yè)務(wù)線的服務(wù)器全線報(bào)警,集體罵娘。
推薦CDN方案
- 中小型網(wǎng)站直接買服務(wù)就好,現(xiàn)在CDN已經(jīng)進(jìn)按需付費(fèi)的云計(jì)算模式了,性價(jià)比是可以準(zhǔn)確計(jì)算的
- 外地部署單點(diǎn),推薦用squid
- 準(zhǔn)備在公司內(nèi)部實(shí)施私有云戰(zhàn)略,推薦nginx+memcache
不建議使用varnish
以前的工作中,我力主把一個(gè)CDN集群從squid遷移到varnish,持續(xù)運(yùn)行了2年,就是如上感受,嚴(yán)重不推薦.