O plano de fundo
Estamos executando um servidor de cache Varnish na frente de um servidor de backend CF / Apache2. A caixa de verniz executa uma análise de verificação de integridade a cada dois segundos da seguinte maneira:
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;
}
O probe.cfm faz isso:
<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>
Este snippet seleciona um único registro do banco de dados subjacente (mapeado em fontes de dados) e retorna um 200 se for bem-sucedido.
Mais tarde, na configuração do Varnish, há uma seção que testa se o back-end está ativo e, caso contrário, define o período de tolerância do cache para 24 horas e, para as páginas que não estiverem no cache, deve gerar uma página de manutenção sintética.
sub vcl_recv
if (req.backend.healthy) {
set req.grace = 30s;
}
else {
set req.grace = 24h;
}
sub vcl_error
if (!req.backend.healthy && obj.status != 200 && obj.status != 403 && obj.status != 404 && obj.status != 301 && obj.status != 302) {
synthetic{"<some HTML here>"}
}
O problema
Recentemente, tivemos uma condição em que a instância de FC não era estritamente falando sem resposta , mas não estava veiculando páginas. De acordo com os logs de verniz, no entanto, o backend ainda estava saudável , de modo que o Varnish rapidamente parou de exibir conteúdo também.
Além disso, vi pelo menos uma instância em que o backend estava gerando erro 500s enquanto reiniciamos a instância de CF e o Varnish ainda relatava que era saudável, apesar da linha de teste de integridade no log dizer que recebeu 500 do backend.
A questão
Como posso testar com mais precisão o status de integridade do back-end de CF para que o Varnish responda corretamente a interrupções / reinicializações / etc.
Eu suponho, além disso, alguém pode ver quaisquer falhas gritantes nos testes de verniz para a integridade de back-end que eu configurei e os testes que determinam se o HTML sintético é processado ou não?