可靠地测试 ColdFusion 服务器健康状况

可靠地测试 ColdFusion 服务器健康状况

的背景

我们在 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 秒)才能将后端标记为不健康,因此在探测器收集到足够多的不良响应以将后端标记为关闭时,用户请求进入并提供不良内容的可能性肯定存在。

您可以根据需要调整探针的窗口/阈值设置,以缩短该时间范围,并考虑设置圣人模式作为一种立即处理不良响应的方式,而无需收集探测器上的故障或将这些不良响应发送给用户。

相关内容