Powrót do bloga

Consensus voting w monitoringu uptime - dlaczego ma sens

· 10 min czytania

Klasyczny monitoring multi-region obniża false negatives, ale podnosi false positives. Consensus voting rozwiązuje oba. Edukacyjna analiza wzorca.

Consensus voting w monitoringu uptime - dlaczego ma sens

Słaba strona monitoringu single-region

Single-region monitoring oznacza, że twój checker działa w jednej lokalizacji. Jeśli między tą lokalizacją a twoim serwerem wystąpi problem sieciowy (BGP flap, routing change, prace serwisowe ISP), monitor zgłosi DOWN, mimo że serwer jest sprawny.

To false positive. Dostajesz alert, budzisz się o trzeciej w nocy, otwierasz laptopa i okazuje się, że strona działa.

False positives szkodzą z dwóch powodów:

  1. Alert fatigue. Jeśli otrzymujesz powiadomienia, które okazują się nieprawdziwe, stopniowo zaczynasz je ignorować. Także te prawdziwe.
  2. Utrata zaufania do monitoringu. Zespół przestaje reagować na alerty, bo "to znowu pewnie tylko BGP".

Naiwny multi-region rozwiązuje jeden problem, pogarsza drugi

Powszechnym sposobem rozwiązania tego problemu jest multi-region monitoring. Checker działa z kilku lokalizacji, a alert wysyłany jest za każdym razem, gdy którakolwiek z nich zgłosi DOWN.

Tym samym poprawia się detekcja rzeczywistych awarii: gdy serwer jest naprawdę niedostępny, gaśnie nie jeden checker, ale od razu kilka. To w porządku.

Problem z false positives jednak się pogłębia. Przy jednym checkerze miałeś pewien wskaźnik fałszywych alertów. Przy trzech checkerach jest matematycznie bardziej prawdopodobne, że co najmniej jeden z nich fałszywie zgłosi DOWN. W efekcie dostajesz więcej fałszywych alertów, a nie mniej.

Consensus voting rozwiązuje obie strony problemu

Consensus voting działa inaczej: przy pierwszym sygnale DOWN alert nie jest wysyłany. Najpierw system pyta pozostałe regiony. Jeśli większość z nich także zgłasza DOWN, to rzeczywista awaria. Jeśli nie, to tylko anomalia sieciowa w jednym regionie.

Pseudokod:

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'

Przykład sytuacji:

primary  → DOWN  (jeden checker miał BGP flap)
region_a → UP    (pozostałe regiony widzą serwer normalnie)
region_b → UP

Wynik: UP. Brak alertu. Wpis w debug logu.

I odwrotnie przy rzeczywistej awarii:

primary  → DOWN
region_a → DOWN
region_b → DOWN

Wynik: DOWN. Alert idzie przez Telegram/email/webhook.

Tradeoff: latencja

Consensus voting ma swoją cenę: przy sygnale DOWN dodaje kilka dodatkowych sekund latencji, zanim zdąży odpytać pozostałe regiony. Dla większości use-case'ów (uptime monitoring z minutowym interwałem) jest to pomijalne. Dla niezwykle rygorystycznych SLA z detection time poniżej 30 sekund może to już być odczuwalny kompromis.

Kiedy multi-region nie ma sensu

  • Wewnętrzne API na 192.168.x.x. Nikt poza twoją siecią się tam nie dostanie, więc multi-region z internetu nie ma sensu. Dla LAN użyj pull-agent pattern: agent działa w twojej sieci i wysyła wyniki na zewnątrz przez HTTPS.
  • Single-customer aplikacja wewnętrzna. Jeśli używa jej kilka osób, a ty jesteś jedną z nich, dowiesz się o awarii wcześniej niż monitoring.
  • Usługa działająca tylko w jednym regionie świata. Jeśli twoja usługa jest dostępna tylko w UE i widzisz ją z US jako DOWN, to nie jest false positive, lecz oczekiwany stan.

Jak to mamy w ePulz.io

ePulz.io ma consensus voting w architekturze. gather_multiregion() i combine_consensus() w monitoring.py implementują opisany powyżej wzorzec. Threshold (ile regionów musi potwierdzić DOWN) jest konfigurowalny przez parametr min_down.

W tabeli Check dla każdego checku zapisywane jest pole consensus z CSV (np. "primary:up,region_a:up,region_b:down"), więc przy debugu masz dokładny zapis, jak została podjęta decyzja.

Podsumowanie

Consensus voting nie jest magicznym rozwiązaniem. Nie da ci zero false positives i nie uratuje cię przy rzeczywistej awarii. Ale to lepszy kompromis niż single-region (wysokie false positives przy anomaliach sieciowych) lub naiwny multi-region (mnożenie false positives).

Zerknij na ePulz.io. 7-dniowy okres próbny, 3 monitory, bez karty.

Powiązane

Udostępnij: Skopiowano link

Wypróbuj ePulz.io za darmo - 7 dni bez karty kredytowej.

Utwórz konto