Назад в блог

Голосование по консенсусу в uptime-мониторинге - почему это имеет смысл

· 10 мин чтения

Классический мульти-регион снижает false negatives, но повышает false positives. Consensus voting решает оба. Образовательный разбор паттерна.

Голосование по консенсусу в uptime-мониторинге - почему это имеет смысл

Слабое место мониторинга из одного региона

Мониторинг из одного региона означает, что проверочный узел работает в одной точке. Если на маршруте между этой точкой и Вашим сервером возникает сетевая проблема (BGP flap, изменение маршрутизации, плановые работы у провайдера), монитор сообщает о DOWN, хотя сервер в порядке.

Это false positive. Вы получаете оповещение, просыпаетесь в 3 часа ночи, открываете ноутбук - и обнаруживаете, что сайт работает.

Ложные срабатывания вредны по двум причинам:

  1. Усталость от оповещений. Если Вы регулярно получаете уведомления, которые оказываются неверными, Вы постепенно начинаете их игнорировать. Даже настоящие.
  2. Потеря доверия к мониторингу. Команда перестаёт реагировать на алерты, потому что "наверное, опять BGP".

Наивный multi-region решает одну проблему и усугубляет другую

Распространённый способ решения - multi-region мониторинг. Проверочный узел работает из нескольких локаций, и алерт срабатывает, как только любая из них сообщает о DOWN.

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

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

Голосование по консенсусу решает обе стороны

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

Псевдокод:

result = check_http(monitor)  # primary region
if result.status == 'down':
    secondary_results = check_from_other_regions(monitor)
    if secondary_results:
        # Default rule: 2 of 3 regions must agree on DOWN
        if count_down(secondary_results) + 1 >= 2:
            result.status = 'down'
        else:
            result.status = 'up'
            result.note = 'consensus mismatch'

Пример сценария:

primary  -> DOWN  (один узел поймал BGP flap)
region_a -> UP    (другие регионы видят сервер нормально)
region_b -> UP

Result: UP. Без алерта. Запись в debug log.

И противоположный случай, настоящий сбой:

primary  -> DOWN
region_a -> DOWN
region_b -> DOWN

Result: DOWN. Алерт уходит через Telegram/email/webhook.

Компромисс: задержка

У голосования по консенсусу есть своя цена: при сигнале DOWN добавляется несколько лишних секунд задержки на опрос других регионов. Для большинства сценариев (uptime monitoring с минутным интервалом) это незаметно. Для крайне строгих SLA с временем обнаружения менее 30 секунд это уже может стать ощутимым компромиссом.

Когда multi-region не имеет смысла

  • Внутренние API на 192.168.x.x. Никто извне Вашей сети не может их достичь, поэтому multi-region из интернета бессмыслен. Для LAN используйте паттерн pull-agent: агент работает в Вашей сети и отправляет результаты через HTTPS.
  • Внутреннее приложение для одного клиента. Если им пользуется несколько человек, и Вы один из них, Вы узнаете о сбое раньше мониторинга.
  • Сервис, работающий только в одном регионе мира. Если Ваш сервис только для ЕС, и Вы видите его как DOWN из США, это не false positive, а ожидаемое поведение.

Как это сделано в ePulz.io

В архитектуре ePulz.io голосование по консенсусу реализовано встроенно. Функции gather_multiregion() и combine_consensus() в monitoring.py реализуют описанный выше паттерн. Порог (сколько регионов должны подтвердить DOWN) настраивается через параметр min_down.

В таблице Check каждая строка хранит поле consensus в формате CSV (например, "primary:up,region_a:up,region_b:down"), так что для отладки у Вас есть точная запись о том, как было принято решение.

Заключение

Голосование по консенсусу не волшебное решение. Оно не даст Вам ноль false positive и не спасёт при настоящем сбое. Но это лучший компромисс, чем single-region (много false positive при сетевых аномалиях) или наивный multi-region (умножение ложных срабатываний).

Попробуйте ePulz.io. 7-дневная пробная версия, 3 монитора, без карты.

Похожее

Поделиться: Ссылка скопирована

Попробуйте ePulz.io бесплатно - 7 дней без банковской карты.

Создать аккаунт