高性能的开源http加速器Varnish介绍

Varnish
一、varnish简介
Varnish是一款高性能的开源HTTP加速器,它比squid还稳定,且效率更高,资源占用更少。相信在反向代理,web加速方面,varnish已经有足够能力代替squid。挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好。
 
二、Varnish的结构与特点
Varnish是一个轻量级的Cache和反向代理软件,先进的设计理念和成熟的设计框架是Varnish的主要特点,现在的Varnish总共代码量不大,功能上虽然在不断改进,但是还需要继续丰富和加强。下面总结了Varnish的一些特点:
(1)是基于内存缓存,重启后数据将消失。
(2)利用虚拟内存方式,io性能好。
(3)支持设置0~60秒内的精确缓存时间。
(4)VCL配置管理比较灵活。
(5)32位机器上缓存文件大小为最大2G。
(6)具有强大的管理功能,例如top,stat,admin,list等。
(7)状态机设计巧妙,结构清晰。
(8)利用二叉堆管理缓存文件,达到积极删除目的。

三、varnish的系统架构
varnish主要运行两个进程:Management进程和Child进程(也叫Cache进程)。
 
Management进程主要实现应用新的配置、编译VCL、监控varnish、初始化varnish以及提供一个命令行接口等。Management进程会每隔几秒钟探测一下Child进程以判断其是否正常运行,如果在指定的时长内未得到Child进程的回应,Management将会重启此Child进程。
 
Child进程包含多种类型的线程,常见的如:
cache-main线程:全局只有一个,用于启动cache;
acceptor线程:接收新的连接请求并响应;
worker线程:child进程会为每个会话启动一个worker线程,因此,在高并发的场景中可能会出现数百个worker线程甚至更多;
expiry线程:从缓存中清理过期内容;
backend poll线程:每个后端服务器一个,用于检测后端服务器的健康状况;
epoll/kqueue线程:数量可配置,默认为2,用于管理线程池
 
在配置varnish时,一般只需为关注cache-worker线程,而且也只能配置其线程池的数量,而除此之外的其它均非可配置参数。与此同时,线程池的数量也只能在流量较大的场景下才需要增加,而且经验表明其多于2个对提升性能并无益处。

四、Varnish的安装
由于我使用的系统为RHEL5.8 ,因此在安装varnish之前,需要安装如下软件包:
automake,autoconf,libtool,ncurses-devel,libxslt,groff,pcre-devel,pkgconfig
# yum -y install *.rpm
 
编译安装varnish
# tar xf varnish-2.1.3.tar.gz
# cd varnish-2.1.3
# ./configure --prefix=/usr/loca/varnish
 


# make  && make install


为varnish提供配置文件
将varnish的默认配置文件复制成为/etc/sysconfig/varnish
# cp /usr/local/varnish/etc/varnish/default.vcl  /etc/sysconfig/varnish
 
创建Varnish用户和Varnish的工作目录
# useradd –s /sbin/nologin varnish
#mkdir  /web/cache
#chown –R varnish:varnish /web/cache

在varnish 2.0版本中,启动varnish之前首先需要为varnish指定后端服务器地址,因此,我们需要编辑varnish的配置文件,指定后端服务器地址。
# vim  /etc/sysconfig/varnish
添加如下信息即可:
backend default {
    .host = "127.0.0.1";
    .port = "80";
}
 
五、varnish的启动和停止
# /usr/local/varnish/sbin/varnishd -f /etc/sysconfig/varnish -s malloc,200M -T 127.0.0.1:2000 -a 0.0.0.0:8080
-f:指定varnish的配置文件
-s:指定varnish的存储类型和存储容量
-T:指定一个基于本文的管理接口,可用于在不停止varnish的情况下来管理varnish
-a:指定监听的套接字
 
查看varnish是否启动成功
# netstat -tunlp | grep varnish
tcp        0      0 0.0.0.0:8080                0.0.0.0:*                  LISTEN      18684/varnishd     
tcp        0      0 127.0.0.1:2000              0.0.0.0:*                  LISTEN      18683/varnishd     
其中8080为Varnish监听的端口,2000为Varnish基于telnet的管理端口。

停止Varnish,使用如下命令
# killall varnishd
 
六、Varnish的二进制程序文件
在安装Varnish后,会生成许多二进制程序文件,其中常见的命令有:
/usr/local/varnish/sbin/varnishd:这种Varnish的启动命令,最重要
/usr/local/varnish/bin/varnishadm:可用来控制管理Varnish实例的。如删除缓存对象
/usr/local/varnish/bin/varnishlog:显示Varnish的日志信息
/usr/local/varnish/bin/varnishncsa:这个命令也可以显示Varnish的日志信息,只不过这个命令显示的日志信息的格式有点类似于apache的combine格式输出的日志。
/usr/local/varnish/bin/varnishstat:显示Varnish的缓存信息
 
七、varnishd指令
varnishd的启动命令是/usr/local/varnishd/sbin/varnisd命令,这个命令有众多参数,可以使用/usr/local/varnish/sbin/varnishd –h来查看相关参数的详细信息。其中常用的参数有:
-a address:port:指定Varnish监听的套接字
-b address:port:指定后端服务器地址及其监听端口
-d:表示debug调试模式
-f file:指定Varnish的配置文件
-P file:指定Varnish的pid文件
-p param=value:指定服务器参数,用来优化Varnish性能的
-n dir:指定Varnish的工作目录
-s kind[,storageoptions]:指定Varnish后端存储的方式。常用的后端存储方式有:
        -s malloc,-s file,<dir_or_file>,<size>。注意在32位的操作系统下,Varnish最大仅支持2G的容量存储。
-t:指定缺省的ttl值
-T address:port:设定Varnish基于telnet的管理地址及其端口
-V:指定Varnish的版本号
-w int[,int[,int]]:指定Varnish的工作线程数。其配置方式有如下几种:
                  -w <fixed_count>
        -w min,max
        -w min,max,timeout [default: -w2,500,300]

八、Varnish是如何记录数据的?
Varnish一个比较显著的特点就是它如何记录数据的,varnish将所有的数据全部记录到内存当中,当内存全部使用以后,又从头开始记录,覆盖最旧的记录。因此,这样就可以很快的记录数据,而且也不占用磁盘空间。不过,一旦服务器宕机的话,则内存中所有的数据都会被释放。
 
九、varnishlog指令
Varnish提供了众多的工具来查看内存中的数据,在这里我只说varnishlog的应用
在命令行上执行varnishlog命令,显示结果如下:
  17 RxHeader    c Accept-Encoding: gzip, deflate
  17 RxHeader    c Host: 192.168.108.202:8080
  17 RxHeader    c Connection: Keep-Alive
  17 VCL_call    c recv
  17 VCL_return  c lookup
  17 VCL_call    c hash
  17 VCL_return  c hash
其中第一列是任意的数,它用来定义请求,相同的号码代表相同的HTTP传输。
第二列是信息标记,所有的日志都带有一个标记(tag),标记对应相对的操作。Rx表示varnish收到数据,Tx表示varnish发送数据。
第三列代表数据是从哪里传出或者传入的,是从c(client)还是b(backend)。
第四列是被记录的数据。
Varnishlog还有许多子选项:
-b:只显示varnish和backend server之间的日志,当您想要优化命中率的时候可以使用这个参数。
-c:和-b差不多,不过它代表的是varnish和client端的通信。
-i tag:只显示某个tag相关的信息,比如“varnishlog –iSessionOpen”将只显示新会话,注意,这个地方的tag名字是不区分大小写的。
-I:通过正则表达式过滤数据,比如“varnishlog -c -i RxHeader -I Cookie”将显示所有接到来自客户端的包含Cookie单词的头信息。

十、varnishstat指令
varnishstat的二进制程序是/usr/local/varnish/bin/varnishstat。缓存命中率的高低直接说明了varnish的运行状态和效果,较高的缓存命中率说明了varnish运行状态良好,web服务器的性能也会提高很多,反之,过低的缓存命中率说明varnish的配置可能存在问题,那么就需要进行调整,因此,从整体上了解varnish的命中率和缓存状态,对于优化和调整varnish至关重要。
使用/usr/local/varnish/bin/varnishstat命令可以查看Varnish的缓存状态信息。如:
# /usr/local/varnish/bin/varnishstat
Hitrate ratio:        1        1        1
Hitrate avg:    0.5294  0.5294  0.5294
 
          18        0.00        0.01 Client connections accepted
          17        0.00        0.01 Client requests received
          9        0.00        0.00 Cache hits
          8        0.00        0.00 Cache misses
          8        0.00        0.00 Backend conn. success
          8        0.00        0.00 Fetch with Length
          11          .            .  N struct sess_mem
          1          .            .  N struct objectcore
          1          .            .  N struct objecthead
          1          .            .  N struct smf
          1          .            .  N large free smf
          10          .            .  N worker threads
          10        0.00        0.00 N worker threads created
          1          .            .  N backends
          8          .            .  N expired objects
          8          .            .  N LRU moved objects
          10        0.00        0.00 Objects sent with write
          18        0.00        0.01 Total Sessions
          17        0.00        0.01 Total Requests
 
其中比较重要的参数有:
Client connections accepted:表示接受的连接数
Client requests received:表示接受的请求总数,如果使用了长连接,那么该值一般大于Client connections accepted值
Cache hits:表示命中的次数
Cache misses:表示非命中的次数
N struct objectcore:表示被缓存对象的数量
N expired objects:表示过期的缓存对象数量
N LRU moved objects:表示被淘汰的缓存对象数量

Varnish 的详细介绍请点这里
Varnish 的下载地址请点这里

猜你喜欢

转载自www.linuxidc.com/Linux/2015-05/117752.htm