MongoDB Academy · Oppitunti

Vaalit ja automaattinen vikasietoisuus

Oppijat simuloivat primary-jäsenen vikaantumisen ja tarkkailevat vaalialgoritmia, joka ylentää secondary-jäsenen ja pitää käyttökatkon alle 10 sekunnissa.

Oppitunti 2/413 vaihetta

Vaalit ja automaattinen vikasietoisuus on ilmainen MongoDB Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu MongoDB Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. MongoDB Academy-kurssilla on yhteensä 4 oppituntia.

Miksi automaattinen failover on tärkeä

Automaattinen failover tarkoittaa MongoDB:n replica setin kykyä palautua primary-solmun vikaantumisesta ilman ihmisen toimenpiteitä. Kun primary ei ole tavoitettavissa, jäljellä olevat jäsenet valitsevat automaattisesti uuden primaryn — yleensä 10–30 sekunnin kuluessa — joten sovellukset kokevat vain lyhyen tauon täyden käyttökatkon sijaan.

Heartbeatit: vikojen havaitseminen

Replica setin jäsenet vaihtavat jatkuvasti heartbeat-viestejä kahden sekunnin välein. Jos jäsen ei saa heartbeat-vastausta electionTimeoutMillis-ajan kuluessa (oletusarvo 10 sekuntia), se merkitsee hiljaisen jäsenen saavuttamattomaksi. Jos puuttuva jäsen on primary, jäljellä olevat kelvolliset jäsenet aloittavat vaalit.

// Check heartbeat interval and election timeout in replica set config
rs.conf().settings.heartbeatIntervalMillis   // 2000 ms
rs.conf().settings.electionTimeoutMillis     // 10000 ms

Vaalien käynnistyminen

Vaalit käynnistyvät kolmessa tilanteessa: 1) primary ei ole tavoitettavissa (verkon osio tai kaatuminen), 2) käyttäjä luopuu primaryn roolista manuaalisesti komennolla rs.stepDown() tai 3) korkeamman prioriteetin secondary liittyy joukkoon ja nykyisellä primarylla on pienempi prioriteetti. Vain jäsenet, joilla on votes: 1 ja priority > 0, voivat tulla uudeksi primaryksi.

// Manually step down the current primary (useful for maintenance)
rs.stepDown(60)  // yield primary for at least 60 seconds

Raft-protokollasta vaikutteita saanut konsensusprotokolla

MongoDB:n vaaleissa käytetään Raft-konsensukseen perustuvaa protokollaa. Kukin ehdokas kasvattaa term-laskuriaan ja pyytää ääniä muilta jäseniltä. Ehdokas voittaa, jos se saa äänet enemmistöltä äänestävistä jäsenistä. Ajantasaisimman oplogin omaava ehdokas (korkein optime) asetetaan etusijalle — tämä estää datan menetyksen varmistamalla, että uusi primary on nähnyt kaikki vahvistetut kirjoitukset.

// Inspect the term number and optime of all members
rs.status().members.forEach(m => {
  print(m.name, 'term:', m.configTerm, 'optime:', m.optimeDate)
})

Enemmistöäänien vaatimus

Ehdokas tarvitsee äänet yli puolelta kaikista äänestävistä jäsenistä, ei vain tällä hetkellä tavoitettavissa olevilta jäseniltä. Kolmen jäsenen setissä, jossa kaikilla on ääni, enemmistö on kaksi. Jos kaksi jäsentä kaatuu samanaikaisesti, jäljelle jäävä jäsen ei voi valita itseään — se käyttäisi vanhentunutta dataa eikä voisi tietää, ovatko kaksi muuta jäsentä tehneet uudempia kirjoituksia.

// With 3 members:
// majority = floor(3/2) + 1 = 2
// If only 1 member survives, it cannot elect itself
// The set becomes read-only until connectivity is restored

Vaaliprosessi vaihe vaiheelta

Vaalit etenevät seuraavasti: 1) Secondary huomaa primaryn poistuneen aikakatkaisun jälkeen. 2) Se siirtyy CANDIDATE-tilaan. 3) Se lähettää RequestVote-viestit kaikille muille jäsenille. 4) Jäsenet antavat äänensä, jos ehdokkaan oplog on vähintään yhtä ajantasainen kuin niiden oma ja ne eivät ole vielä äänestäneet. 5) Voittaja siirtyy PRIMARY-tilaan ja alkaa hyväksyä kirjoituksia.

Kirjoitusten estyminen vaalien aikana

Vaalien aikana (yleensä muutaman sekunnin ajan) kirjoitukset hylätään, koska primarya ei ole. MongoDB-driver puskuroi kirjoitusoperaatiot ja yrittää niitä uudelleen, kun uusi primary on valittu. Kun retryable writes on käytössä (nykyaikaisten drivereiden oletus), tilapäiset vaalivirheet yritetään automaattisesti uudelleen kerran.

// Retryable writes are enabled by default in the connection string
const client = new MongoClient(
  'mongodb+srv://host/db?retryWrites=true'
)

Prioriteetti ja vaalien etusija

Kun useat ehdokkaat ovat yhtä ajantasaisia, priority ratkaisee tasatilanteen — korkeimman prioriteetin jäsen voittaa. Jos korkeamman prioriteetin secondary liittyy uudelleen oltuaan poissa käytöstä, se käynnistää uudet vaalit ottaakseen primaryn roolin. Prioriteetin asettaminen arvoon 0 estää jäsentä pysyvästi tulemasta primaryksi.

// Boost priority on the preferred primary node
let cfg = rs.conf()
cfg.members[0].priority = 2   // preferred
cfg.members[1].priority = 1
cfg.members[2].priority = 1
rs.reconfig(cfg)

Verkon osioiden tilanteet

Verkon osituksessa toisella puolella olevat jäsenet eivät voi viestiä toisen puolen kanssa. Enemmistön äänistä saanut puoli voi valita primaryn, kun taas vähemmistöpuoli siirtyy vain luku -tilaan. Tämä estää split-brain-tilanteen, jossa kaksi jäsentä uskoo samanaikaisesti olevansa primary ja hyväksyy ristiriitaisia kirjoituksia.

Failover-tapahtumien valvonta

Voitte valvoa valintoja ja failover-tapahtumia tarkastelemalla MongoDB-lokia tai tekemällä kyselyn system.replset-konfiguraatioon. Atlas tarjoaa reaaliaikaiset hälytykset valintatapahtumista. Sovelluksen lokeissa näkyy valinnan aikana piikkejä virheissä MongoNotPrimaryError tai MongoNetworkError — uudelleen yritettävät kirjoitukset käsitellään automaattisesti.

// Check the number of elections in the current status
rs.status().electionHighestObservedTime
// Or watch change streams on 'admin.$cmd' for electionId changes

Failoverin nopeuttaminen: parhaat käytännöt

Voitte minimoida failoveriin kuluvan ajan seuraavasti: 1) Käyttäkää replikasarjoissa paritonta määrää jäseniä (3 tai 5), jotta arbitereita ei tarvita. 2) Käyttäkää majority write concern -asetusta varmistaaksenne, että valitulla secondaryllä ovat kaikki vahvistetut kirjoitukset. 3) Minimoikaa oplog-viive varaamalla oplogille riittävästi tilaa. 4) Sijoittakaa replikasarjan jäsenet samalle alueelle heartbeat-viestien pienen viiveen varmistamiseksi.

// Increase oplog size at runtime (requires 4.4+)
db.adminCommand({ replSetResizeOplog: 1, size: 16384 })
// size in MB — 16 GB is suitable for busy clusters

Pikatarkistus

Testatkaa, miten hyvin hallitsette tämän oppitunnin MongoDB:tä ja NoSQL-tietokantoja käsittelevät käsitteet.

Oppitunnin kertaus

Tässä oppitunnissa opitte, että heartbeat-viestit havaitsevat primaryn vikaantumisen electionTimeoutMillis-arvon (oletusarvoisesti 10 s) kuluessa, ajantasaisimman oplogin ja korkeimman prioriteetin omaava ehdokas voittaa valinnan ja uudelleen yritettävät kirjoitukset auttavat sovelluksia selviytymään lyhyistä valintaikkunoista läpinäkyvästi. Seuraavaksi tutustumme write concern -asetuksiin ja siihen, miten kirjoitusten kestävyys voidaan määrittää koko replikasarjassa.

Aloita maksutta

Opi JavaScript tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
30
Oppitunnit
120

Usein kysytyt kysymykset

Onko oppitunti ”Vaalit ja automaattinen vikasietoisuus” ilmainen?

Kyllä – oppitunnin ”Vaalit ja automaattinen vikasietoisuus” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko MongoDB Academy-kurssin, päivitä CoddyKit PROhon. MongoDB Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Vaalit ja automaattinen vikasietoisuus”?

Oppijat simuloivat primary-jäsenen vikaantumisen ja tarkkailevat vaalialgoritmia, joka ylentää secondary-jäsenen ja pitää käyttökatkon alle 10 sekunnissa. Harjoittelet MongoDB Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni MongoDB Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin MongoDB Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Vaalit ja automaattinen vikasietoisuus”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä MongoDB Academy-oppitunnilla?

Kyllä. Jokainen MongoDB Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Replikajoukon jäsenet: primary, secondary ja arbiter
  2. Vaalit ja automaattinen vikasietoisuus
  3. Write concern -asetukset ja vahvistettu kestävyys
  4. Read preference -asetukset: lukukuorman jakaminen
← Takaisin: MongoDB Academy