Что такое Health Checks в облаке и почему без них failover не работает

Валерий Волков

Время прочтения 10 минут

Health checks — это проверки, по которым облачная система решает, жив backend или уже нет. Они нужны не для формальности, а для очень практичной задачи: понять, можно ли по-прежнему отправлять трафик на этот узел, держать его в пуле или пора переключаться на резерв. В балансировщиках, DNS failover и механизмах автоисцеления именно такие проверки становятся сигналом для следующего действия.

Именно поэтому failover без них по сути не работает нормально.

Если система не умеет отличать живой сервис от зависшего, частично сломанного или просто недоступного backend-а, она будет либо слишком долго слать трафик в мёртвую точку, либо вообще не поймёт, когда нужно переключаться.

Ниже — коротко, зачем такие проверки вообще нужны:

Без проверокС проверками
Система не понимает, жив сервис или нетЕсть сигнал, что узел пора убрать из трафика
Failover срабатывает поздно или не срабатывает вовсеПереключение может начаться автоматически
Трафик продолжает идти в сломанный backendНерабочий узел исключается из пула
Остаётся только надеяться на ручную реакциюПоявляется основа для автоматического решения

Но здесь есть важная тонкость: “сервер отвечает” и “сервис действительно готов принимать запросы” — не одно и то же.

Проверка может идти на разных уровнях. Она может смотреть:

  • Отвечает ли вообще сеть;
  • Открыт ли нужный порт;
  • Возвращает ли приложение корректный ответ.

Это важно, потому что не любая проверка реально показывает состояние сервиса.

Например, сервер может отвечать по сети, порт может быть открыт, но само приложение уже не работает как нужно. Для системы такой узел всё ещё выглядит “живым”, хотя пользователи уже получают ошибки.

Поэтому без нормальных health checks failover работает плохо.

Система либо слишком долго считает сломанный узел рабочим, либо вообще не понимает, что трафик пора переключать на резерв.

Как система понимает, жив сервис или нет

В предыдущим разделе мы коротко разобрали главное: зачем нужны health checks и почему без них failover работает плохо. Теперь можно перейти к самой механике — понять, как именно такие проверки устроены и что они на самом деле оценивают.

Проверка нужна для очень простой вещи: понять, можно ли и дальше считать backend рабочим.

Если ответ положительный, узел остаётся в пуле и продолжает получать трафик. Если нет — его исключают из балансировки, используют резерв или запускают другой механизм восстановления. Route 53 использует health checks для DNS failover, а Azure Load Balancer и Google Cloud Load Balancing — чтобы направлять трафик только на здоровые экземпляры.

Но здесь важно не только наличие проверки, а и то, что именно она проверяет.

Потому что “узел доступен” и “сервис реально работает” — это разные вещи.

Что именно проверяется: сеть, порт или само приложение

Проверки могут смотреть на разные уровни.

Иногда система проверяет только то, что сервер вообще доступен по сети. Иногда — что на нём открыт нужный порт. А в более полезном варианте — что само приложение действительно возвращает корректный ответ. Azure Load Balancer использует TCP, HTTP и HTTPS-пробы, а у Google Cloud health checks тоже строятся вокруг того, как backend отвечает на проверочный запрос.

Ниже разница видна проще:

Уровень проверкиЧто показываетЧего не гарантирует
СетьСервер вообще доступенЧто приложение на нём реально работает
ПортНужный порт открыт и принимает соединениеЧто сервис не завис и отвечает корректно
ПриложениеBackend возвращает ожидаемый ответЧто все внутренние зависимости тоже в порядке

Из этой таблицы видно главное: чем поверхностнее проверка, тем выше шанс, что система сочтёт узел рабочим слишком рано.

Сервер может отвечать по сети, TCP-порт может быть открыт, но само приложение уже сломано, зависло или отдаёт ошибки. Для грубой проверки такой backend всё ещё выглядит “живым”, хотя для пользователя сервис уже не работает нормально.

Поэтому хорошая проверка — это не просто “какой-то сигнал”, а сигнал с того уровня, который действительно показывает состояние сервиса.

Именно отсюда уже легко перейти к следующей мысли: если система не понимает, что backend сломан по-настоящему, failover будет либо запаздывать, либо принимать неверное решение.

Почему без health checks failover не работает нормально

Failover сам по себе не умеет “чувствовать”, что сервис сломан.

Ему нужен внешний сигнал: этот backend ещё можно использовать или уже нет. Именно таким сигналом и становятся health checks.

Если такой проверки нет, система действует почти вслепую.

Она не знает, что один узел уже завис, что приложение перестало нормально отвечать или что backend формально доступен, но фактически бесполезен для пользователей. В итоге трафик может продолжать идти туда, где сервис уже не работает.

Что происходит, когда система не понимает, жив сервис или нет

Самый простой сценарий — сломанный узел остаётся в пуле слишком долго.

Балансировщик или DNS-механизм продолжают считать его рабочим просто потому, что не получили сигнал об обратном. Для клиента это выглядит как случайные ошибки, рост задержек или “плавающие” отказы: один запрос попал на живой backend, другой — на уже сломанный.

Бывает и обратная проблема — переключение вообще не запускается вовремя.

Если failover должен перевести трафик на резерв, системе нужно сначала понять, что основной backend действительно unhealthy. Без этого момента “решения” никакого автоматического переключения не происходит. Route 53 прямо использует health checks как основу для DNS failover, а в Application Load Balancer апстрим начинает получать запросы только после того, как проходит initial health checks.

Ниже — коротко, как это выглядит на практике:

Без сигнала о состоянииЧто получает система
Backend сломан, но этого никто не заметилТрафик продолжает идти в нерабочую точку
Резерв есть, но момент сбоя не зафиксированFailover не срабатывает вовремя
Узел отвечает нестабильноПользователи получают случайные ошибки
Проверка отсутствует или слишком слабаяПереключение работает вслепую

Из таблицы видно главное: failover — это не магия переключения, а реакция на конкретный признак сбоя.

Если признак некачественный или его нет вообще, система либо запаздывает, либо принимает неверное решение. Именно поэтому health checks — это не дополнительная опция рядом с failover, а его базовый входной сигнал.

Где такие проверки особенно важны на практике

Не в каждой облачной функции такие проверки играют одинаковую роль.

Но есть несколько сценариев, где без них система буквально не понимает, что делать дальше. Именно там они становятся не вспомогательной опцией, а частью самой логики управления трафиком, резервом и восстановлением.

Балансировка и переключение трафика

Самый очевидный пример — load balancer.

Балансировщик конечно может распределять трафик вслепую, но решени крайне сомнительно. Для стабильной работы ему нужно понимать, какие backend-ы ещё можно считать рабочими, а какие уже пора убрать из пула. 

Вторая типовая зона — DNS failover.

Если система должна перевести трафик на резервный адрес или площадку, ей нужен сигнал, что основной ресурс уже нельзя считать здоровым. 

Ниже это можно свести к простой таблице:

СценарийЗачем нужна проверка
Load balancerУбрать нерабочий backend из трафика
DNS failoverПонять, когда пора переводить запросы на резерв

Из этого видно главное: и балансировщик, и failover-механизм должны сначала получить сигнал о проблеме, а уже потом менять маршрут трафика.

Восстановление и резервные схемы

Ещё заметнее роль таких проверок в тех случаях, где система должна не только убрать узел из трафика, но и что-то сделать дальше.

Первый пример — autohealing.

Если managed instance group, scale set или другая автоматизированная группа серверов должна пересоздавать или "лечить" экземпляр, системе нужно сначала понять, что он действительно перестал нормально работать. Без этого автоматическое восстановление либо не стартует вовремя, либо начинает реагировать наугад. 

Второй пример — active-passive-схемы.

Сам по себе резерв ещё ничего не решает. Нужно определить момент, когда основной узел уже нельзя считать рабочим и пора передавать трафик или роль запасному. Без проверки состояния active-passive быстро превращается в ручную схему, где кто-то должен заметить сбой и сам инициировать переключение. 

Если упростить, логика здесь такая:

  • Проверка фиксирует, что основной узел больше не в порядке;
  • Система понимает, что держать его в работе уже нельзя;
  • После этого запускается восстановление, пересоздание или переключение на резерв.

Именно поэтому резерв, балансировка и автоматическое восстановление сами по себе ещё не делают систему умной.

Они начинают работать как надо только тогда, когда у них есть достаточно надёжный сигнал о состоянии сервиса.

Но тут появляется следующая проблема: даже если проверка есть, она всё равно может смотреть слишком поверхностно. И тогда система увидит “живой” узел там, где приложение уже фактически сломано. Именно поэтому дальше важно разобрать отдельный вопрос: почему отвечающий сервер — это ещё не обязательно здоровый сервис.

Почему формально живой сервер может быть проблемой

На бумаге всё звучит просто: если сервер отвечает, значит он жив. Если жив — можно оставлять его в пуле.

Но на практике этого часто недостаточно.

Сервер может быть доступен по сети. Порт может быть открыт. Приложение может даже отдавать HTTP 200 на тестовый запрос. И всё равно в реальной работе сервис уже может быть сломан. 

Проблема обычно выглядит так: проверка говорит системе “узел жив”, а пользователь уже получает ошибки, зависания или пустые ответы.

Такое бывает, например, когда:

  • Веб-сервер ещё отвечает, но приложение за ним уже зависло;
  • HTTP-эндпоинт жив, но база данных недоступна;
  • Порт открыт, но backend не справляется с реальной нагрузкой;
  • Сервис формально стартовал, но ещё не готов обслуживать нормальные запросы.

Из-за этого failover может запаздывать.

Система продолжает считать backend рабочим не потому, что он действительно здоров, а потому что сама проверка оказалась слишком поверхностной. В результате трафик дольше идёт туда, куда уже не должен идти.

Именно поэтому полезная проверка должна показывать не просто “что-то отвечает”, а что сервис действительно находится в рабочем состоянии.

Как сделать проверку полезной для failover

Хорошая проверка должна быть не только точной, но и спокойной.

Если она слишком грубая, система слишком долго не замечает проблему. Если слишком чувствительная — начинает паниковать из-за кратких сбоев и даёт ложные переключения. 

Поэтому обычно важно держать в голове четыре вещи:

  • Что именно вы проверяете — сеть, порт или само приложение;
  • Как часто идёт проверка — слишком редко плохо, слишком часто тоже может мешать;
  • Сколько ошибок подряд считается проблемой — одна неудача не всегда значит реальный сбой;
  • Как backend возвращается в работу — не стоит считать его здоровым слишком рано.

На практике полезная проверка обычно отвечает на один простой вопрос:
можно ли прямо сейчас безопасно отправлять пользовательский трафик на этот backend.

Если ответ на этот вопрос сформулирован слишком поверхностно, failover будет слепым. Если слишком агрессивно — нервным.

Поэтому нормальная схема обычно строится так: сначала выбирают проверку, которая действительно отражает состояние сервиса, а потом уже аккуратно настраивают интервалы, таймауты и пороги, чтобы система не запаздывала, но и не дёргалась без причины.

Заключение

Подводя итоги, хочется сказать, что health checks нужны не для красоты схемы и не для галочки в настройках балансировщика.

Они нужны для того, чтобы система вовремя и правильно поняла, что backend уже нельзя считать рабочим. Без этого failover, балансировка и автоисцеление начинают работать либо слишком поздно, либо слишком грубо, либо вообще вслепую.

Из всей темы полезно вынести несколько практических выводов.

Во-первых, не стоит ограничиваться самой поверхностной проверкой, если от неё зависит реальное переключение трафика. Открытый порт ещё не означает, что приложение действительно готово обслуживать пользователей.

Во-вторых, проверка должна отвечать не на абстрактный вопрос “жив ли сервер”, а на более полезный: можно ли прямо сейчас безопасно отправлять на этот узел реальный трафик.

В-третьих, failover лучше тестировать заранее, а не доверять ему на словах. Если команда ни разу не проверяла, как система ведёт себя при сбое backend-а, то в проде легко выясняется, что проверка слишком медленная, слишком поверхностная или вообще смотрит не туда.

Если свести всё к коротким советам, получается так:

  • Проверяйте не только доступность узла, но и базовую работоспособность приложения;
  • Не делайте проверку слишком “нервной”, чтобы короткий сбой не вызывал ложное переключение;
  • Не делайте её слишком слепой, чтобы сломанный backend не оставался в пуле слишком долго;
  • Отдельно проверяйте, как узел выходит из нерабочего состояния и когда его можно возвращать в трафик;
  • Периодически устраивайте тестовый сбой и смотрите, как реально отрабатывает переключение.

Без нормальной проверки состояния failover не становится автоматикой — он остаётся просто идеей, которая может красиво выглядеть на схеме и плохо сработать в реальной аварии.

FAQ

Health checks и monitoring — это одно и то же?

Нет. Monitoring помогает заметить проблему и анализировать состояние системы, а health checks нужны для оперативного решения: оставлять backend в работе, убирать его из пула или переключать трафик на резерв.

Достаточно ли просто проверять, что порт открыт?

Не всегда. Открытый TCP-порт показывает только то, что соединение можно установить, но не гарантирует, что приложение реально готово обслуживать запросы. Поэтому для failover часто полезнее проверять уже ответ самого сервиса, а не только сетевую доступность.

Могут ли слишком чувствительные проверки сами ломать систему?

Да. Если интервалы, таймауты и пороги настроены слишком агрессивно, система может начать считать backend сломанным из-за коротких просадок и запускать ложные переключения. Именно поэтому облачные проверки завязаны не на одну случайную ошибку, а на последовательность результатов и заданные пороги.

Нужны ли такие проверки, если у меня уже есть резервный сервер?

Да. Сам резерв ничего не даёт, пока система не понимает, когда основной узел уже нельзя считать рабочим. В active-passive и DNS failover логика переключения как раз и держится на том, что состояние ресурса кто-то регулярно проверяет.

Проверка HTTP 200 уже решает проблему?

Не всегда. HTTP 200 лучше, чем просто открытый порт, но и такой ответ может быть слишком поверхностным, если endpoint не отражает реальное состояние приложения и его зависимостей. Поэтому полезный health endpoint обычно должен показывать, готов ли сервис принимать нормальный трафик, а не просто “жив ли процесс”.

Где такие проверки особенно критичны?

Чаще всего — в балансировщиках, DNS failover, autohealing и active-passive-схемах. Там они становятся не дополнительной опцией, а входным сигналом для маршрутизации, пересоздания инстанса или переключения на резерв. 

Список источников

1. AWS Route 53 — Creating Amazon Route 53 health checks / DNS failover

2. Microsoft Learn — Azure Load Balancer health probes

3. Google Cloud — Health checks overview | Cloud Load Balancing

4. Google Cloud — Use health checks

5. Microsoft Learn — Standard load balancer diagnostics

Подпишитесь на нашу рассылку и получайте статьи и новости

    Ознакомьтесь с другими нашими материалами

    • Что такое Health Checks в облаке и почему без них failover не работает

      Health checks — это проверки, по которым облачная система решает, жив backend или уже нет. Они нужны не для формальности, а для очень практичной задачи: понять, можно ли по-прежнему...

    • Что такое Spot Instances / Preemptible VM и для каких задач они подходят

      Spot Instances и Preemptible VM — это прерываемые виртуальные машины, которые облачные провайдеры отдают со скидкой из свободной вычислительной ёмкости. Смысл простой: вычисления...

    • Что такое Cloud-Init и как автоматизировать запуск облачных серверов

      Cloud-init — это механизм первичной настройки облачной виртуальной машины при первом запуске. Он закрывает разрыв между моментом, когда VM уже создана, и моментом, когда сервер...