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

#                                                                                                                        #
posted @ 2022-12-18 17:08  麦恒  阅读(83)  评论(0编辑  收藏  举报