WEB缓存系统之varnish代理以及健康状态检测配置
前文我们聊了下varnish的缓存项修剪配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12666406.html;今天我来说一下varnish作为代理服务器反向代理多主机的配置;前边的所有操作都是针对后端主机只有一台的情况来说varnish的配置;在生产环境中,我们的web站点服务器不应该只有一台;默认情况下才安装好varnish的主机,在default.vcl中只可以指定一台后端主机的地址和端口;如果我们后端主机是多台的情况下,我们需要加载varnish的模块directors;然后用backend+后端主机名称(这个名称是我们自定义的,只要是一合法名称即可),来分别把每个主机的地址和端口配置好即可;
示例:

提示:以上每个红框中的内容表示一台后端server;以上配置表示定义两台后端主机,其名称分别为webserver1和webserver2;
把主机定义好后,这里还需要用在vcl_init状态引擎中配置初始化一个组,然后把这两台主机加到对应的组中;
示例:

提示:以上配置表示用directors模块中的round_robin()方法初始化一个组对象,取名叫webserver;然后把对应两台主机加入到这个初始化组对象中;这意味着这个组里有两个成员,一个是webserver1,一个是webserver2;directors.round_robin()用这个方法初始化组对象表示往后端调度的算法是轮询,即没有权重;要想有权重,需要用directors.random()方法;如果需要做会话保持,需要用到directors.hash()方法;
示例:初始化组对象用randomf方法

提示:用random方法就在后面加权重;
示例:初始化组对象用hash方法来保持会话

提示:hash方法也是支持权重的;
到此我们就把两台后端主机加入到webserver组中了;现在我们可以编译加载我们的配置文件,然后用varnishadm工具连接到控制管理shell中查看后端主机列表;
[root@test_node1-centos7 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
200
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,3.10.0-693.el7.x86_64,x86_64,-sfile,-smalloc,-hcritbit
varnish-4.0.5 revision 07eff4c29 Type 'help' for command list.
Type 'quit' to close CLI session. varnish> vcl.list
200
active 0 boot varnish> vcl.load test default.vcl
200
VCL compiled. varnish> vcl.list
200
active 0 boot
available 0 test varnish> vcl.use test
200
VCL 'test' now active varnish> backend.list
200
Backend name Refs Admin Probe
webserver1(192.168.0.10,,80) 2 probe Healthy (no probe)
webserver2(192.168.0.99,,80) 2 probe Healthy (no probe) varnish> quit
500
Closing CLI connection
[root@test_node1-centos7 ~]#
提示:可以看到我们编写的vcl把多台主机加入到webserver组的配置生效了;从上面的配置看,后端主机有两台,一台是webserver1,一台是webserver2;
测试:用curl命令访问192.168.0.99:8000 看看是否把用户请求分别调度到后端个server上去了?

提示:从上面的结果看,好像没有把用户的请求调度到server1上去;原因是我们没有配置说明把所有未命中缓存的请求发送到后端主机上去,它默认是把第一次匹配backend 关键字+名称的配置当作默认主机;所以这里我们怎么访问都调度到192.168.0.10这台主机上去;
示例:在vcl_recv中调用我们之前定义的组,明确说明把未命中缓存的请求发送到该组上;

提示:以上红框中的内容表示把用户请求发送到我们定义好的组上的主机;
测试:

提示:从上面的结果看,我们定义的主机上基于轮询的方式在往后端调度;这里测试需要把varnish上的缓存项给修剪掉,然后再次请求才可以看到把请求调度到不同主机上;
以上就是varnish代理多主机的配置方法,总结如下:
1)首先我们要导入directors模块;
2)用backend关键字来定义后端主机,起一名称,用花括号引入一段上下文,里面用.host指定后端主机的IP地址,用.port指定后端主机端口;
3)在vcl_init状态引擎中初始化一个组对象,然后用组对象的add_backend(server)把对应主机加入到该组;
4)在vcl_recv状态引擎中使用我们初始化好的组对象;用set req.backend_hint = 组对象中的backend();表示把为能命中的用户请求发送到该组上,至于用轮询还是加权轮询还是hash,取决于我们初始化组对象用到的方法;
了解了varnish代理多台主机的配置后,接下来我们再来说说varnish对后端主机做健康状态监测的配置;对于varnish来讲,对后端主机做健康状态监测的原理是请求后端主机特定的资源,如果能够在指定的超时时长内正确响应我们就认为后端主机上健康状态的,如果不能正确的响应我们就认为该后端主机上不健康的;在varnish中对后端主机做健康状态监测需要用.probe 来引入一段上下文配置,明确的说明怎么对后端做健康状态监测(或者用probe关键字+名称来引入一段公有的健康状态监测机制,后端多台主机可以用.probe +名称引用);比如请求后端主机的那个url或者用.request来指定向后端主机发送的请求的报文;对后端主机的响应多少次我们认为是健康的,监测频度,超时时长等等信息;
示例:

提示:以上红框中的配置就表示对webserver1这台主机做健康状态监测;其中.window表示基于最近的多少次检查来判读其健康状态;.threshold表示最近.window中定义的检查次数至少有多少次是成功的,我们就认为后端主机上健康的;.interval表示检查的频度,多久检查一次;.timeout表示超长时长;综上所述,该配置就表示对webserver1这台主机做健康状态监测,如果每隔2秒,超时时长为1秒,请求该主机上的/index.html资源,在最近5次中有4次是成功的,我们就认为后端主机上健康的;
当然以上是对一台主机做健康状态检查的配置。如果是多台主机,监测的方式都是一样的,我们可以把对健康状态监测的配置单独用probe + 名称来定义监测机制;然后在个server中用.probe +名称来应用我们定义的健康状态监测的配置;
示例:

提示:以上配置就表示定义了一个健康状态监测的配置其名称为webserver_check,然后在个后端server的配置中用.probe来对webserver_check调用;意思就表示两台主机都用同样的监测配置;
当然除了以上对rul请求外,我们也可使用向后端主机发送指定一的请求报文的形式来定义健康状态监测机制;
示例:

提示:以上配置表示对于server1的健康状态监测是向server1发送特定的请求首部,如果每隔2秒超时时长为1秒,在5次请求中有4次是200的响应码,我们就认为该主机上健康的,否则不健康;对于server2主机的健康状态监测是通过项该主机上的特定资源/index.html发起请求,如果每个2秒超时1秒的情况下,5次请求中有4次都是200的响应码,我们就认为该主机上健康的,否则不健康;如果不指定.expected_response默认值就是200;
测试:编译加载default.vcl 看看我们配置的健康状态监测是否正确
[root@test_node1-centos7 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
200
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,3.10.0-693.el7.x86_64,x86_64,-sfile,-smalloc,-hcritbit
varnish-4.0.5 revision 07eff4c29 Type 'help' for command list.
Type 'quit' to close CLI session. varnish> vcl.load check_cfg default.vcl
200
VCL compiled. varnish> vcl.use check_cfg
200
VCL 'check_cfg' now active varnish>
提示:上面load过程没有保存,说明我们配置后端服务器健康状体检查的配置没有问题;接下来测试把后端主机服务宕机,在管理shell中使用backend.list查看对应主机是否会变为sick?

提示:通过上面的测试结果看,我们把后端主机192.168.0.10这台主机的httpd服务给停了,然后在看后端主机情况,立刻webserver1的状态就变为了sick,我们接着又把服务给启动起来,再看后端服务器状态,可看到当检查到第四次是正常的响应后,状态就变成health;说明我们配置后端主机健康状态监测是没有问题的;
WEB缓存系统之varnish代理以及健康状态检测配置的更多相关文章
- WEB缓存系统之varnish基础入门(一)
前文我们聊了下http协议里的缓存控制机制以及varnish架构组件介绍,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12620538.html:今天我们来聊 ...
- WEB缓存系统之varnish状态引擎
前文我们聊了下varnish的VCL配置以及语法特点,怎样去编译加载varnish的vcl配置,以及命令行管理工具varnishadm怎么去连接varnish管理接口进行管理varnish,回顾请参考 ...
- WEB缓存系统之varnish缓存项修剪
前文我们聊了下varnish的状态引擎和不同类型的变量对应该使用在那个状态引擎中,以及每个状态引擎的对应处理事务:回顾请参考https://www.cnblogs.com/qiuhom-1874/p/ ...
- 如何编写LVS对Real Server的健康状态检测脚本
简介:Linux 虚拟服务器(Linux Virtual Server. LVS),是一个由章文松开发的自由软件.利用KVS可以实现高可用的.可伸缩缩的Web, Mail, Cache和Medial等 ...
- Tengine笔记3:Nginx的反向代理和健康状态检查
通常代理服务器只用于处理内部网络对Intenet的请求,客户端必须通过代理服务器把本来要发送到Web服务器上的请求通过代理服务器分发给Web服务器,Web服务器响应时再通过代理服务器把响应发给客户端: ...
- WEB服务健康状态检测
#!/bin/sh #date:2015-12-07 #filename:check_web.sh #作者:lixingli #Email:1162572407@qq.com #version:v1. ...
- kubernetes之健康状态检测
1.说明 容器探针: kubelet 对容器执行的定期诊断 探针执行方式: LivenessProbe: 判断容器是否存活 running状态, 如果不健康kubelet就会杀掉pod,根据重启策略R ...
- 企业级缓存系统varnish应用
场景 随着公司业务快速发展,公司的电子商务平台已经聚集了很多的忠实粉丝,公司也拿到了投资,这时老板想通过一场类似双十一的活动,进行一场大的促销,届时会有非常多的粉丝访问网站,你的总监与市场部门开完会后 ...
- [转载]WEB缓存技术概述
[原文地址]http://www.hbjjrb.com/Jishu/ASP/201110/319372.html 引言 WWW是互联网上最受欢迎的应用之一,其快速增长造成网络拥塞和服务器超载,导致客户 ...
随机推荐
- MapReduce 简单数据统计
1. 准备数据源 摘录了一片散文,保存格式为utf-8 2. 准备环境 2.1 搭建伪分布式环境 https://www.cnblogs.com/cjq10029/p/12336446.html 上传 ...
- python学习基础之变量
变量名只能包含字母.数字和下划线.变量名可以字母或下划线打头,但不能以数字打 头,例如,可将变量命名为message_1,但不能将其命名为1_message. 变量名不能包含空格,但可使用下划线来分隔 ...
- 一文掌握Redis的三种集群方案
在开发测试环境中,我们一般搭建Redis的单实例来应对开发测试需求,但是在生产环境,如果对可用性.可靠性要求较高,则需要引入Redis的集群方案.虽然现在各大云平台有提供缓存服务可以直接使用,但了解一 ...
- 鸡汤 & 毒鸡汤
1.别低估任何人. 2.你没那么多观众,别那么累. 3.温和对人对事.不要随意发脾气,谁都不欠你的. 4.现在很痛苦,等过阵子回头看看,会发现其实那都不算事. 5.和对自己有恶意的人绝交.人有绝交,才 ...
- LeetCode#15 | Three Sum 三数之和
一.题目 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意:答案中不可以包含 ...
- vscode在执行 npm任务的时候,会先执行package的name@version 然后命令名 加 当前路径,问题是我的引入路径e是小写的,会导致调试错误,解决方案:没找到,先手书吧
vscode在执行 npm任务的时候,会先执行package的name@version 然后命令名 加 当前路径,问题是我的引入路径e是小写的,会导致调试错误,解决方案:没找到 Executing t ...
- MySQL 【教程二】
MySQL 创建数据表 创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 语法 以下为创建MySQL数据表的SQL通用语法: # CREATE TABLE table_name (c ...
- kafka使用指南
快速开始 本教程假设您刚刚开始,并且没有现有的Kafka或ZooKeeper数据.由于Kafka控制台脚本对于基于Unix和Windows的平台是不同的,因此在Windows平台上使用bin\wind ...
- Vulnhub 靶场 Dijnn WP
About djinn: 1 描述 难度级别:中等 Flag:user.txt和root.txt 说明:该计算机是VirtualBox以及VMWare兼容的.DHCP将自动分配IP.您将在登录屏幕上看 ...
- jsp(3,6,9) EL表达式及JSTL
1. jsp 1.1jsp是什么 全称: Java Server Pages,java服务器页面.和Servlet一样,是sun公司定义的一种动态网页开发技术. 特点:基于html模版,可以在h ...