Varnish是一款高性能的开源HTTP加速器,一般用来和Nginx、Apache等搭配使用,组建一个高效率的Web服务器。varnish是一个cache型的HTTP反向代理。

常见的工作方式是:某个负责接受新HTTP连接的线程开始等待用户,如果有新的HTTP连接过来,它总负责接收,然后叫醒某个等待中的线程。Worker线程读入HTTP请求的URI,查找已有的object,如果命中则直接返回并回复用户。如果没有命中,则需要将所请求的内容,从后端服务器中取过来,存到缓存中,然后再回复。

典型的结构如下:

本文将简单介绍ubuntu server下安装和配置varnish的方法。

安装varnish

使用ubuntu软件包管理工具安装varnish。

apt-get install varnish

配置varnish

1. /etc/default/varnish

DAEMON_OPTS="-a :80 \                                             
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s malloc,100m"

各个字段的含义如下:

-a :80表示监听端口为80,-T localhost:6082表示控制端口为本机6082,即可以通过localhost:6802访问varnish的控制信息, -f /etc/varnish/default.vcl表示将请求forword到由vcl配置的机器, -s malloc,100m 表示使用100m的内存

2. /etc/varnish/default.vcl

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

backend default定义默认的后端服务器的ip和端口,也即nginx监听的端口。当然vcl可以定义各种复杂的转发策略,这个超出了本文的范围。配置好后可以重新启动varnish了

/etc/init.d/varnish restart
 * Stopping HTTP accelerator varnishd      [ok]
 * Starting HTTP accelerator varnishd      [ok]

测试varnish

配置好varnish后,浏览站点,发现HTTP Response头中多了:

X-Varnish   1666066465 1666066458

上面的头信息表示varnish正常工作了。我们也可以使用varnish提供的命令行工具varnishstat分析varnish的缓存状态,可以使用varnishlog查看varnish的和客户端以及后端的通信信息。

Mysql是这个世界上最通用的数据库了,很多优点集于一身:开源、高效、免费等。但是对于生成实践中的高并发、高可用性、安全性等要求,单台mysql往往无法满足。

master-slave

一般可以通过主从读写分离来提升数据库的并发能力。

常见的部署如下:

enter image description here

这种架构满足了生产环境的需要,但是却大大增加了开发复杂度,作为一名研发人员要在业务代码中考虑读写分离以及由此引发的更加复杂的事务操作,不得不说很糟糕。为了解决这种问题,可以引入中间层proxy。


mysql proxy

mysql proxy实现了mysql client和mysql server的标准通信协议。因此对研发人员来说使用mysql proxy和使用单机的msyql没有区别,他们甚至感觉不到proxy的存在。mysql proxy实现了读写分离、连接池、负载均衡。 下图是一个简单的proxy示意图,其中关键点在于:

将写和事务性语句分发到master,将读分发的slave

enter image description here