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还要差很多。linux
如何构建一个高性能的缓存服务器,须要考虑的几个关键的技术因素:
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内容压缩,失效时间等等。nginx
针对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。程序员