企业级缓存系统varnish应用与实战

  环境背景:随着公司业务快速发展,公司的电子商务平台已经聚集了很多的忠实粉丝,公司也拿到了投资,这时老板想通过一场类似双十一的活动,进行一场大的促销,届时会有非常多的粉丝访问网站,你的总监与市场部门开完会后,确定活动期间会有平常10倍以上的访问请求,总监要求大幅增加网站容量,除了去扩容服务器之外,还有没有其他办法呢?

总项目流程图,详见 http://www.cnblogs.com/along21/p/8000812.html

实现基于Keepalived+Haproxy+Varnish+LNMP企业级架构

原理:

缓存,又称加速器,用于加速运行速度较快的设备与较慢设备之间的通信。基于程序的运行具有局部性特征其能实现加速的功能

1、环境准备

 

机器名称

IP配置

服务角色

备注

haproxy-server-master

VIP:172.17.100.100

DIP:172.17.1.6

负载均衡器

主服务器

配置keepalived

haproxy-server-backup

VIP:172.17.100.100

DIP:172.17.11.11

负载服务器

从服务器

配置keepalived

varnish

RIP:192.168.30.2

缓存服务器

开启代理功能

rs01

RIP:192.168.30.107

后端服务器

开启lnmp的web

rs02

RIP:192.168.30.7

后端服务器

开启lnmp的web

2、在两个 haproxy上设置

全局段和默认段不用修改,就不写了

vim /etc/haproxy/haproxy.cfg

vim /etc/haproxy/haproxy.cfg
① frontend 前端设置
frontend web
bind :80
acl staticfile path_end .jpg .png .bmp .htm .html .css .js
use_backend varnish-server if staticfile
default_backend appsrvs
② backend 后端设置
backend varnish-server
balance roundrobin
server varnishsrv 192.168.30.2: check inter rise fall 3
backend appsrvs
balance roundrobin
server appsrv1 192.168.30.107:80 check inter 3000 rise 3 fall 3
server appsrv2 192.168.30.7:80 check inter 3000 rise 3 fall 3
③ 可以加个web状态监测页面,可要可不要
listen admin
bind :
stats enable
stats hide-version
stats uri /haproxy?admin
stats realm HAProxy\ Statistics
stats auth along:along
stats refresh 20s
stats admin if TRUE

3、设置keepalived

(1)在主haproxy-master

① 全局段,主要是设置发邮件的
global_defs {
notification_email {
root@localhost
}
notification_email_from root@along.com
smtp_server 127.0.0.1
smtp_connect_timeout
router_id keepalived_haproxy
}
② 编辑一个健康监测脚本,每2秒监测一次haproxy进程
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval
fall
rise
weight -
}
③ 定义主从和VIP
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id
priority
advert_int
authentication {
auth_type PASS
auth_pass along
}
virtual_ipaddress {
172.17.100.100
}
track_script { //调用上边的脚本
chk_haproxy
}
}

(2)在从haproxy-backup 上,和主差不多,只需修改主从和优先级

vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id
priority
advert_int
authentication {
auth_type PASS
auth_pass along
}
virtual_ipaddress {
172.17.100.100
}
}

4、设置varnish

(1)设置配置,管理Management进程的配置文件,配置进程的

vim /etc/varnish/varnish.params 修改端口和缓存类型及缓存大小

VARNISH_ADMIN_LISTEN_PORT=6082

VARNISH_STORAGE="file,/data/cache,1G"

(2)设置总配置文件,配置缓存系统的

vim /etc/varnish/default.vcl

(a)第一段

① 设置一个健康监测
vcl 4.0; //指定版本
import directors; //加载后端的轮询模块
probe backend_healthcheck { //设置名为backend_healthcheck的健康监测
.url = "/index.html";
.window = ; #窗口
.threshold = ; #门槛
.interval = 3s;
.timeout = 1s;
} ② 设置后端server
backend web1 {
.host = "192.168.30.107";
.port = "";
.probe = backend_healthcheck;
}
backend web2 {
.host = "192.168.30.7";
.port = "";
.probe = backend_healthcheck;
} ③ 配置后端集群事件
sub vcl_init {
new web_cluster = directors.round_robin(); //把web1和web2 配置为轮询集群,取名为web_cluste
web_cluster.add_backend(web1);
web_cluster.add_backend(web2);
}
acl purgers { # 定义可访问来源IP,权限控制
"127.0.0.1";
"172.17.0.0"/;
}

(b)第二段,定义引擎

① 定义vcl_recv 引擎,不认识的头部请求直接扔后端的pass
sub vcl_recv {
if (req.method == "GET" && req.http.cookie) {
return(hash); //处理完recv 引擎,给下一个hash引擎处理
}
if (req.method != "GET" &&
req.method != "HEAD" &&
req.method != "PUT" &&
req.method != "POST" &&
req.method != "TRACE" &&
req.method != "OPTIONS" &&
req.method != "PURGE" &&
req.method != "DELETE") {
return (pipe); //除了上边的请求头部,通过通道直接扔后端的pass
}
② 定义index.php通过特殊通道给后端的server,不经过缓存
if (req.url ~ "index.php") {
return(pass);
}
③ 定义删除缓存的方法
if (req.method == "PURGE") { # PURGE请求的处理的头部,清缓存
if (client.ip ~ purgers) {
return(purge);
}
}
④ 为发往后端主机的请求添加X-Forward-For首部
if (req.http.X-Forward-For) { # 为发往后端主机的请求添加X-Forward-For首部
set req.http.X-Forward-For = req.http.X-Forward-For + "," + client.ip;
} else {
set req.http.X-Forward-For = client.ip;
}
return(hash);
} ⑤ 定义vcl_hash 引擎,后没有定义hit和Miss的路径,所以走默认路径
sub vcl_hash {
hash_data(req.url);
} ⑥ 定义要缓存的文件时长
sub vcl_backend_response { # 自定义缓存文件的缓存时长,即TTL值
if (bereq.url ~ "\.(jpg|jpeg|gif|png)$") {
set beresp.ttl = 30d;
}
if (bereq.url ~ "\.(html|css|js)$") {
set beresp.ttl = 7d;
}
if (beresp.http.Set-Cookie) { # 定义带Set-Cookie首部的后端响应不缓存,直接返回给客户端
set beresp.grace = 30m;
return(deliver);
}
} ⑦ 定义deliver 引擎
sub vcl_deliver {
if (obj.hits > ) { # 为响应添加X-Cache首部,显示缓存是否命中
set resp.http.X-Cache = "HIT from " + server.ip;
} else {
set resp.http.X-Cache = "MISS";
}
unset resp.http.X-Powered-By; //取消显示php框架版本的header头
unset resp.http.Via; //取消显示varnish的header头
}

5、开启服务的顺序

① 先开启后端server事先搭建好的lnmp web服务

systemctl start nginx

systemctl start php-fpm

systemctl start mariadb

② 再开启varnish缓存服务器

service varnish start

③ 开启主从的keepalived,提供VIP

service keepalived start

④ 开启haproxy服务

service haproxy start

6、测试

(1)配置完成后,client访问,http://172.17.100.100/ ,成功访问web

(2)访问http://172.17.100.100:9527/haproxy?admin ,haproxy的web监测页面,正常

(3)当主haproxy 宕机时,VIP自动漂移到从上,且服务正常使用

在主haproxy 上,server stop haproxy,VIP会漂到从上

(4)varnish 缓存服务器上,确实生成了缓存文件

F12打开网页的调试页面,查看确实缓存了

(5)测试清缓存的功能,PURGE 发送头部信息

(6)后端有一台server 宕机,服务照常使用

systemctl stop nginx

项目实战5—企业级缓存系统varnish应用与实战的更多相关文章

  1. 企业级缓存系统varnish应用

    场景 随着公司业务快速发展,公司的电子商务平台已经聚集了很多的忠实粉丝,公司也拿到了投资,这时老板想通过一场类似双十一的活动,进行一场大的促销,届时会有非常多的粉丝访问网站,你的总监与市场部门开完会后 ...

  2. 服务器后端开发系列——《实战Memcached内存缓存系统》

    1.实战Memcached缓存系统(1)Memcached基础及示例程序 内容:建筑Memcached背景知识和入门示例程序. 2.实战Memcached缓存系统(2)Memcached Java A ...

  3. Java商城秒杀系统的设计与实战视频教程(SpringBoot版)

    课程目标掌握如何基于Spring Boot构建秒杀系统或者高并发业务系统,以及构建系统时采用的前后端技术栈适用人群Spring Boot实战者,微服务或分布式系统架构实战者,秒杀系统和高并发实战者,中 ...

  4. 个人项目--“”小鱼企业级开发系统“”Svn地址分享

    由于精力有限,博主现在只维护这一个系统,会不时的更新代码提交. ""小鱼企业级开发系统""的Svn地址:http://code.taobao.org/svn/S ...

  5. 项目四:Java秒杀系统方案优化-高性能高并发实战

    技术栈 前端:Thymeleaf.Bootstrap.JQuery 后端:SpringBoot.JSR303.MyBatis 中间件:RabbitMQ.Redis.Druid 功能模块 分布式会话,商 ...

  6. 项目实战15—企业级堡垒机 jumpserver

    本文收录在Linux运维企业架构实战系列 环境准备 系统:CentOS 7 IP:192.168.10.101 关闭selinux 和防火墙 # CentOS $ setenforce # 可以设置配 ...

  7. varnish缓存系统基础知识

    缓存系统类型 1.页面缓存/pageCache     缓存静态资源(html js css image)  例如:varnish    squid 2.数据缓存/dataCache      缓存应 ...

  8. WEB缓存系统之varnish状态引擎

    前文我们聊了下varnish的VCL配置以及语法特点,怎样去编译加载varnish的vcl配置,以及命令行管理工具varnishadm怎么去连接varnish管理接口进行管理varnish,回顾请参考 ...

  9. (转)实战Memcached缓存系统(1)Memcached基础及示例程序

    1.Cache定义 (1)狭义概念:用于CPU的相对高速处理与主存(Main Memory)的相对低速处理的之间起到协调功能的硬件设备. (2)广义概念:用于速度相差较大的两种硬件之间,起到协调两者数 ...

随机推荐

  1. Tomcat 笔记-配置域名

    编辑/etc/hosts文件,添加域名: 127.0.0.1 localhost 127.0.1.1 ubuntu # The following lines are desirable for IP ...

  2. Java基础总结--多线程总结2

    ----多线程通信-----1.概述:多个线程处理同一个资源,但是各自的任务不相同eg:线程1负责存储数据,线程2负责处理该数据.数据--就是同一个资源怎样用java语言描述上面的例子:* 资源是变化 ...

  3. python 使用标准库根据进程名获取进程的pid

    有时候需要获取进程的pid,但又无法使用第三方库的时候. 方法适用linux平台. 方法1 使用subprocess 的check_output函数执行pidof命令 from subprocess ...

  4. 使用angular4和asp.net core 2 web api做个练习项目(一)

    这是一篇学习笔记. angular 5 正式版都快出了, 不过主要是性能升级. 我认为angular 4还是很适合企业的, 就像.net一样. 我用的是windows 10 安装工具: git for ...

  5. asp.net在类库中使用EF 6.0时的相关配置

    前提:之前使用EF的配置都是直接使用NuGet安装在项目中,然后直接修改web.config中的connectionString,然后创建相关dbcontext直接使用就可以了.此次为直接将EF安装在 ...

  6. ios 中的 GCD

    摘自:http://www.cocoachina.com/swift/20150129/11057.html libdispatch是Apple所提供的在IOS和OS X上进行并发编程的库,而GCD正 ...

  7. java8Stream原理深度解析

    Java8 Stream原理深度解析 Author:Dorae Date:2017年11月2日19:10:39 转载请注明出处 上一篇文章中简要介绍了Java8的函数式编程,而在Java8中另外一个比 ...

  8. YSlow---基于firebug的插件 ,用于网站页面性能的分析

    YSlow有什么用? YSlow可以对网站的页面进行分析,并告诉你为了提高网站性能,如何基于某些规则而进行优化. YSlow可以分析任何网站,并为每一个规则产生一个整体报告,如果页面可以进行优化,则Y ...

  9. DataFrame使用总结1(超实用)

    DataFrame使用总结1(超实用): 1. 合并两个表 frame = [df1, df2] df = pd.concat(frame) res = pd.merge(df, df1, on=[' ...

  10. 学习笔记-----php搭建用户管理系统

    后台:php,数据库:mysql,前端:html,css,js; 主要页面介绍: 1.php连接数据库后台,读取数据并将其以表格的形式显示,并且有添加,编辑,删除,分页等功能: 2.php用于添加用户 ...