高性能的开源http加速器Varnish

Varnish

一、varnish简介

Varnish是一款高性能的开源HTTP加速器,它比squid还稳定,且效率更高,资源占用更少。相信在反向代理web加速方面,varnish已经有足够能力代替squid挪威最大的在线报纸 Verdens Gang 使用3Varnish代替了原来的12Squid,性能比以前更好。

 

二、Varnish的结构与特点

Varnish是一个轻量级的Cache和反向代理软件,先进的设计理念和成熟的设计框架是Varnish的主要特点,现在的Varnish总共代码量不大,功能上虽然在不断改进,但是还需要继续丰富和加强。下面总结了Varnish的一些特点:

1)是基于内存缓存,重启后数据将消失。

2)利用虚拟内存方式,io性能好。

3)支持设置0~60秒内的精确缓存时间。

4VCL配置管理比较灵活。

532位机器上缓存文件大小为最大2G

6)具有强大的管理功能,例如topstatadminlist等。

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之前,需要安装如下软件包:

automakeautoconflibtoolncurses-devellibxsltgroffpcre-develpkgconfig

# 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/varnish/varnish.vcl

# cp /usr/local/varnish/etc/varnish/default.vcl  /etc/varnish/varnish.vcl

 

创建Varnish用户和Varnish的工作目录

# useradd �Cs /sbin/nologin varnish

#mkdir  /web/cache

#chown �CR varnish:varnish /web/cache


在varnish 2.0版本中,启动varnish之前首先需要为varnish指定后端服务器地址,因此,我们需要编辑varnish的配置文件,指定后端服务器地址。

# vim   /etc/varnish/varnish.vcl

添加如下信息即可:

backend default {

     .host = "127.0.0.1";

     .port = "80";

}

 

五、varnish的启动和停止

# /usr/local/varnish/sbin/varnishd -f  /etc/varnish/varnish.vcl  -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     

其中8080Varnish监听的端口,2000Varnish基于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的日志信息,只不过这个命令显示的日志信息的格式有点类似于apachecombine格式输出的日志。

/usr/local/varnish/bin/varnishstat:显示Varnish的缓存信息

 

七、varnishd指令

varnishd的启动命令是/usr/local/varnishd/sbin/varnisd命令,这个命令有众多参数,可以使用/usr/local/varnish/sbin/varnishd �Ch来查看相关参数的详细信息。其中常用的参数有:

-a address:port:指定Varnish监听的套接字

-b address:port:指定后端服务器地址及其监听端口

-d:表示debug调试模式

-f file:指定Varnish的配置文件

-P file:指定Varnishpid文件

-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发送数据。

第三列代表数据是从哪里传出或者传入的,是从cclient)还是bbackend)。

第四列是被记录的数据。

Varnishlog还有许多子选项:

-b:只显示varnishbackend server之间的日志,当您想要优化命中率的时候可以使用这个参数。

-c-b差不多,不过它代表的是varnishclient端的通信。

-i tag只显示某个tag相关的信息,比如“varnishlog �CiSessionOpen将只显示新会话,注意,这个地方的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介绍)