自建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個好處
- 優(yōu)化跨ISP網(wǎng)絡(luò)訪問速度,在國內(nèi)大聯(lián)通和大電信之間是世界上最遠(yuǎn)的距離,在國外,中國和其他地區(qū)很平行,用cdn可以優(yōu)化全球響應(yīng)速度
- 節(jié)約流量成本,CDN機(jī)房都一般都放在帶寬便宜的小城市,帶寬成本大概是BGP機(jī)房的1/3
- 快速提升性能,對于結(jié)構(gòu)復(fù)雜的系統(tǒng),部署CDN可以在不改動代碼段情況提升網(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ù)
存儲共享
對于大規(guī)模網(wǎng)站的CDN,存儲共享是個強(qiáng)需求。為了消除單點(diǎn),不可能只使用一臺CDN服務(wù)器,如果只是簡單做負(fù)載均衡,單臺CDN server 上需要存儲全部數(shù)據(jù),存儲利用率太低了
- squid支持幾個實(shí)例并聯(lián),實(shí)際使用的人不多
- varnish 只能用單實(shí)例
- nginx+memcache 天然的分布式存儲
當(dāng)然,采用squid/varnish 也有解決辦法: 需要在它們前面部署一個支持url hash的負(fù)載均衡設(shè)備(硬件,軟件均可,比如說haproxy)
內(nèi)存存儲的代價(jià)
如果CDN把緩存放在內(nèi)存當(dāng)中,固然性能會有提升,但是當(dāng)服務(wù)遭遇故障重啟之后,全部數(shù)據(jù)都會丟失需要重建,這個時(shí)候
- 會給后端應(yīng)用服務(wù)器帶來很大的短時(shí)壓力
- 服務(wù)需要較長的時(shí)間才能完全恢復(fù)
而實(shí)際運(yùn)行當(dāng)中,由于各種原因,CDN服務(wù)重啟的概率相當(dāng)高。
一個很悲劇的事實(shí)
對動態(tài)網(wǎng)頁使用CDN,無論squid還是varnish都不能直接用,都需定制代碼。
例如 varnish 會判斷response的header,如果發(fā)現(xiàn)里面有set-cookie項(xiàng),它就認(rèn)為這個頁面不應(yīng)該被緩存。對于規(guī)模龐大/OOP封裝嚴(yán)密的網(wǎng)站,普通程序員根本意識不到調(diào)用哪一個fucntion會輸出set-cookie,這個會導(dǎo)致CDN命中率急劇降低。但你也無力去對每行代碼做code review,沒有辦法,只能去修改varnish代碼了,這又引入一個新的維護(hù)成本. Squid也有這個問題
purge效率
purge就是CDN刪除緩存項(xiàng)的接口,國內(nèi)的UGC網(wǎng)站,因?yàn)閲?yán)厲的內(nèi)容檢查制度和泛濫的垃圾廣告,刪帖子刪圖片特別頻繁,某些網(wǎng)站可能高達(dá)40%(發(fā)100個貼,有40個帖子可能被刪除或者修改),所以對purge的效率有要求。
squid和varnish purge效率都達(dá)不到國內(nèi)這種強(qiáng)度要求,nginx+memcache purge性能 要好很多
在當(dāng)前的中國,遇到突發(fā)事件,你要不及時(shí)刪除指定的鏈接,你的老板就可能會去拍下面這種相片
某門戶網(wǎng)站曾經(jīng)發(fā)生過,某個鏈接怎么也刪不掉,一慌張把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
以前的工作中,我力主把一個CDN集群從squid遷移到varnish,持續(xù)運(yùn)行了2年,就是如上感受,嚴(yán)重不推薦.