linux運維中,web cache server方案的部署是一個很重要的環節,選擇也有很多種比如:varnish、squid、nginx。
下面就對當下常用的這幾個web cache server做一對比:
1)從功能上說:varnish和squid是專業的cache服務,而nginx的cache功能是由第三方子產品完成。
2)要做cache服務的話,肯定是要選擇專業的cache服務,優先選擇squid和varnish。
Varnish 可以認為是記憶體緩存,速度一流,但是記憶體緩存也限制了其容量,緩存頁面和圖檔一般是挺好的;
varnish本身的技術上優勢要高于squid,它采用了“Visual Page Cache”技術,在記憶體的利用上,Varnish比Squid具有優勢,它避免了Squid頻繁在記憶體、磁盤中交換檔案,性能要比Squid高。
varnish是不能cache到本地硬碟上的。
Varnish可以使用正規表達式快速、批量地清除部分緩存
varnish的記憶體管理完全交給核心,當緩存内容超過記憶體門檻值時,核心會自動将一部分緩存存入swap中讓出記憶體。以挪威一家報社的經驗,1台varnish可以抵6台squid的性能。
varnish用來做網站和小檔案的緩存,相當給力的,做圖檔cache之類的合适
varnish沒有專門的存儲引擎
3)squid是功能最全面的比較傳統的web cache server,有自己的存儲引擎。,但是架構太老,性能不怎樣。
squid可以用于緩存更多更大的内容,屬于專業用語緩存的功能,比如尤其适合緩存圖檔、文檔等;
squid可以說是越俎代庖自己實作了一套記憶體頁/磁盤頁的管理系統,但這個虛拟記憶體swap其實linux核心已經可以做得很好,squid的多此一舉反而影響了性能
squid支援正向代理緩存,而這方面varnish、nginx cache做不到
4)nginx本來是反向代理/web伺服器,用了插件可以做做這個副業,但是本身不支援的性能比較多。
nginx是用第三方子產品ncache做的緩沖,其性能基本達到varnish,但在架構中nginx一般作為反向(靜态檔案現在用nginx的很多,并發能支援到2萬+)。
在靜态架構中,如果前端直接面對的是CDN活着前端了4層負載的話,完全用nginx的cache就夠了。
nginx Cache是為了提供通路最頻繁資源的緩存而已,适合緩存純文字體積較小的内容,緩存少量頁面資源,主業是提供Web服務與代理的作用,若是Cache内容過多容易造成性能瓶頸與負載過大.
nginx也沒有專門的存儲引擎,nginx可以認為是已個七層LB,再加上可以嵌入各種腳本語言,實作WAF規則和七層的定制開發政策非常容器,但要是作為專門的web cache server還要差不少。
如何建構一個高性能的緩存伺服器,需要考慮的幾個關鍵的技術因素:
1)計算:需要考慮異步高并發,多核優化,cpu cache友好,需要構造一些精巧的技術結構,比如阿裡swift就用到了字尾樹;
2)網絡:zero copy發包(理論上說DPDK也可以用,sendfile;tcp核心協定棧政策定制;套接字的多路複用、port reuse等;
3)存儲:linux磁盤檔案系統是通用的存儲系統,天生對于海量小檔案的IO不夠友好;是以對于基于磁盤的緩存伺服器來說,必須自己實作一個高性能的存儲引擎,需要針對小數塊的随機IO優化(主要随機讀),另外分級存儲,cache置換等也需要考慮。緩存伺服器的存儲引擎的技術複雜度不太高,沒有關鍵字排序、ACID等要求,不說RDBMS的存儲引擎,比基于LSMtree(例如leveldb)的KV存儲引擎也要簡單些。
4)軟體上,則考慮 DNS、tcp、http等協定特性,比如DNS緩存,回源切換,http内容壓縮,失效時間等等。
針對CDN方案的實作:如何選擇squid、Varnish、Nginx+memcache??
CDN的全稱是Content Delivery Network,即内容分發網絡。
其基本思路是盡可能避開網際網路上有可能影響資料傳輸速度和穩定性的瓶頸和環節,使内容傳輸的更快、更穩定。
1.使用CDN有3個好處
1)優化跨ISP網絡通路速度,在國内大聯通和大電信之間是世界上最遠的距離,在國外,中國和其他地區很平行,用cdn可以優化全球響應速度
2)節約流量成本,CDN機房都一般都放在帶寬便宜的小城市,帶寬成本大概是BGP機房的1/3
3)快速提升性能,對于結構複雜的系統,部署CDN可以在不改動代碼段情況提升網站整體性能,立竿見影
2.市面上有很多CDN供應商,比較著名有:
Akamai (全球最大)
webluker
cloudflare
chinacache(藍汛)
網宿CDN
帝聯CDN
阿裡CDN(web cache server 叫swift)
騰訊CDN
七牛雲融合CDN
3.如果需要自己搭建CDN系統,有3種主流方案可以選擇:squid、varnish、Nginx+memcache.
1)對于大規模網站的CDN,存儲共享是個強需求。為了消除單點,不可能隻使用一台CDN伺服器,如果隻是簡單做負載均衡,單台CDN server上需要存儲全部資料,存儲使用率太低了。
squid支援幾個執行個體并聯,實際使用的人不多;
varnish 隻能用單執行個體;
nginx+memcache 天然的分布式存儲;
當然,采用squid/varnish 也有解決辦法: 需要在它們前面部署一個支援url hash的負載均衡裝置(硬體,軟體均可,比如說haproxy)
2)記憶體存儲的代價
如果CDN把緩存放在記憶體當中,固然性能會有提升,但是當服務遭遇故障重新開機之後,全部資料都會丢失需要重建,這個時候會給後端應用伺服器帶來很大的短時壓力服務需要較長的時間才能完全恢複.
而實際運作當中,由于各種原因,CDN服務重新開機的機率相當高.
3)一個很悲劇的事實
對動态網頁使用CDN,無論squid還是varnish都不能直接用,都需定制代碼。
例如varnish會判斷response的header,如果發現裡面有set-cookie項,它就認為這個頁面不應該被緩存。對于規模龐大/OOP封裝嚴密的網站,普通程式員根本意識不到調用哪一個fucntion會輸出set-cookie,這個會導緻CDN命中率急劇降低。但你也無力去對每行代碼做code review,沒有辦法,隻能去修改varnish代碼了,這又引入一個新的維護成本. Squid也有這個問題
4)purge效率
purge就是CDN删除緩存項的接口,國内的UGC網站,因為嚴厲的内容檢查制度和泛濫的垃圾廣告,删文章删圖檔特别頻繁,某些網站可能高達40%(發100個貼,有40個文章可能被删除或者修改),是以對purge的效率有要求。
squid和varnish的purge效率都達不到國内這種強度要求,nginx+memcache purge性能要好很多。
在目前的中國,遇到突發事件後,要是不及時删除指定的連結或内容,後果可能會很嚴重(小到個人被炒,大到公司被關都有可能)
某門戶網站曾經發生過,某個連結怎麼也删不掉,一慌張把CDN所有緩存都删了重新開機,導緻内網流量瞬間暴漲,各業務線的伺服器全線報警,集體罵娘!
5)推薦CDN方案
中小型網站直接買CDN服務就好,現在CDN已經進行按需付費的雲計算模式了,成本效益是可以準确計算的;
外地部署單點,推薦用squid;
準備在公司内部實施私有雲戰略,推薦nginx+memcache;
不太建議使用varnish。
***************當你發現自己的才華撐不起野心時,就請安靜下來學習吧***************
本文轉自散盡浮華部落格園部落格,原文連結:http://www.cnblogs.com/kevingrace/p/6188123.html,如需轉載請自行聯系原作者