varnish缓存初探(1)—基础知识

开章

Varnish与Squid的对比Varnish 是Squid的升级版,主要应用于HTTP反向代理和HTTP缓存来提供加速功能。Varnish的意义可以和CDN相结合。

Varnish的优势
①Varnish访问速度更快,因为采用了“Visual Page Cache”技术,所有缓存数据都直接从内存读取,而Squid是从硬盘读取,因而Varnish在访问速度方面会更快。
②Varnish可以支持更多的并发连接,因为Varnish的TCP连接释放要比Squid快,因而在高并发连接情况下可以支持更多TCP连接。
③Varnish可以通过管理端口,使用正则表达式自定义批量的清除部分缓存,而Squid是做不到的;
④Squid属于是单进程使用单核CPU,但Varnish是通过fork形式打开多进程来做处理,所以可以合理的使用所有核来处理相应的请求。

Varnish的劣势
①Varnish进程一旦Hang、Crash或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大压力。
②在varnish使用中如果单个URL的请求通过HA/F5等负载均衡,则每次请求落在不同的varnish服务器中,造成请求都会被穿透到后端;而且同样的请求在多台服务器上缓存,也会造成Varnish的缓存的资源浪费,造成性能下降。Varnish劣势的解决方案(并未测试过)
针对劣势一:在访问量很大的情况下推荐使用Varnish的内存缓存方式启动,而且后面需要跟多台squid服务器。主要为了防止前面的Varnish服 务或者服务器被重启的情况下,大量请求穿透Varnish,这样Squid可以就担当第二层CACHE,而且也弥补了Varnish缓存在内存中重启都会释 放的问题。
针对劣势二:可以在负载均衡上做URL哈希,让单个URL请求固定请求到一台Varnish服务器上。

varnish的四种缓存机制
1.malloc
调用malloc,为缓存分配内存空间,此种方式不可避免地会产生碎片文件,额外占用内存,重启后所有缓存项失效。
2.file
Varnish创建一个文件用来存储缓存数据,然后将此文件映射到内存空间中,但是该文件并不会持久保存数据,重启后所有缓存项失效。
3.persistent
持久文件存储,黑盒;重启后所有缓存项有效;但是处于实验阶段,问题较多。
4.MSE
Massive Storage Engine,在plus版可用,意味着收费。该模式设计的容量巨大可达100TB,磁盘性能要优于file模式。
总结:内存空间足够时,选择malloc模式,当内存空间不足以存储所有缓存数据时,应选择file 或 mse 存储。所以一般配置成file存储,当然付费的话使用mse更佳。

Varnish处理缓存流程
当Varnish处理一个请求时,首先要解析这个请求。从HTTP 首部中分析出请求的方法类型,判断是否为有效的请求方法等等,当基础解析完成之后,依据第一个策略进行检查进而做出判断。VCL就是根据由各个策略组成的规则来进行各种动作。Varnish流程可以分为前端和后端2部分

varnish缓存初探(1)—基础知识
前端状态可分为四个阶段:
第一阶段:
vcl_recv接受客户端请求,进行判断
第二阶段:
vcl_hash进行hash计算,不进行判读处理,计算之后送往各个第三阶段状态引擎中
第三阶段:
vcl_hit缓存命中,到此处理
vcl_pass缓存跳过
vcl_miss缓存未命中
vcl_purge清理缓存
vcl_pipe #对于无法识别的HTTP首部请求直接送入管道,交由后端处理不再处理
第四阶段:
vcl_deliver大部分响应客户端的请求由此发送回去
vcl_synth接受来自vcl_purge的任务,对于指定的缓存,进行删除处理
后端状态分为两阶段:
第一阶段:
vcl_backend_fetch接受来自前端状态vcl_pass或vcl_miss 的任务,向后端主机请求
第二阶段:
vcl_backend_response接受到后端返回正常状态报文,进行是否缓存检查,需要缓存的响应将其缓存,不需要则不缓存,最后送到vcl_deliver
vcl_backend_error后端主机错误,返回错误响应
除此之外还有两个特殊状态引擎:
vcl_init在处理任何请求之前要执行的vcl代码:主要用于初始化VMODs
vcl_fini所有的请求都已经结束,在vcl配置被丢弃时调用;主要用于清理VMODs

上一篇:C++项目参考解答:累加求圆周率


下一篇:Windows 内核Hook之IOAPIC编程