Фон
Мы запускаем кеш-сервер Varnish перед внутренним сервером CF / Apache2. Ящик для лака каждые две секунды выполняет проверку работоспособности следующим образом:
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;
}
Зонд.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 часа, а для любых страниц, не находящихся в кеше, он должен генерировать синтетическую страницу обслуживания.
sub vcl_recv
if (req.backend.healthy) {установить req.grace = 30s; } else {установить 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>"}
}
Эта проблема
У нас недавно было состояние, при котором экземпляр CF не строго говоря не отвечает но он не обслуживал страницы. Однако, судя по журналам лаков, серверная часть все еще была здоровый, поэтому Varnish тоже быстро перестал обслуживать контент.
Кроме того, я видел по крайней мере один случай, когда бэкэнд генерировал ошибку 500, пока мы перезапускали экземпляр CF, а Varnish по-прежнему сообщал о его работоспособности, несмотря на то, что в строке теста работоспособности в журнале говорилось, что он получил 500 от бэкэнда.
Вопрос
Как я могу более точно проверить состояние работоспособности бэкэнда CF, чтобы Varnish правильно реагировал на сбои / перезагрузки и т. Д.
Я полагаю, кроме того, может ли кто-нибудь увидеть какие-либо явные недостатки в тестах Varnish для проверки работоспособности серверной части, которые я настроил, и в тестах, которые определяют, отображается ли синтетический HTML или нет?
Что ж, он настроен таким образом, что требуется 12 секунд последовательных ошибок (6 проверок с интервалом 2 секунды), чтобы серверная часть была помечена как неисправная, поэтому, безусловно, существует вероятность того, что пользовательские запросы будут поступать и обслуживать плохой контент, пока зонд собирает достаточно плохих ответов, чтобы пометить бэкэнд.
Вы можете настроить окно / пороговые параметры вашего зонда по своему усмотрению, чтобы сократить этот период времени, и подумайте о настройке святой режим как способ немедленно обработать плохие ответы как таковые без необходимости собирать сбои при зондировании или отправлять эти плохие ответы пользователям.