企业级缓存系统varnish简介

为了增加网站容量,可以支撑大量用户访问请求,除了扩充服务器外,我们可以利用varnish技术实行缓存策略;

缓存方案是目前主流的性能优化方式,对于网站来说,有很多特定信息系统的请求都是重复冗余的,我们的系统经常在做重复的计算和传输着相同的内容。这也就意味着在有限的计算资源条件下,可通过缓存技术,大幅提高请求处理能力以及处理速度。

所以今天就介绍一下企业级缓存系统varnish。

一:缓存系统的关键点;                                                             

1、缓存之所以生效是因为程序的运行具有局部性特征:

时间局部性:一个数据被访问过之后,可能很快再次被访问到(-----》又称热数据);

空间局部性:一个数据被访问过之后,其周边的数据也可能被访问到;

2、时效性:

缓存空间耗尽:遵循LRU算法----》最近最少使用(least recently used)的删除

缓存过期:到了缓存时间后失效

缓存命中率:hit/(hit+miss)

3、缓存的数据类型

资源缓存:page cachestatic cache 

数据缓存:data cache

缓存命中率来衡量缓存是否有效;缓存命中率=hits/(hits+misses)

是否要缓存: 1 、由缓存服务器根据规则配置决定的; 2 、浏览器可根据头部信息定义缓存

二:浏览器缓存机制;                                                                   

如下图所示:


过程:

1、客户端通过浏览器访问请求数据,第一次访问时没有缓存,由缓存区去访问原服务器去取数据,然后先保存到缓存区,再返回到浏览器给客户(200的状态码);其中etag是文件校验码,用来查看数据内容是否发生改变,设置过期时间5秒;

2、等过了2秒后,再一次访问时,缓存区先看一下是否过期,若没有过期,则直接将之前缓存下来的内容返回到浏览器(200的状态码);

3、再等4秒后,再一次访问相同数据时,检查出缓存已过期(现在是2+4=6秒),然后缓存就去服务器去取,并校对etaglast-modified值是否变,若都没有变,返回浏览器304状态码not modified),否则返回200状态码(etag表示文件内容,etag变化则表示被修改了,所以last-modified也会变,但是last-modified是更新的时间戳,有时候并不改变内容,所以last-modified变化etag不一定会变);

三:varnish简介;                                                 

1、Varnish是一款高性能的开源HTTP加速器 ,很多门户网站已经部署了varnish,并且反应都很好,甚至反应比squid还稳定,且效率更高,资源占用更少。
2、特性:

1)、稳定性强:将worker单独分开;

2)、速度快:采用“page Cache”技术,所有缓存数据直接从内存读取;

3)、支持多并发;

4)、通过管理端口,使用正则批量清除部分缓存;或者通摸个页面清;

5)、通过fork打开多进程处理

3、 主要两个进程: Management 管理进程和 Child 子进程(又叫 Cache 进程)

1).Management进程:实现应用新的配置,编译VCL、监控varnish、初始化varnish,提供命令行接口,隔几秒探测一下子进程是否正常工作,若在指定时间内没有得到子进程的回应,management将会重启此子进程;

2).Cache进程:包含多种线程,varnish依赖“工作区(workspace)”,内部多种不同工作区,最主要的是session工作区(管理会话数据的)

3).几个主要的线程:

Acceptor线程:接收新的连接请求并响应;

Worker线程:child进程会为每个会话启动一个worker线程,此worker线程真正来管理缓存,构建响应报文,因此,在高并发的场景中可能会出现数百个worker线程甚至更多;

Expiry线程:从缓存中清理过期内容;

4、 主配置文件:/etc/varnish/default.vcl 4 以后的版本需要自己手动写);

5性能配置文件:/etc/varnish/varnish.params

6、VCL:是varnish配置缓存策略工具,是一种基于“域”的简单编程语言(类似于iptables的钩子),支持算术、逻辑运算,正则,ifset自定义变量,也有内置变量和函数;

四:varnish主配置文件详解 ;                                                   

一:配置文件各段内容:

1、vcl_recv:接受用户请求进varnish的入口的引擎,接受到结果之后,利用return(lookup),将请求转交给vcl_hash引擎进行处理;
2、vcl_hash:接受到用户请求后,对用户请求的URL进行hash计算,根据请求的首部信息,以及hash结果进行下一步处理的引擎;
3、vcl_hit:经过vcl_hash引擎处理后,发现用户请求的资源本地有缓存,则vcl_hash引擎通过return(hit)将请求交给vcl_hit引擎进行处理,vcl_hit引擎处理后将请求交给vcl_deliver引擎,vcl_deliver引擎构建响应报文,响应给用户;
4、vcl_miss:经过vcl_hash引擎处理后,发现用户请求的资源本地没有缓存,则vcl_hash引擎通过return(miss)将请求交给vcl_miss引擎进行处理
5、vcl_purge:经过vcl_hash引擎处理后,发现请求是对缓存的内容进行修剪时,则通过return(purge)交给vcl_purge引擎进行处理,vcl_purge引擎处理后,利用vcl_synth引擎将处理的结果告知给用户;
6、vcl_pipe:经过vcl_hash引擎处理后,发现用户请求的报文varnish无法理解,则通过return(pipe),将请求交给vcl_pipe引擎,pipe引擎直接将请求交给后端真实服务器;
7、vcl_pass:当请求经过vcl_hash处理后,发现请求报文不让从缓存中进行响应或其他原因没办法查询缓存,则由return(pass)或return(hit-for-pass)交由vcl_pass引擎进行处理;
8、vcl_backend_fetch:当发现缓存未命中或由vcl_pass传递过来的某些不能查询缓存的请求,交由vcl_backend_fetch引擎处理,vcl_backend_fetch引擎会向后端真实web服务器发送请求报文,请求对应的资源;
9、vcl_backend_response:当后端发送响应报文到varnish后,会由vcl_backend_resonse引擎进行处理,如:判断响应的内容是否可缓存,如果能缓存,则缓存下来后,交给vcl_deliver引擎,如果不能缓存,则直接交给vcl_deliver引擎,vcl_deliver引擎构建响应报文给客户端 ;

二:varnish4.0版本的两个特殊的引擎:

vcl_init:在处理任何请求之前要执行的vcl的代码,主要用于初始化VMOD,可
用在后端主机有多台时,借助此引擎完成多台主机的负载均衡效果
vcl_fini:所有的请求都已经结束,在vcl配置被丢弃时调用;主要用于清理VMOD

三:关于vcl的语法格式:

<1>配置文件第一个非注释行必须是vcl 4.0,标明此vcl配置文件是基于vcl4.0版本;
<2>//、#或/ comment /用于单行或多行注释;
<3>sub $NAME 定义函数,子例程;
<4>不支持循环,支持条件判断,有内置变量;
<5>使用终止语句return(XXX),没有返回值,仅仅是标明下一步交给哪个状态引擎,没有走默认;
<6>域专用,语句用{ }括起来,用sub声明,指明为哪一段的专用代码,如:sub vcl_recv{…},可理解为一个配置段;
<7> 每个语句必须以;分号结尾;
<8> 每个变量有其能使用的引擎的位置,可理解为变量由其可用的配置段;
<9>操作符:=(赋值)、==(等值比较)、~(模式匹配)、!(取反)、&&(逻辑与)、||(逻辑或)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)
 ;

四:vcl常见内置函数

1、ban(expression):清除能被表达式匹配的所有缓存对象

2、ban_url(regex):清除所有其URL能够由regex匹配的缓存对象;
3、hash_data(str):对指定的字符串做hash计算后的结果

4、return():当某VCL域运行结束时将控制权返回给Varnish,并指示Varnish如何进行后续的动作;其可以返回的指令包括:lookup、hash、hit、miss、pass、pipe、hit_for_pass、purge等;但某特定域可能仅能返回某些特定的指令,而非前面列出的全部指令;

五:vcl内建变量

1、req.*:req.开头的变量,由客户端发来的http请求相关的变量:req.method 表示客户端的请求方法

2、bereq.* :bereq.开头的变量,varnish主机在向后端真实服务器发送http请求报文时的相关变量
3、beresp.*:beresp.开头的变量,由后端真实服务器发来的http响应报文中的某些首部信息相关的变量,一般是在vcl_backend_response或vcl_backend_fenth引擎中调用
4、resp.*:resp.开头的变量,由varnish响应给客户端的响应报文相关的变量

5、obj.* :obj.开头的变量,对存储在缓存空间中的缓存对象属性的引用变量。obj开头的变量都是只读的obj.hits: 某个缓存对象的缓存的命中次数
6、client.,server.,storage.*:可用在所有面向客户端一侧的引擎中,也就是vcl_recv、vcl_pipe、vcl_hash
、vcl_pass、vcl_purge、vcl_miss、vcl_hit、vcl_deliver、vcl_synth中
用户还可自定义:
set;unset ;

五:varnish性能配置文件详解;                                                     

1、RELOAD_VCL=1:设置为1表示当使用systemctl reload varnish时,会自动重新装载vcl的配置文件,也就是能够让新的配置生效

2、VARNISH_VCL_CONF=/etc/varnish/default.vcl:加载的缓存策略的配置文件路径
3、#VARNISH_LISTEN_ADDRESS=:varnish服务监听的地址,默认是监听在本机所有可用的地址上
4、VARNISH_LISTEN_PORT=6081:varnish监听的端口,因为varnish要作为web服务器的反向代理进行工作时,才能将http的内容缓存,一般要将其改为80端口,但是实际生产环境中,varnish一般是处于前端调度器的后面,所以可以在前端调度器上将调度的端口改为此处的端口也可以
5、VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1:varnish管理接口监听的地址,监听在127.0.0.1表示只允许从本机登录进行管理
6、VARNISH_ADMIN_LISTEN_PORT=6082:varnish管理接口监听的端口
7、VARNISH_SECRET_FILE=/etc/varnish/secret:varnish管理时的秘钥文件
8、VARNISH_STORAGE="file,/var/lib/varnish/varnish_storage.bin,1G":varnish缓存时,使用哪种存储方式对缓存内容进行存储,本处是指使用file文件方式,存在/var/lib/varnish/varnish_storage.bin文件中,总共使用1G大小的空间如果要使用内存缓存,则可以定义为:"malloc,400M"在很多生产环境还是使用file,但是将文件放在固态硬盘,如果希望性能更好点,放在PCI-E的固态硬盘fution-IO
9、VARNISH_TTL=120:如果后端服务器没有指明缓存内容的TTL时间,则varnish自身为缓存定义的TTL时间

10、VARNISH_USER=varnish :varnish运行用户
11、VARNISH_GROUP=varnish
 :varnish运行组

Varnish_storage存储方式(三种):

1malloc:直接使用内存做缓存; ----egVARNISH_STORAGE=mallo400M

2file:通过内存映射文件方式存储--egVARNISH_STORAGE=file/app/varnish_storage.bin,1G,生产中建议使用固态硬盘SSD

file的原理:mmap:在硬盘上有一个空间,与内存做个磁盘映射;

3persistent:通过文件持久存储,可永久保存缓存;前两种重启后消失

六:补充:对一个大型架构优化思路;                                             

三大黄金规则:
1、把所有的请求尽可能在架构前层阶段交付,尽可能减少后端交互 (push ahead)
2、对于重复类的业务,尽最大程度的去做缓存策略(cache is king )
3、服务能用内存响应的,坚决不用硬盘 (memory is king)





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值