高性能的开源http加速器Varnish

Varnish简介

Varnish是一款高性能的开源HTTP加速器。varnish项目是2006年发布的第一个版本0.9.距今已经八年多了,此文档之前也提过varnish还不稳定,那是2007年时候编写的,经过 varnish开发团队和网友们的辛苦耕耘,现在的varnish已经很健壮。很多门户网站已经部署了varnish,并且反应都很好,甚至反应比 squid还稳定,且效率更高,资源占用更少。相信在反向代理,web加速方面,varnish已经有足够能力代替squid。

Varnish的系统架构

varnish主要运行两个进程:Management进程和Child进程(也叫Cache进程)。

其中Management进程主要实现应用新的配置、编译VCL、监控varnish、初始化varnish以及提供一个命令行接口。Management进程会每隔几秒钟探测一下Child进程以判断其是否正常运行,如果在指定的时长内未得到Child进程的回应,Management将会重启此Child进程。

Child进程包含多种类型的线程,常见的如:
Acceptor线程:接收新的连接请求并响应;
Worker线程:child进程会为每个会话启动一个worker线程,因此,在高并发的场景中可能会出现数百个worker线程甚至更多;
Expiry线程:从缓存中清理过期内容;

Varnish的日志

为了与系统的其它部分进行交互,Child进程使用了可以通过文件系统接口进行访问的共享内存日志(shared memory log),因此,如果某线程需要记录信息,其仅需要持有一个锁,而后向共享内存中的某内存区域写入数据,再释放持有的锁即可。而为了减少竞争,每个worker线程都使用了日志数据缓存。

共享内存日志大小一般为90M,其分为两部分,前一部分为计数器,后半部分为客户端请求的数据。varnish提供了多个不同的工具如varnishlog、varnishncsa或varnishstat等来分析共享内存日志中的信息并能够以指定的方式进行显示。

VCL

Varnish Configuration Language (VCL)是varnish配置缓存策略的工具,它是一种基于“域”(domain specific)的简单编程语言,它支持有限的算术运算和逻辑运算操作、允许使用正则表达式进行字符串匹配、允许用户使用set自定义变量、支持if判断语句,也有内置的函数和变量等。使用VCL编写的缓存策略通常保存至.vcl文件中,其需要编译成二进制的格式后才能由varnish调用。事实上,整个缓存策略就是由几个特定的子例程如vcl_recv、vcl_fetch等组成,它们分别在不同的位置(或时间)执行,如果没有事先为某个位置自定义子例程,varnish将会执行默认的定义。

VCL策略在启用前,会由management进程将其转换为C代码,而后再由gcc编译器将C代码编译成二进制程序。编译完成后,management负责将其连接至varnish实例,即child进程。正是由于编译工作在child进程之外完成,它避免了装载错误格式VCL的风险。因此,varnish修改配置的开销非常小,其可以同时保有几份尚在引用的旧版本配置,也能够让新的配置即刻生效。编译后的旧版本配置通常在varnish重启时才会被丢弃,如果需要手动清理,则可以使用varnishadm的vcl.discard命令完成。

varnish的后端存储

varnish支持多种不同类型的后端存储,这可以在varnishd启动时使用-s选项指定。后端存储的类型包括:
(1)file:使用特定的文件存储全部的缓存数据,并通过操作系统的mmap()系统调用将整个缓存文件映射至内存区域(如果条件允许);
(2)malloc:使用malloc()库调用在varnish启动时向操作系统申请指定大小的内存空间以存储缓存对象;
(3)persistent(experimental):与file的功能相同,但可以持久存储数据(即重启varnish数据时不会被清除);仍处于测试期;

varnish无法追踪某缓存对象是否存入了缓存文件,从而也就无从得知磁盘上的缓存文件是否可用,因此,file存储方法在varnish停止或重启时会清除数据。而persistent方法的出现对此有了一个弥补,但persistent仍处于测试阶段,例如目前尚无法有效处理要缓存对象总体大小超出缓存空间的情况,所以,其仅适用于有着巨大缓存空间的场景。

选择使用合适的存储方式有助于提升系统性,从经验的角度来看,建议在内存空间足以存储所有的缓存对象时使用malloc的方法,反之,file存储将有着更好的性能的表现。然而,需要注意的是,varnishd实际上使用的空间比使用-s选项指定的缓存空间更大,一般说来,其需要为每个缓存对象多使用差不多1K左右的存储空间,这意味着,对于100万个缓存对象的场景来说,其使用的缓存空间将超出指定大小1G左右。另外,为了保存数据结构等,varnish自身也会占去不小的内存空间。

为varnishd指定使用的缓存类型时,-s选项可接受的参数格式如下:
 malloc[,size] 或
 file[,path[,size[,granularity]]] 或
 persistent,path,size {experimental}
 
file中的granularity用于设定缓存空间分配单位,默认单位是字节,所有其它的大小都会被圆整。

Varnish状态引擎(state engine)

VCL用于让管理员定义缓存策略,而定义好的策略将由varnish的management进程分析、转换成C代码、编译成二进制程序并连接至child进程。varnish内部有几个所谓的状态(state),在这些状态上可以附加通过VCL定义的策略以完成相应的缓存处理机制,因此VCL也经常被称作“域专用”语言或状态引擎,“域专用”指的是有些数据仅出现于特定的状态中。

1、VCL状态引擎

在VCL状态引擎中,状态之间具有相关性,但彼此间互相隔离,每个引擎使用return(x)来退出当前状态并指示varnish进入下一个状态。

varnish开始处理一个请求时,首先需要分析HTTP请求本身,比如从首部获取请求方法、验正其是否为一个合法的HTTP请求等。当这些基本分析结束后就需要做出第一个决策,即varnish是否从缓存中查找请求的资源。这个决定的实现则需要由VCL来完成,简单来说,要由vcl_recv方法来完成。如果管理员没有自定义vcl_recv函数,varnish将会执行默认的vcl_recv函数。然而,即便管理员自定义了vcl_recv,但如果没有为自定义的vcl_recv函数指定其终止操作(terminating),其仍将执行默认的vcl_recv函数。事实上,varnish官方强烈建议让varnish执行默认的vcl_recv以便处理自定义vcl_recv函数中的可能出现的漏洞。

2、VCL语法

VCL的设计参考了C和Perl语言,因此,对有着C或Perl编程经验者来说,其非常易于理解。其基本语法说明如下:
(1)//、#或/* comment */用于注释
(2)sub $name 定义函数
(3)不支持循环,有内置变量
(4)使用终止语句,没有返回值
(5)域专用
(6)操作符:=(赋值)、==(等值比较)、~(模式匹配)、!(取反)、&&(逻辑与)、||(逻辑或)
 
VCL的函数不接受参数并且没有返回值,因此,其并非真正意义上的函数,这也限定了VCL内部的数据传递只能隐藏在HTTP首部内部进行。VCL的return语句用于将控制权从VCL状态引擎返回给Varnish,而非默认函数,这就是为什么VCL只有终止语句而没有返回值的原因。同时,对于每个“域”来说,可以定义一个或多个终止语句,以告诉Varnish下一步采取何种操作,如查询缓存或不查询缓存等。

3、VCL的内置函数

VCL提供了几个函数来实现字符串的修改,添加bans,重启VCL状态引擎以及将控制权转回Varnish等。

regsub(str,regex,sub)
regsuball(str,regex,sub):这两个用于基于正则表达式搜索指定的字符串并将其替换为指定的字符串;但regsuball()可以将str中能够被regex匹配到的字符串统统替换为sub,regsub()只替换一次;
ban(expression):
ban_url(regex):Bans所有其URL能够由regex匹配的缓存对象;
purge:从缓存中挑选出某对象以及其相关变种一并删除,这可以通过HTTP协议的PURGE方法完成;
hash_data(str):
return():当某VCL域运行结束时将控制权返回给Varnish,并指示Varnish如何进行后续的动作;其可以返回的指令包括:lookup、pass、pipe、hit_for_pass、fetch、deliver和hash等;但某特定域可能仅能返回某些特定的指令,而非前面列出的全部指令;
return(restart):重新运行整个VCL,即重新从vcl_recv开始进行处理;每一次重启都会增加req.restarts变量中的值,而max_restarts参数则用于限定最大重启次数。

时间: 2024-08-07 04:32:16

高性能的开源http加速器Varnish的相关文章

Varnish是一款高性能的开源HTTP加速器

如何衡量缓存系统的优劣性 1:缓存命中率: 在memcached服务器中,get_hits的值表示缓存命中的次数,get_misses的值表示没有命中的次数,那么命中率的计算公式就是:命中率=get_hits/(get_hits+get_misses) 终端用户访问加速节点时,如果该节点有缓存住了要被访问的数据时就叫做命中,如果没有的话需要到原服务器取,就是没有命中.取数据的过程与用户访问是同步进行的,所以即使是重新取的新数据,用户也不会感觉到有延时. 命中率=命中数/(命中数+没有命中数),

高性能缓存加速器varnish(概念篇)

高性能缓存加速器varnish(概念篇) 一.varnish简介 varnish是一款高性能的开源HTTP加速器,现在很多门户网站已经部署了varnish,并且反应都很好,甚至反应比squid还稳定,且效率更高,资源暂用更少. 作者Poul-Henning Kamp是FreeBSD的内核开发者之一.Varnish采用全新的软件体系架构,和现在的硬件提交配合紧密.在1975年时,储存媒介只有两种:内存与硬盘.但现在计算 机系统的内存除了主存外,还包括了cpu内的L1.L2,甚至有L3快取.硬盘上也

高性能HTTP加速器Varnish安装与配置(包含常见错误)

Varnish是一款高性能的开源HTTP加速器.挪威最大的在线报纸Verdens Gang使用3台Varnish取代了原来的12台Squid,性能竟然比曾经更好.Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发人员之中的一个.他觉得如今的计算机比起1975年已经复杂很多.在1975年时.储存媒介仅仅有两种:内存与硬盘.但如今计算机系统的内存除了主存外,还包含了cpu内的L1.L2,甚至有L3快取. 硬盘上也有自己的快取装置.因此Squid cache自行处理物件

HTTP加速器——VARNISH

一.前言    首先来简单认识一下什么是varnish?它能实现什么样的功能?....... Varnish是一款高性能的开源HTTP加速器,常见的缓存服务开源解决方案有varnish.nginx.squid .ats等,Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开 发者之一,varnish项目是2006年发布的第一个版本0.9.距今已经有十年了,此文档之前也提过varnish还不稳定,那是2007年时候编写的,经过varnish开发团队和网友们的辛苦耕耘,现

强大的http加速器------varnish

varnish 简介 varnish是一款强大的http加速器,其设计初衷因为计算机越来越复杂,不像那个只有内存与硬盘的存储媒介的年代,如今的计算机系统除了内存外还有cpu的L1.L2.L3快取,因此当初的Squid cache自行处理物件替换的架构不可能得知这些情况而做到最佳,但操作系统可以得知该情况,此PoulHenning Kamp设计了varinish的架构 varnish术语解析 缓存的衡量参数:命中率 # 1 文档命中率 # 2 字节命中率 缓存类型: # 私有缓存 (比如客户端的浏

Apache+varnish(高性能开源HTTP加速器)搭建负载均衡集群

实验环境:RHEL6.5 实验环境4台 真机进行访问测试     willis.example.com         172.25.254.6 虚拟机1(缓存端)   varnish.example.com       172.25.254.8 虚拟机2(服务器端1) web1.example.com     172.25.254.10 虚拟机3(服务器端2) web2.example.com     172.25.254.20 两台服务器主要用于负载均衡实验. 实验内容:1.服务器端安装Ap

高性能HTTP加速器varnish实践

一,varnish介绍及特点 varnish是一款高性能的.轻量的.开源的反向代理服务器和HTTP加速器.Varnish代码量不大,先进的设计理念和成熟的设计框架是它的主要特征.目前在缓存工具的选择上Varnish由于在本身的技术上优势已经超越传统的缓存工具squid,越来越受到青睐.以下是varnish的一些特点介绍:      1,基于内存缓存,重启后数据消失      2,利用虚拟内存方式,I/O性能好      3,支持设置0-60秒的精确缓存时间      4,配置管理灵活     

高性能HTTP加速器Varnish安装与配置

导读 Varnish是一款高性能且开源的反向代理服务器和HTTP加速器,它采用了全新的软件体系结构,和现在的硬件体系配合紧密.下面就由我给大家简单说说他的安装与配置. 安装 安装pcre 如果没有安装pcre,在编译varnish 2.0以上版本时,会提示找不到pcre库,而pcre库是为了兼容正则表达式,所以必须先安装pcre库.下面是pcre的安装过程: [[email protected] ~]# tar -zxvf pcre-7.9.tar.gz [[email protected] ~

高性能web缓存加速器---varnish

web缓存是对网页文档的临时缓存的信息技术,web缓存能有效降低带宽使用量和服务器负载,提高用户体验.为什么需要缓存呢? 经验研究发现程序的运行具有两个方面的局部性特征: 时间局部性:数据再次被访问到的几率很大 空间局部性:周围数据也可能被访问到的几率很大 根据局部性特征,将访问过的资源IO或加载到高速存储上,不再从源位置加载:另外把其周边的数据也加载到高速存储中,加速资源的访问.缓存就是使用了高速的设备和良好结构设计加速资源访问速度. 一.web缓存 web缓存加速器常常应用的于调度器之后,实