Голосование по консенсусу в uptime-мониторинге - почему это имеет смысл
· 10 мин чтения
Классический мульти-регион снижает false negatives, но повышает false positives. Consensus voting решает оба. Образовательный разбор паттерна.
Слабое место мониторинга из одного региона
Мониторинг из одного региона означает, что проверочный узел работает в одной точке. Если на маршруте между этой точкой и Вашим сервером возникает сетевая проблема (BGP flap, изменение маршрутизации, плановые работы у провайдера), монитор сообщает о DOWN, хотя сервер в порядке.
Это false positive. Вы получаете оповещение, просыпаетесь в 3 часа ночи, открываете ноутбук - и обнаруживаете, что сайт работает.
Ложные срабатывания вредны по двум причинам:
- Усталость от оповещений. Если Вы регулярно получаете уведомления, которые оказываются неверными, Вы постепенно начинаете их игнорировать. Даже настоящие.
- Потеря доверия к мониторингу. Команда перестаёт реагировать на алерты, потому что "наверное, опять 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 дней без банковской карты.
Создать аккаунт