Настройка Keepalived (VRRP) для отказоустойчивости сервисов

Отказ одного узла не должен останавливать сервис, от которого зависят клиенты. Мы настраиваем Keepalived под ключ: проектируем схему, проверяем переключение под нагрузкой и передаём регламенты вашей команде. Сокращаем простои при отказе до секунд.
Часто задаваемые вопросы

Keepalived: почему отказ одного узла роняет сервис

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

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

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

Разбираем, как это закрывается. Keepalived держит плавающий адрес на паре узлов по протоколу VRRP, проверяет их состояние скриптами и переводит трафик без участия человека — с предсказуемым временем переключения и без ночных ручных правок.

Что даёт отказоустойчивость: измеримый эффект

Эффект отказоустойчивости измеряется тремя величинами: сколько сервис недоступен при отказе узла, какая доля инцидентов вообще доходит до пользователя и можно ли обслуживать серверы, не останавливая работу.

Автоматическое переключение вместо ручного вмешательства

Раньше упавший узел замечал дежурный — по уведомлению мониторинга, иногда по жалобе. Пока он подключался и переносил адрес руками, сервис лежал десятки минут, и каждая минута простоя приходилась на рабочее время. Переключение выполняет Keepalived: резервный узел забирает адрес за секунды, без человека в контуре. Время восстановления сервиса сжимается с десятков минут до 1-3 секунд, а дежурный узнаёт о событии из журнала, когда сервис уже принимает трафик.

Класс отказов «узел недоступен» уходит из статистики

Пока один узел перезагружается или ремонтируется, второй держит трафик — отказ оборудования перестаёт быть отказом сервиса. Важно, чем проверяется живость: отклик на сетевом уровне подтверждает, что машина включена, но не что приложение отвечает. Проверка запросом к приложению отсеивает узлы, формально живые, но отдающие ошибки. Полный отказ сервиса тогда требует одновременного падения всех узлов, то есть общей причины — сети, питания или неудачного релиза. Доступность сервиса растёт не «в среднем», а за счёт исчезновения целого класса инцидентов.

Плановые работы без простоя

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

Режимы работы Keepalived: сравнение вариантов

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

Режим Когда подходит Ограничения
Активный и резервный узел Один сервис, простой разбор инцидентов, простой резерва допустим Резервный узел простаивает; после восстановления основного адрес вернётся к нему только при разрешённом возврате владения
Равноправные узлы с разными приоритетами Пара серверов, где важно быстро вернуть адрес на штатный узел Приоритет задаётся статически — при добавлении третьего узла схему пересчитывают вручную
Разделение виртуальных адресов по узлам Несколько сервисов, нужно задействовать оба сервера Каждый узел становится основным для своей группы адресов: конфигураций и проверок доступности вдвое больше

В любом режиме работоспособность узла определяет не только обмен служебными пакетами, но и проверка доступности приложения. Скрипт-проверка снижает приоритет узла, если сервис не отвечает, — виртуальный адрес уходит на живой сервер. Без неё Keepalived продолжает держать адрес там, где процесс уже упал, и переключения не происходит.

Этапы внедрения отказоустойчивого кластера

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

  1. Аудит инфраструктуры — собираем карту узлов, сетевых сегментов и сервисов, отмечаем единые точки отказа и связи, которые переживут перенос виртуального адреса, а какие нет.
  2. Схема резервирования — определяем пары узлов и роли, распределяем приоритеты в Keepalived, выбираем режим возврата роли и интервалы объявлений VRRP, чтобы переключение не срабатывало на коротких сетевых всплесках.
  3. Настройка и проверки доступности — пишем конфигурацию и скрипты, которые оценивают состояние самого сервиса, а не только живость хоста: иначе узел с упавшим приложением продолжит удерживать виртуальный адрес.
  4. Проверка переключения на стенде — воспроизводим отказы: остановка демона, разрыв линка, перезагрузка узла, зависание сервиса. Замеряем время, за которое резерв принимает адрес, и убеждаемся, что сессии и очереди не теряются.
  5. Вывод в боевой контур — включаем по одному сегменту с окном наблюдения, держим прежний вариант конфигурации для быстрого отката и отслеживаем состояние таблиц соседних устройств.
  6. Передача регламентов — отдаём схему адресации, конфигурации, сценарии ручного переключения и порядок действий дежурного при разделении узлов, чтобы команда эксплуатации управляла кластером без нас.

Конфигурации, схемы и регламенты переключения

Инженерная часть услуги заканчивается не запуском сервиса, а пакетом документов, по которому кластером можно управлять без нас. Мы передаём заказчику конфигурации Keepalived, схему сети и регламенты — так дежурная смена понимает, что происходит, а новый инженер входит в проект за часы, а не за недели.

  • Конфигурация кластера: файлы обеих нод с ролями «основная/резервная», идентификатором виртуального маршрутизатора, приоритетами и интервалами объявления — с комментариями, почему выставлено именно так.
  • Схема сети: адреса узлов и виртуального адреса, подсети, имена интерфейсов, точки отказа и таблица приоритетов — на одном листе, а не собранная по кускам.
  • Проверки живости сервиса: скрипты, параметры запуска, пороги срабатывания и поведение при деградации узла и при его полном отказе.
  • Регламент переключения: штатный сценарий, аварийный, ручное переключение и возврат роли обратно — с указанием, кто принимает решение.
  • Инструкция для дежурного: пошаговые действия при потере виртуального адреса, снятие состояния, сбор логов и критерии, когда звать нас.
  • Настройка мониторинга: метрики состояния узлов, оповещения на смену роли и внешняя проверка доступности сервиса — чтобы отказ видели до звонка пользователей.
  • Протокол приёмочных испытаний: сценарии отказов, которые мы воспроизвели, и время восстановления по каждому — как доказательство, что переключение работает.

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

Кейс: переключение без потери трафика на боевом контуре

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

Точка отсчёта: замеры до внедрения

Сначала мы зафиксировали исходное состояние — разобрали статистику инцидентов и воспроизвели отказ на стенде с боевыми настройками. Замеряли три величины: время переключения, долю потерянных соединений и число ручных вмешательств. Стенд дал те же цифры, что и боевой контур: 8–14 минут на переключение, до 6% оборванных соединений, 4–6 ночных вызовов инженера в месяц.

Что изменили и что получили

На оба узла поставили Keepalived в режиме VRRP: виртуальный адрес закреплён за активным узлом, резервный отслеживает сигналы и забирает адрес при их пропаже. Приоритеты выставили так, чтобы возврат после восстановления был управляемым — без «дёрганья» трафика туда-обратно. Отдельно добавили проверку здоровья приложения: если сервис жив, но не отвечает, адрес переезжает, не дожидаясь отказа железа.

На приёмочных испытаниях переключение уложилось в 1–2 секунды, доля потерянных соединений упала до долей процента, ручные вмешательства в смене исчезли. На боевом контуре сначала прогнали отказ каждого узла по отдельности, затем — отказ обоих с возвратом в строй.

Чем Keepalived отличается от кластерного менеджера

Keepalived — это демон протокола VRRP: он держит виртуальный адрес на активном узле и переносит его на резервный, когда основной перестал отвечать. Проверки доступности настраиваются под конкретный сервис — проверка TCP-порта, HTTP-ответ или наличие процесса. Пока проверка проходит, адрес остаётся на текущем узле; перестала проходить — адрес уходит резервному узлу, и клиенты продолжают работать по тому же адресу без правки конфигов.

Кластерный менеджер работает на другом уровне. Он управляет ресурсами: запускает и останавливает службы в заданном порядке, подключает общие диски, следит за кворумом и изолирует узел, потерявший связь с остальными. Резервирование адреса для него — лишь один из ресурсов, а не основная задача.

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

На практике их не противопоставляют. Демон VRRP отвечает за адрес и распределение трафика, кластерный менеджер — за ресурсы; связка даёт быстрый переход трафика и корректный порядок запуска служб после переключения.

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

Проверки доступности, задержки и разделение сети

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

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

Что происходит с уже открытыми соединениями при переключении?

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

Как гарантированно не получить два активных узла?

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

Как быстро узел возвращается в строй?

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

Обсудим задачу: внедрение Keepalived под ваш контур

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

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

После разбора присылаем:

  • схему контура с отмеченными точками отказа и местом, где встаёт Keepalived;
  • план внедрения по этапам, с окнами работ и порядком отката;
  • состав работ: настройка VRRP, проверки доступности сервисов, скрипты переключения;
  • перечень изменений в конфигурациях и того, что потребуется от вашей стороны;
  • сценарии проверки: как убедимся, что узел действительно перехватывает адрес;
  • роли и точки согласования на время работ;
  • оценку по этапам — трудоёмкость и зависимости, без привязки к календарным датам.

Опишите задачу в двух абзацах — вернёмся с оценкой и планом внедрения под ваш контур.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139