Голосування за консенсусом в uptime-моніторингу - чому це має сенс
· 10 хв читання
Класичний multi-region моніторинг знижує кількість хибних негативів, але збільшує кількість хибних позитивів. Голосування за консенсусом розв'язує обидві проблеми. Освітній розбір патерну.
Слабке місце моніторингу з одного регіону
Моніторинг з одного регіону означає, що перевірочний вузол працює в одній точці. Якщо на маршруті між цією точкою і Вашим сервером виникає мережева проблема (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"), тож для зневадження у Вас є точний запис про те, як було ухвалене рішення.
Для self-hosting воркера в іншому регіоні адмінка містить генератор WireGuard-бандлу: він створює tar.gz з конфігурацією для нового воркер-вузла і додає його до worker_urls.
Висновок
Голосування за консенсусом не магічне рішення. Воно не дасть Вам нуль false positive і не врятує під час справжнього збою. Але це кращий компроміс, ніж single-region (багато false positive при мережевих аномаліях) або наївний multi-region (множення хибних спрацьовувань).
Спробуйте ePulz.io. 7-денна пробна версія, 3 монітори, без картки.
Схоже
Спробуйте ePulz.io безкоштовно - 7 днів без банківської картки.
Створити акаунт