varnish / squid / nginx cache 有什麼不同?


squid是緩存伺服器科班出生

varnish是覺得squid性能不行,純內存緩存伺服器方案

nginx cache是屬於不務正業,得益於nginx強大的性能


SQUID 是功能最全面的,但是架構太老,性能不咋的

Varnish 是內存緩存,速度一流,但是內存緩存也限制了其容量,緩存頁面和圖片一般是挺好的

Nginx 本來是反向代理/web伺服器,用了插件可以做做這個副業,但是本身不支持特性挺多

ATS 目前是一個不錯的選擇

BTW, 這個可以看看

QA with Varnish Software on Comcast Apple CDN

下面的表格來自《Apache Traffic Server HTTP Proxy Server on the Edge》

下面的圖片來自 INFOQ 的演示,記在筆記里一下子找不到來源,有知道的筒子提醒一下


varnish、nginx,並沒有專門的存儲引擎,有人針對nginx做過一些存儲引擎,但並未開源出來;varnish可以認為是內存緩存;nginx則可以認為是個七層LB,再加上可以嵌入各種腳本語言,實現WAF規則和七層的定製開發策略非常容器,作為web cache server還要差不少。

squid的和ATS則是比較傳統的web cache server,有自己的存儲引擎。

多說幾句,如何構建一個高性能的緩存伺服器,幾個關鍵的技術因素:

  • 計算:需要考慮非同步高並發,多核優化,cpu cache友好,需要構造一些精巧的技術結構,比如阿里swift就用到了後綴樹;

  • 網路:zero copy發包(理論上說DPDK也可以用,sendfile;tcp內核協議棧策略定製;套接字的多路復用、port reuse等;

  • 存儲:linux磁碟文件系統是通用的存儲系統,天生對於海量小文件的IO不夠友好;因此對於基於磁碟的緩存伺服器來說,必須自己實現一個高性能的存儲引擎,需要針對小數塊的隨機IO優化(主要隨機讀),另外分級存儲,cache置換等也需要考慮。緩存伺服器的存儲引擎的技術複雜度不太高,沒有關鍵字排序、ACID等要求,不說RDBMS的存儲引擎,比基於LSMtree(例如leveldb)的KV存儲引擎也要簡單些。
  • 軟體上,則考慮 DNS、tcp、http等協議特性,比如DNS緩存,回源切換,http內容壓縮,失效時間等等。

CDN廠商方面,阿里的web cache server叫swift,技術應該比ATS社區領先的。ATS代碼太老了,很多容器類數據結構並沒有用到c++標準庫,自己造的輪子。


轉一個 :CDN實現方案如何選擇: squid Varnish Nginx

CDN的全稱是Content Delivery Network,即內容分發網路。其基本思路是儘可能避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定。

使用CDN有3個好處

優化跨ISP網路訪問速度,在國內大聯通和大電信之間是世界上最遠的距離,在國外,中國和其他地區很平行,用cdn可以優化全球響應速度

節約流量成本,CDN機房都一般都放在帶寬便宜的小城市,帶寬成本大概是BGP機房的1/3

快速提升性能,對於結構複雜的系統,部署CDN可以在不改動代碼段情況提升網站整體性能,立竿見影

市面上有很多CDN供應商,比較著名有

Akamai (全球最大)

chinacache

webluker

cloudflare

chinacache

如果需要自己搭建CDN系統,有3種主流方案可以選擇

squid

varnish

Nginx+memcache

軟體存儲模式性能配置複雜度purge效率共享存儲squid硬碟較高簡單低可以並聯,但是配置複雜varnish硬碟/內存高比較簡單低不能nginx內存高需要編程高可以,支持一致性存儲典型用戶存儲共享

對於大規模網站的CDN,存儲共享是個強需求。為了消除單點,不可能只使用一台CDN伺服器,如果只是簡單做負載均衡,單台CDN server 上需要存儲全部數據,存儲利用率太低了

squid支持幾個實例並聯,實際使用的人不多

varnish 只能用單實例

nginx+memcache 天然的分散式存儲

當然,採用squid/varnish 也有解決辦法: 需要在它們前面部署一個支持url hash的負載均衡設備(硬體,軟體均可,比如說haproxy)

內存存儲的代價

如果CDN把緩存放在內存當中,固然性能會有提升,但是當服務遭遇故障重啟之後,全部數據都會丟失需要重建,這個時候

會給後端應用伺服器帶來很大的短時壓力

服務需要較長的時間才能完全恢復

而實際運行當中,由於各種原因,CDN服務重啟的概率相當高

一個很悲劇的事實

對動態網頁使用CDN,無論squid還是varnish都不能直接用,都需定製代碼。

例如 varnish 會判斷response的header,如果發現裡面有set-cookie項,它就認為這個頁面不應該被緩存。對於規模龐大/OOP封裝嚴密的網站,普通程序員根本意識不到調用哪一個fucntion會輸出set-cookie,這個會導致CDN命中率急劇降低。但你也無力去對每行代碼做code review,沒有辦法,只能去修改varnish代碼了,這又引入一個新的維護成本. Squid也有這個問題

purge效率

purge就是CDN刪除緩存項的介面,國內的UGC網站,因為嚴厲的內容檢查制度和泛濫的垃圾廣告,刪帖子刪圖片特別頻繁,某些網站可能高達40%(發100個貼,有40個帖子可能被刪除或者修改),所以對purge的效率有要求。

squid和varnish purge效率都達不到國內這種強度要求,nginx+memcache purge性能 要好很多

在當前的中國,遇到突發事件,你要不及時刪除指定的鏈接,你的老闆就可能會去拍下面這種相片

某門戶網站曾經發生過,某個鏈接怎麼也刪不掉,一慌張把CDN所有緩存都刪了重啟,導致內網流量瞬間暴漲,各業務線的伺服器全線報警,集體罵娘。

推薦CDN方案

中小型網站直接買服務就好,現在CDN已經進按需付費的雲計算模式了,性價比是可以準確計算的

外地部署單點,推薦用squid

準備在公司內部實施私有雲戰略,推薦nginx+memcache

不建議使用varnish

以前的工作中,我力主把一個CDN集群從squid遷移到varnish,持續運行了2年,就是如上感受,嚴重不推薦.

轉載請註明原文地址:CDN實現方案如何選擇: squid Varnish Nginx


varnish 是純內存實現說法不準確

squid 越俎代庖自己實現了一套內存頁/磁碟頁的管理系統,但這個虛擬內存swap其實linux內核已經可以做得很好,squid的多此一舉反而影響了性能

而varnish的內存管理完全交給內核,當緩存內容超過內存閾值時,內核會自動將一部分緩存存入swap中讓出內存。以挪威一家報社的經驗,1台varnish可以抵6台squid的性能。

nginx cache如知友所說更適合緩存純文本體積較小的內容,不過如果對nginx框架理解夠深,在其上搭建一個山寨varnish不是難事。


淘寶使用tengine+squid的搭配做cdn系統,存儲系統自己在搞,用過一段traffic server後來被砍掉了,說是因為政治原因。 varnish屬於少數人的玩具。nginx的cache功能不是很強因為不是專業做cache的,但是插件比誰都多,擴展性也好。traffic server使用的公司還是比較多的。如果要選的話得看場景和能力。


squid、ATS 支持正向代理緩存,而這方面varnish、nginx cache做不到


varnish不懂,也就不google了,請LZ自己google下

quid 可以用於緩存更多更大的內容,屬於專業用語緩存的功能,比如尤其適合緩存圖片、文檔等;

nginx Cache是為了提供訪問最頻繁資源的緩存而已,適合緩存少量頁面資源,主業是提供Web 服務與代理的作用,若是Cache內容過多容易造成性能瓶頸與負載過大.


varnish用來做網站和小文件的緩存,相當給力的,做圖片cache之類的合適 [水貨DBA]


安利一下高性能web緩存伺服器 nuster

Nuster是一個基於HAProxy的高性能緩存伺服器,單進程模式下是nginx的3倍,多進程下nginx的2倍,varnish的3倍。

詳見性能報告


1台varnish可以抵6台squid的性能。


用過ATS和nginx proxy_cache。ATS比較高大上,版本升的也快,適合高性能大容量或流媒體的存儲,但是一些基本功能反而沒有提供,比如清除cache page或存儲gzip page。

Nginx屬於靈活又好用的,它的no_cache和bypass組合使用,可以實現很複雜的業務邏輯。


推薦閱讀:

微軟的 Web 伺服器為何能屹立不倒?
Linux多進程模型比多線程更容易實現熱部署嗎?
Nginx 多進程模型是如何實現高並發的?
如何解讀Nginx源碼?
被頻繁攻擊訪問,nginx如何破解?

TAG:緩存 | Nginx | squid | Varnish |