丁丁爸爸的技术 2020-03-04
Varnish是一款高性能且开源的反向代理服务器和web加速器,与传统的squid相比,varnish具有性能更高,速度更快,管理更加方便等诸多优点,很多大型的网站都开始尝试使用varnish来替换squid,以在相同的服务器成本下提供更好的缓存效果,varnish更是作为CDN缓存服务器的可选服务之一。
挪威的最大的在线报纸Verdens Gang(vg.no) 使用3台Varnish代替了原来的12台squid,性能比以前更好,这是varnish最成功的应用案例。
1)是基于内存缓存,重启后数据将消失。 2)利用虚拟内存,io性能好。 3)支持设置0~60秒内的精确缓存时间。 4)VCL配置管理比较灵活。 5)32位机器上缓存文件大小为最大2G。 6)具有强大的管理功能,如果top,stat,admin,list等。 7)状态机设计巧妙,结构清晰。 8)利用二叉堆管理缓存文件,达到积极删除目的
说到Varnish,不能不提Squid,Squid是一个高性能的代理缓存服务器,它和varnish之间有诸多的异同点,这里分析如下:
下面是他们之间的相同点:
(1)都是一个反向代理服务器;
(2)都是开源软件;
下面是它们的不同点,也是varnish的优点:
(1)Varnish的稳定性高,两者在完成相同负荷的工作时,squid服务器发送故障的几率要高于varnish,因为使用squid要经常重启。
(2)varnish访问速度更快,Varnish采用了“Visual page Cache”技术,所有缓存数据都直接从内存读取,而squid是从硬盘读取,因而varnish在访问速度方面会更快。
(3)varnish可以支持更多的并发连接,因为varnish的TCP链接释放要比squid快。因而在高并发连接情况下可以支持更多TCP连接。
(4)varnish可以通过管理端口,使用正则表达式批量的清除部分缓存,而squid是做不到的。
当然,与传统的squid相比,varnish也是有缺点的,列举如下:
(1)varnish在高并发状态下CPU,IO,内存等资源开销都高于squid。
(2)varnish进程一旦Crash或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大压力。
varnish是一个http反向代理的缓存,当varnish接收到客户端的请求时,从缓存中查看是否有数据,如果没有,则varnish去后端(backend servers)获取响应的资源,同时缓存到varnish服务器中,然后返回给客户端;根据规则和请求页面类型选择数据是否缓存,可以根据请求头中Cache-Control判断是否缓存(如private私有缓存),以及cookie是否有标记(如果被标记有cookie的客户端web请求,varnish默认是不缓存),这些都是通过varnish的vcl配置文件定义的内容实现的。
Varnish分为master(management)主进程和child子进程;
master主进程:管理和应用新的配置,编译vcl,监控varnish状态,master会每隔几秒钟去探测child进程是否正常运行,如果发现运行异常则重启child进程。
child子进程:生成线程池,负责对用户请求进行处理,并通过hash查找返回用户结果。常见的线程有:
Accept线程(接受新连接请求并响应)
worker线程(会话,处理请求的资源)
Expiry线程(清理缓存中过期的内容)
varnish配置主要分为:后端配置,ACL配置,probes配置,directors配置,核心子程序配置几大块。
后端配置:即给varnish添加反代理服务器节点,最少配置一个。
ACL配置:即给varnish添加访问控制列表,可以指定这些列表访问或禁止访问。
probes配置:即给varnish添加探测后端服务器是否正常的规则,方便切换或禁止对应后端服务器。
directors配置:即给varnish添加负载均衡模式管理多个后端服务器。
核心子程序配置:即给varnish添加后端服务器切换,请求缓存,访问控制,错误处理等规则。