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。