varnish03-Varnish的基础原理和命令行工具
1、varnish工作原理
- Varnish主要有两个进程,管理进程(Management)和子进程(Child)。
- 管理进程主要负责配置变更、编译VCL、监控运行、初始化、定期检查子进程(子进程宕机会重新开启)。
- 子进程包括Worker线程、Acceptor线程、Expiry线程,内部使用workspace工作区来减少多个线程间对内存的竞争。
- varnish架构图:
1.1、Varnish的工作流程
- (1)Varnish的某个负责接收新HTTP连接的线程开始等待用户,如果有新的HTTP连接过来,它会负责接收,然后叫醒某个等待中的线程,并把具体的处理过程交给它。Worker线程读入HTTP请求的URI,查找已有的object。如果命中则直接返回并回复用户;如果没有命中,则需要从后端服务器中读取所请求的内容并存到缓存中,然后再回复。
- (2)分配缓存的过程:Varnish缓存对象时,默认会忽略体积过大的对象,因此会事先读取对象(object)的大小,经过默认配置的验证和筛选,保证其自身缓存策略的高效性。
- 为了读写高效性,会将筛选后合适的对象(object)压缩,压缩过程中会从现有的空闲存储结构体中查找,找到最合适大小的空闲存储块并将object分配给它。如果空闲块没有用完,就用多余的内存另外组成一个空闲存储块,挂到管理结构体上。如果缓存已满,就根据LRU机制,把最旧的object释放掉。
- (3)释放缓存的过程:有一个超时线程,检测缓存中所有object的生存期,如果超出设定的TTL(Time To Live)还没有被访问,就删除该object,并且释放相应的结构体及存储内存。注意释放时会检查该存储内存块前后空闲内存块,如果前后空闲内存和该释放内存是连续的,就将它们合并成一块更大的内存。
- (4)整个文件缓存的管理,没有考虑文件与内存的关系,实际上认为所有的object都在内存中,如果内存不足,系统会自动将其换到swap空间,而不需要Varnish程序去控制。
- (5)日志:为了与系统的其他部分进行交互,Child进程使用了可以通过文件系统接口进行访问的共享内存日志(shared memorylog),因此,如果某线程需要记录信息,其仅需要持有一个锁,而后向共享内存中的某内存区域写入数据,再释放持有的锁即可。为了减少竞争,每个worker线程都使用了日志数据缓存。
- (6)共享内存日志大小一般为90MB,其分为两部分,前一部分为计数器,后一部分为客户端请求的数据。Varnish提供了多个不同的工具,如varnishlog、varnishncsa、varnishstat等,用以来分析共享内存日志中的信息并以指定的方式进行显示。
1.2、varnish的优缺点
- Varnish的优势如下:
- Varnish支持更多的并发连接,因为Varnish的TCP连接比squid快。
- Varnish访问速度快,因为其采用了Visual Page Cache技术,直接从内存中读取数据。
- Varnish通过管理端口,使用正则表达式批量清除部分缓存。
- Varnish量级轻且开源。
- Varnish的缺点如下:
- 进程一旦挂掉或重启,缓存的数据将从内存中完全释放。
- 用多台Varnish实现负载均衡时,每次请求都会落到不同的Varnish服务器中,可能会造成URL请求穿透到后端。
2、varnish的相关命令
2.1、varnishd命令
- varnishd命令可以启动varnish进程,也可以设置其运行参数。
- 也可以通过varnish.params配置文件设置运行参数。
]# varnishd --help -a address:port #对外提供Web服务的地址和端口,默认端口是6081 -T address:port #varnish管理API监听的地址和端口,默认端口是6082 -b address:port #后端的地址和端口 -f file #VCL的配置文件 -S secret-file #CLI鉴权的加密文件 -g group #varnish进程的属组 -u user #varnish进程的属主 -i identity #varnish实例的标识 -n dir #Varnishd工作目录 -P file #PID文件 -s [name=]kind[,options] #varnish的缓存存储机制 # -s malloc[,<size>] # -s file [default: use /tmp] # -s file,<dir_or_file> # -s file,<dir_or_file>,<size> #例如,-s file,/usr/local/varnish/cache.data,1G # -s file,<dir_or_file>,<size>,<granularity> # -s persist{experimental} -t #默认的TTL -p param=value #设置运行参数(可以重发使用) -r param[,param...] #使参数为只读 -h kind[,hashoptions] #Hash规范 # -h critbit [default] # -h simple_list # -h classic # -h classic,<buckets> -l shl,free,fill #共享内存文件大小 # shl: space for SHL records [80m] # free: space for other allocations [1m] # fill: prefill new file [+] -M address:port #反向CLI目的地。 -F #在前台运行 -d #以debug模式运行(调试) -C #打印VCL代码(编译成C语言) -V #version
2.2、varnishadm命令
- 管理正在运行的Varnish实例
varnishadm [-n ident] [-t timeout] [-S secretfile] -T [address]:port command [...] -n #连接到varnishd的具体实例的名称。 -t #等待操作完成的超时时间 -S #指定验证身份的加密文件。应该是与varnishd的-S参数相同。 -T #连接到管理API接口的地址和端口。
- varnishadm命令的子命令
]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 ... help [<command>] banner #打印欢迎横幅。 ping [<timestamp>] #探测服务器进程是否存活 auth <response> #认证 quit #退出 status #查看服务状态 start #启动服务 stop #停止服务 vcl.list #列出VCL配置文件的所有版本 vcl.show [-v] <configname> #查看指定VCL配置文件的详细信息 vcl.load <configname> <filename> #重新加载VCL配置文件(加载并编译) vcl.use <configname> #指定使用VCL配置文件哪个版本 vcl.discard <configname> #删除指定的VCL配置文件版本 vcl.inline <configname> <quoted_VCLstring> param.show [-l] [<param>] #查看运行时参数 param.set <param> <value> #设置运行时参数 storage.list #查看所有的存储类型 backend.list [<backend_expression>] #列出后端主机 backend.set_health <backend_expression> <state> #设置后端主机是否健康。sick(不健康)、health(健康)、auto(自动检测)。 ban.list ban <field> <operator> <arg> [&& <field> <oper> <arg>]... panic.show panic.clear
2.3、varnish_reload_vcl命令
//重载vcl配置文件: ]# varnish_reload_vcl
2.4、varnishstat命令
- varnishstat用来显示Varnish实例的统计信息。
]# varnishstat --help usage: varnishstat [-1lV] [-f field_list] [-n varnish_name] [-N filename] [-w delay] -1 #(数字)将统计信息输出到标准输出。 -f field_list #指定要查看的字段列表。如果以'^'开头,则用作排除列表。 -l #(字母)列出可以与-f选项一起使用的字段
示例:
varnishstat -1 -f MAIN.cache_hit -f MAIN.cache_miss varnishstat -l -f MAIN -f MEMPOOL
2.5、varnishtop命令
- varnishtop命令读取varnishd共享内存中的日志,并显示一个持续更新的最常出现的日志条目列表。通过使用-I、-I、-X和-X选项进行适当的过滤,可以使用它显示所请求的文档、客户端、用户代理或记录在日志中的任何其他信息的排名。
]# varnishtop --help [-1] #(数字)仅运行一次 [-i taglist] #仅显示指定的标签,-i可以重复使用 [-I <[taglist:]regex>] #仅显示被匹配的标签 [-x taglist] #显示所有指定之外的标签 [-X <[taglist:]regex>] #显示不被匹配的标签 [-b] #只显示后端记录 [-c] #只显示客户端记录 [-C] #不区分大小写的正则表达式 [-d] #Process old log entries on startup [-f] #仅限第一个字段
2.6、varnishlog命令
- 显示varnish日志(原始形式,内容详细)
2.7、varnishncsa命令
- 显示varnish日志,使用Apache/NCSA组合日志格式。
1
# #