的背景
我们在 CF/Apache2 后端服务器前面运行 Varnish 缓存服务器。Varnish 盒每两秒运行一次健康检查探测,如下所示:
probe healthcheck {
.url = "/probe.cfm";
.timeout = 5s;
.interval = 2s;
.window = 10;
.threshold = 5;
.initial = 5;
.expected_response = 200;
}
backend web1 {
.host = "<backend ip>";
.port = "80";
.probe = healthcheck;
}
Probe.cfm 执行以下操作:
<cfoutput>
<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<title>CF Probe</title>
</head>
<body>
</cfoutput>
<cfquery name="qryProbe" datasource="#Request.DSN#">
SELECT TOP 1 [PageID] FROM [Page] WHERE [PageID] > 6
</cfquery>
<cfoutput>
#Variables.qryProbe.RecordCount#
</body>
</html>
</cfoutput>
此代码片段从底层数据库(映射到数据源)中选择一条记录,如果成功则返回 200。
稍后在 Varnish 配置中,有一个部分用于测试后端是否启动,如果没有启动,则将缓存的宽限期设置为 24 小时,并且对于任何不在缓存中的页面,它都应该生成一个合成维护页面。
子vcl_recv
如果 (req.backend.healthy) { 设置 req.grace = 30s; } else { 设置 req.grace = 24h; }
子vcl_错误
if (!req.backend.healthy && obj.status != 200 && obj.status != 403 && obj.status != 404 && obj.status != 301 && obj.status != 302) {
synthetic{"<some HTML here>"}
}
问题
我们最近遇到了一种情况,即 CF 实例严格来说不是没有反应但它没有提供页面。然而,根据 varnish 日志,后端仍然健康,因此 Varnish 也很快停止了提供内容。
此外,我看到至少有一个实例,当我们重新启动 CF 实例时,后端生成了错误 500,并且 Varnish 仍然报告它为健康,尽管日志中的健康测试行表明它从后端收到了 500。
问题
我如何才能更准确地测试 CF 后端的健康状态,以便 Varnish 能够正确响应中断/重启/等。
我想,此外,有人能看出我设置的后端健康 Varnish 测试和确定合成 HTML 是否被呈现的测试中存在任何明显的缺陷吗?
答案1
嗯,它的配置是这样的,需要 12 秒的连续错误(6 次检查,间隔 2 秒)才能将后端标记为不健康,因此在探测器收集到足够多的不良响应以将后端标记为关闭时,用户请求进入并提供不良内容的可能性肯定存在。
您可以根据需要调整探针的窗口/阈值设置,以缩短该时间范围,并考虑设置圣人模式作为一种立即处理不良响应的方式,而无需收集探测器上的故障或将这些不良响应发送给用户。