linux运维中,web cache server方案的部署是一个很重要的环节,选择也有很多种比如:varnish、squid、nginx。
常用web cache server(varnish、squid、nginx)对比:
varnish和squid是专业的cache服务,而nginx的cache功能是由第三方模块完成。要做cache服务的话,肯定是要选择专业的cache服务,优先选择squid和varnish。
1)Varnish 可以认为是内存缓存,速度一流,但是内存缓存也限制了其容量;varnish没有专门的存储引擎。varnish本身的技术上优势要高于squid,它采用了“Visual Page Cache”技术,在内存的利用上,Varnish比Squid具有优势,它避免了Squid频繁在内存、磁盘中交换文件,性能要比Squid高。varnish是不能cache到本地硬盘上的。Varnish可以使用正则表达式快速、批量地清除部分缓存。varnish的内存管理完全交给内核,当缓存内容超过内存阈值时,内核会自动将一部分缓存存入swap中让出内存。以挪威一家报社的经验,1台varnish可以抵6台squid的性能。varnish用来做网站和小文件的缓存,相当给力的,做图片cache之类的合适。
2)squid是功能最全面的比较传统的web cache server,有自己的存储引擎,但是架构太老,性能不怎样。squid可以用于缓存更多更大的内容,属于专业用于缓存的server,比如尤其适合缓存图片、文档等;squid可以说是越俎代庖自己实现了一套内存页/磁盘页的管理系统,但这个虚拟内存swap其实linux内核已经可以做得很好,squid的多此一举反而影响了性能。squid支持正向代理缓存,而这方面varnish、nginx cache做不到。
3)nginx本来是反向代理/web服务器,用第三方模块memcache做的缓冲,其性能基本达到varnish,现在静态文件用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的好处
1)优化跨ISP网络访问速度,在国内大联通和大电信之间是世界上最远的距离,在国外,中国和其他地区很平行,用cdn可以优化全球响应速度
2)节约流量成本,CDN机房都一般都放在带宽便宜的小城市,带宽成本大概是BGP机房的1/3
3)快速提升性能,对于结构复杂的系统,部署CDN可以在不改动代码段情况提升网站整体性能,立竿见影
搭建CDN系统,有三种主流方案可以选择: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。
网友评论