Vissza a bloghoz

Konszenzusos szavazás az uptime monitorozásban - miért van értelme

· 10 perc olvasás

A klasszikus multi-region monitorozás csökkenti a false negative-okat, de növeli a false positive-okat. A konszenzusos szavazás mindkettőt megoldja. A minta oktatási célú elemzése.

Az egyrégiós monitorozás gyenge pontja

Az egyrégiós monitorozás azt jelenti, hogy a checkered egyetlen helyen fut. Ha hálózati probléma adódik az adott hely és a szerver közötti útvonalon (BGP flap, routing változás, ISP karbantartás), a monitor DOWN állapotot jelez, pedig a szerverrel minden rendben.

Ez egy false positive. Megkapja a riasztást, hajnali 3-kor felébred, kinyitja a laptopot, és azt látja, hogy az oldal működik.

A false positive-ok két okból fájnak:

  1. Alert fatigue. Ha olyan értesítéseket kap, amelyek hamisak, fokozatosan elkezdi figyelmen kívül hagyni őket. Még a valódiakat is.
  2. A monitorozás iránti bizalom elvesztése. A csapat abbahagyja a riasztásokra való reagálást, mert "valószínűleg megint csak a BGP".

A naiv multi-region egy problémát megold, a másikat súlyosbítja

Az általános megközelítés erre a multi-region monitorozás. A checker több helyről fut, és riasztás akkor lép életbe, amikor bármelyik DOWN állapotot jelez.

Ez javítja a valódi outage-ok észlelését - amikor a szerver tényleg elérhetetlen, nemcsak egy checker megy le, hanem több. Rendben.

De a false positive probléma rosszabb lesz. Egy checkerrel volt egy bizonyos hamis riasztási arány. Három checkerrel matematikailag valószínűbb, hogy legalább az egyik tévesen DOWN-ot fog jelezni. Több hamis riasztást kap, nem kevesebbet.

A konszenzusos szavazás mindkét oldalt megoldja

A konszenzusos szavazás másképp működik: az első DOWN jelnél nem indít riasztást. Először megkérdezi a többi régiót. Ha azok többsége is DOWN-ot jelez, valódi outage. Ha nem, hálózati anomália az egyik régióban.

Pseudokód:

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'

Példa forgatókönyv:

primary  -> DOWN  (egy checkernek BGP flap volt)
region_a -> UP    (a többi régió normálisan látja a szervert)
region_b -> UP

Eredmény: UP. Nincs riasztás. Bejegyzés a debug logba.

És ellenkezőleg, valódi outage:

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

Eredmény: DOWN. Riasztás megy Telegramon/emailen/webhookon keresztül.

Tradeoff: latencia

A konszenzusos szavazásnak van ára - DOWN jelzésnél hozzáad néhány másodperc latenciát a többi régió lekérdezésére. A legtöbb use case-nél (uptime monitorozás perces intervallummal) elhanyagolható. Extrém szigorú SLA-knál, ahol a detection time 30 másodperc alatti, kompromisszum lehet.

Mikor nincs értelme a multi-region

  • Belső API-k 192.168.x.x címeken. A hálózatán kívül senki sem éri el őket, így az internetről érkező multi-region értelmetlen. LAN-ra használjon pull-agent mintát - az ügynök az Ön hálózatában fut, és HTTPS-en keresztül küldi az eredményeket.
  • Egy ügyfél belső alkalmazása. Ha csak néhány ember használja és Ön is köztük van, az outage-ról előbb fog tudni, mint a monitorozás.
  • Olyan szolgáltatás, amely a világ egyetlen régiójában fut. Ha a szolgáltatás csak EU-ban érhető el, és az USA-ból DOWN-ot lát, az nem false positive - az várt viselkedés.

Hogyan csináljuk ePulz.io-ban

Az ePulz.io architektúrájában szerepel a konszenzusos szavazás. A gather_multiregion() és combine_consensus() a monitoring.py-ban implementálja a fenti mintát. A küszöbérték (hány régiónak kell megerősítenie a DOWN-ot) a min_down paraméterrel konfigurálható.

A Check táblában minden sor tárolja a consensus mezőt CSV-vel (pl. "primary:up,region_a:up,region_b:down"), így debug céljára pontos rekordja van arról, hogyan született a döntés.

Self-hosting workerhez egy másik régióban az admin panelben van WireGuard bundle generátor - létrehoz egy tar.gz-t a konfigurációval egy új worker node-hoz, és hozzáadja a worker_urls-hoz.

Konklúzió

A konszenzusos szavazás nem varázsmegoldás. Nem fog nulla false positive-ot adni, és nem fogja megmenteni valódi outage során. De jobb kompromisszum, mint az egyrégiós (magas false positive arány hálózati anomáliák során) vagy a naiv multi-region (a false positive-ok szorzódása).

Nézze meg az ePulz.io szolgáltatást. 7 napos próbaidőszak, 3 monitor, bankkártya nélkül.

Kapcsolódó


Próbálja ki az ePulz.io-t ingyen - 7 nap bankkártya nélkül.

Fiók létrehozása