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。