Linux 缓存服务


缓存varnish、squid、nginx
linux运维web cache server部署是重要的环节
多种选择
varnish
squid
nginx

对比 web cache server
1. 功能 varnish 和 squid 是专业的cache,
   而nginx的cache功能由第三方模块完成
2. 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差不少
如何构建高性能的缓存服务器
关键的技术因素
计算
需要考虑异步高并发,多核优化,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方案
如何选择squid、Varnish、Nginx+memcache?
CDN全称Content Delivery Network,即内容分发网络
基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定
CDN 3个好处
. 优化跨ISP网络访问速度,在国内大联通和大电信之间是世界上最远的距离,在国外,中国和其他地区很平行,用cdn优化全球响应速度
. 节约流量成本,CDN机房都一般都放在带宽便宜的小城市,带宽成本大概是BGP机房的1/3
. 快速提升性能,对于结构复杂的系统,部署CDN可以在不改动代码段情况提升网站整体性能,立竿见影
著名CDN供应商
Akamai (全球最大)
webluker
cloudflare
china cache(蓝汛)
网宿CDN
帝联CDN
阿里CDN(web cache server 叫swift)
腾讯CDN
七牛云融合CDN
自己搭建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性能要好很多
当前中国,遇到突发事件后,要是不及时删除指定的链接或内容,后果可能会很严重 小到个人被炒,大到公司被关可能
5. 推荐CDN方案
中小型网站直接买CDN服务,现在CDN已经进行按需付费的云计算模式了,性价比准确计算
外地部署单点,推荐用squid;公司内部实施私有云战略,推荐 nginx+memcache; 不太建议使用varnish
cdn方面接触过squid,但是与varnish相比,其还有很多缺点,不再应用squid,
Varnish与Squid的对比
Squid高性能的代理缓存服务器
和varnish之间有诸多的异同点
相同
1. 都是一个反向代理服务器
2. 都是开源软件
不同
Varnish的优点
Varnish 稳定性高,完成相同负荷的工作时,Squid服务器发生故障的几率要高于Varnish,因为Squid要经常重启
Varnish 访问速度快,缓存数据都直接从内存读取,而squid是从硬盘读取
Varnish 支持更多的并发连接,因为Varnish的TCP连接释放要比Squid快 因而在高并发连接情况下可以支持更多TCP连接
Varnish 通过管理端口,使用正则表达式批量的清除部分缓存,而Squid是做不到的
转载
https://www.cnblogs.com/kevingrace/p/6188123.html