Varnish可以有效降低web服务器的负载,提升访问速度。Varnish是一个cache型的HTTP反向代理。
当把Varnish部署上之后,客户端的请求将首先被Varnish接受。Varnish将分析接收的请求,并将其转发到后端的web服务器上。后端的web服务器对请求进行常规的处理,并将依次将处理结果返回给Varnish。
Varnish的核心功能是能能将后端web服务器返回的结果缓存起来,如果发现后续有相同的请求,Varnish将不会将这个请求转发到web服务器,而是返回缓存中的结果。这将有效的降低web服务器的负载,提升响应速度,并且每秒可以响应更多的请求。Varnish速度很快的另一个主要原因是其缓存全部都是放在内存里的,这比放在磁盘上要快的多。
二、Varnish 特点
基于内存进行缓存,重启后数据将消失。
利用虚拟内存方式,I/O性能好。
支持设置0~60秒内的精确缓存时间。
VCL配置管理比较灵活。
32位机器上缓存文件大小为最大2GB。
具有强大的管理功能,例如top,stat,admin,list等。
状态机设计巧妙,结构清晰。
利用二叉堆管理缓存文件,达到积极删除目的。
三、Varnish 与 Squid 对比
相同点
都是开源反向代理服务器。
不同点
Varnish的稳定性很高。因为Squid需要经常重启
Varnish缓存数据都直接从内存读取,而Squid是从硬盘读取缓存数据,因此Varnish在访问速度方面会更快。
Varnish的TCP连接释放要比Squid快,所以在高并发连接情况下可以支持更多TCP连接。
Varnish可以通过管理端口,使用正则表达式批量清除部分缓存,而Squid做不到。
当然,与传统的Squid相比,Varnish也有缺点。
Varnish在高并发状态下CPU、I/O和内存等资源开销都高于Squid。
Varnish进程一旦挂起、崩溃或者重启,缓存数据都会从内存中完全释放,此时所有请求都会被发送到后端服务器,在高并发情况下,这会给后端服务器造成很大压力。
LB 负载均衡器
结构化数据放在关系型数据库中 非结构化数据放在文件系统上
PCI-E I/O能力强
反向代理能实现访问控制功能
两个组件间之间衔接不流畅 加中间层 速度不匹配 加缓存
缓存都是键值存储 键是哈希编码后存储的
缓存对象,有生命周期,需定期清理
缓存空间耗尽:LRU(最近最少使用缓存对象从缓存空间清理出去)
分布式缓存 CDN 内容分发网络
GSLB 全局负载均衡。作用:实现在广域网(包括互联网)上不同地域的服务器间的流量调配,保证使用最佳的服务器服务离自己最近的客户,从而确保访问质量。 在CDN系统中作为核心的流量调度系统
常见的缓存服务开源解决方案
varnish squid (类似 nginx–> apache)
nginx apache 也有缓存功能
nginx 和 haproxy 在性能上不分伯仲
execstart 定义如何启动守护进程
#node1环境:
[root@node1 ~]# iptables -F
[root@node1 ~]# setenforce 0
[root@node1 ~]# yum install varnish -y
[root@node1 ~]# vim /etc/varnish/test.vcl
[root@node1 ~]# systemctl start varnish.service
[root@node1 ~]# ss -tnl
----------
#node2,node3环境:
[root@node2/3 ~]# iptables -F
[root@node2/3 ~]# setenforce 0
[root@node2/3 ~]# yum install -y httpd
[root@node2/3 ~]# for i in {1..10}; do echo "page $i on web1" > /var/www/html/test$i,html; done
[root@node2/3 ~]# systemctl start httpd.service
----------
#node4 测试
varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 # 登录管理命令行
varnish> vcl.list # 列出所有的配置
varnish> vcl.load test1 test.vcl # 加载编译新配置,test1是配置名,test.vcl是配置文件
varnish> vcl.use test1 # 使用配置,需指定配置名,当前使用的配置以最后一次vcl.use为准
varnish> vcl.show test1 # 显示配置内容,需指定配置名
配置后端的web服务器
#编辑配置文件
[root@node1 ~]# vim /etc/varnish/test.vcl
backend default {
.host = "192.168.2.139";
.port = "80";
}
为响应添加X-Cache首部,显示缓存是否命中
#编辑配置文件
[root@node1 ~]# vim /etc/varnish/test.vcl
vcl_deliver {
if (obj.hits>0) {
set resp.http.X-cache="hit from"+server.ip;
}else{
set resp.http.x-cache="miss from"+server.ip;
}
}
#测试
[root@node4 ~]# curl -I http://192.168.2.138:6081/test2.html
强制对某资源请求不检查缓存
#编辑配置文件
[root@node1 ~]# vim /etc/varnish/test.vcl
vcl_recv {
if (req.url ~ "^/test3.html$" || req.url ~ "(?i)^/admin" || req.url ~ "(?i)^/login") {
return(pass);
}
}
#测试
[root@node4 ~]# curl -I http://192.168.2.138:6081/test3.html
[root@node4 ~]# curl -I http://192.168.2.138:6081/login/index.html
[root@node4 ~]# curl -I http://192.168.2.138:6081/admin/index.html
对特定资源取消其私有Cookie标识,并强行设定其可以由varnish缓存的时长 即TTL值
#编辑配置文件
[root@node1 ~]# vim /etc/varnish/test.vcl
sub vcl_backend_response {
if (beresp.http.cache-control !~ "s-maxage") {
if (bereq.url ~ "(?i)\.jpg$") {
set beresp.ttl=3600s;
unset beresp.http.Set-Cookie;
}
if (bereq.url ~ "(?i)\.css$") {
set beresp.ttl=600s;
unset beresp.http.Set-Cookie;
}
}
}
#测试
[root@node4 ~]# curl -I http://192.168.2.138:6081/1.jpg
设定使用多个后端主机响应资源
[root@node1 ~]# vim /etc/varnish/test.vcl
backend websrv1 {
.host = "192.168.2.139";
.port = "80";
.probe = {
.url = "/test1.html";
}
}
backend websrv2 {
.host = "192.168.2.137";
.port = "80";
.probe = {
.url = "/test1.html";
}
}
sub vcl_recv {
if (req.url ~ "(?i)\.(jpg|png|gif)$") {
set req.backend_hint = websrv1;
} else {
set req.backend_hint = websrv2;
}
负载均衡
[root@node1 ~]# vim /etc/varnish/test.vcl
backend websrv1 {
.host = "192.168.2.139";
.port = "80";
.probe = {
.url = "/test1.html";
}
}
backend websrv2 {
.host = "192.168.2.137";
.port = "80";
.probe = {
.url = "/test1.html";
}
}
import directors;
sub vcl_init {
new mycluster = directors.round_robin();
mycluster.add_backend(websrv1);
mycluster.add_backend(websrv2);
}
vcl_recv {
set req.backend_hint = mycluster.backend();
}
小命令
[root@node1 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
ping
status
vcl.load test1 default.vcl
vcl.use test1
vcl.use boot
vcl.discard test1
vcl.list
vcl.show boot
storage.list
panic.show
param.show
param.set thread_pools 4
param.show thread_pools
backend.list
ban.list
[root@node1 ~]# varnishlog
[root@node1 ~]# varnishncsa
[root@node1 ~]# varnishtop
[root@node1 ~]# varnishstat
1. Ehcache
在Java项目中应用非常广泛, 主要面向通用缓存,J2EE和轻量级容器。一级缓存在内存,二级缓存在磁盘。
优点:
1. 直接在jvm虚拟机中缓存,速度快,效率高;
2. 小巧,使用简单;
缺点:
缓存共享麻烦,不易维护;集群分布式应用不方便。
应用场景:
单个应用或者对缓存访问要求很高的应用。
2. Varnish
高性能、开源的反向代理服务器和内存缓存服务器。
优点:
1. 高性能;
2. 多核支持;
3. 支持0-60秒的精确缓存时间。
缺点:
1. 不具备自动容错和恢复功能,重启后数据丢失;
2. 在线扩容比较难。
3. 32位机器上缓存文件大小为最大2GB;
4. 不支持集群。
应用场景:
并发要求不是很大的小型系统和应用。
3. Memcache
一个高性能的分布式内存对象缓存系统。通过key-value形式缓存。
优点:
1. 高性能;
2. 多线程支持,安装简单;
3. 部分容灾;
4. 均衡请求。
缺点:
1. 不能持久化存储;
2. 存储数据有限;
3. 集群数据没有复制和同步机制;
4. 内存回收不能及时。
应用场景:
大型系统,缓存共享、分布式部署和集群应用。
4. Redis
基于内存的键-值存储数据库。
优点:
1. 高性能;
2. 丰富的数据类型;
3. 支持持久化;
4. 支持主从复制。
缺点:
1. 不具备自动容错和恢复功能;
2. 在线扩容比较难;
3.不支持多核多线程处理。
应用场景:
大型系统,缓存共享、分布式部署和集群应用。