
Рvi sÄ pÄ RabbitMQ clustering for feiltoleranse og hÞy tilgjengelighet. La oss nÄ grave dypt inn i Apache Kafka.
Her er replikasjonsenheten partisjonen. Hvert emne har en eller flere seksjoner. Hver seksjon har en leder med eller uten fÞlgere. NÄr du oppretter et emne, spesifiserer du antall partisjoner og replikeringskoeffisienten. Den vanlige verdien er 3, som betyr tre kopier: en leder og to fÞlgere.

Ris. 1. Fire seksjoner er fordelt pÄ tre meglere
Alle lese- og skriveforespÞrsler gÄr til lederen. FÞlgere sender med jevne mellomrom forespÞrsler til lederen om Ä motta de siste meldingene. Forbrukere henvender seg aldri til fÞlgere; sistnevnte eksisterer bare for redundans og feiltoleranse.

Partisjonsfeil
NÄr en megler svikter, svikter ofte lederne i flere seksjoner. I hver av dem blir en fÞlger fra en annen node leder. Faktisk er dette ikke alltid tilfelle, siden synkroniseringsfaktoren ogsÄ pÄvirker: om det er synkroniserte fÞlgere, og hvis ikke, om det er tillatt Ä bytte til en usynkronisert replika. Men la oss ikke komplisere ting forelÞpig.
Megler 3 forlater nettverket, og ny leder velges for seksjon 2 hos megler 2.

Ris. 2. Megler 3 dÞr og hans etterfÞlger pÄ megler 2 velges som ny leder av avdeling 2
Da slutter megler 1 og seksjon 1 mister ogsÄ sin leder, hvis rolle gÄr over til megler 2.

Ris. 3. Det er én megler igjen. Alle ledere er pÄ én megler med null redundans
NÄr megler 1 kommer tilbake pÄ nettet, legger den til fire fÞlgere, noe som gir litt redundans til hver partisjon. Men alle lederne forble fortsatt pÄ megler 2.

Ris. 4. Ledere forblir pÄ megler 2
NÄr megler 3 kommer opp, er vi tilbake til tre kopier per partisjon. Men alle lederne er fortsatt pÄ megler 2.

Ris. 5. Ubalansert plassering av ledere etter restaurering av megler 1 og 3
Kafka har et verktÞy for bedre lederrebalansering enn RabbitMQ. Der mÄtte du bruke en tredjeparts plugin eller skript som endret retningslinjene for migrering av masternoden ved Ä redusere redundans under migrering. I tillegg, for store kÞer mÄtte vi akseptere utilgjengelighet under synkronisering.
Kafka har konseptet "foretrukne replikaer" for lederrollen. NÄr emnepartisjoner opprettes, prÞver Kafka Ä fordele ledere jevnt pÄ tvers av noder og markerer de fÞrste lederne som foretrukne. Over tid, pÄ grunn av omstart av serveren, feil og tilkoblingsbrudd, kan ledere havne pÄ andre noder, som i det ekstreme tilfellet beskrevet ovenfor.
For Ă„ fikse dette tilbyr Kafka to alternativer:
- alternativ auto.leader.rebalance.enable=true lar kontrollernoden automatisk omfordele ledere tilbake til foretrukne replikaer og dermed gjenopprette ensartet distribusjon.
- Administratoren kan kjĂžre skriptet kafka-preferred-replica-election.sh for manuell omfordeling.

Ris. 6. Replikater etter rebalansering
Dette var en forenklet versjon av feilen, men virkeligheten er mer kompleks, selv om det ikke er noe for komplisert her. Alt kommer ned til synkroniserte replikaer (In-Sync Replicas, ISR).
Synchronized Replicas (ISR)
En ISR er et sett med kopier av en partisjon som anses som "synkronisert" (synkronisert). Det er en leder, men det er kanskje ikke tilhengere. En fĂžlger anses som synkronisert hvis den har laget eksakte kopier av alle lederens meldinger fĂžr intervallet utlĂžper replica.lagtime.max.ms.
En fĂžlger fjernes fra ISR-settet hvis den:
- gjorde ikke en forespĂžrsel om Ă„ velge for intervallet replica.lagtime.max.ms (antatt dĂžd)
- klarte ikke Ă„ oppdatere i intervallet replica.lagtime.max.ms (regnes som treg)
FÞlgere gjÞr prÞvetakingsforespÞrsler i intervallet replica.fetch.wait.max.ms, som er standard pÄ 500ms.
For Ä tydelig forklare formÄlet med ISR, mÄ vi se pÄ bekreftelser fra produsenten og noen feilscenarier. Produsentene kan velge nÄr megleren sender bekreftelse:
- acks=0, bekreftelse sendes ikke
- acks=1, bekreftelse sendes etter at leder har skrevet melding til sin lokale logg
- acks=all, bekreftelse sendes etter at alle replikaer i ISR ââhar skrevet meldingen til de lokale loggene
I Kafka-terminologi, hvis ISR har lagret en melding, er den "forpliktet". Acks=all er det sikreste alternativet, men legger ogsÄ til ekstra forsinkelse. La oss se pÄ to eksempler pÄ feil og hvordan de forskjellige "acks"-alternativene samhandler med ISR-konseptet.
Acks=1 og ISR
I dette eksemplet vil vi se at hvis lederen ikke venter pÄ at hver melding fra alle fÞlgere skal lagres, er datatap mulig hvis lederen mislykkes. Navigering til en usynkronisert fÞlger kan aktiveres eller deaktiveres ved innstilling uren.leder.valg.aktivere.
I dette eksemplet har produsenten verdien acks=1. Seksjonen er fordelt pÄ alle tre meglerne. Broker 3 er bak, den synkroniserte med lederen for Ätte sekunder siden og er nÄ 7456 meldinger bak. Megler 1 var bare ett sekund bak. Produsenten vÄr sender en melding og fÄr raskt tilbakemelding, uten overhead av trege eller dÞde fÞlgere som lederen ikke venter pÄ.

Ris. 7. ISR med tre kopier
Broker 2 mislykkes og produsenten mottar en tilkoblingsfeil. Etter at ledelsen gÄr over til megler 1, mister vi 123 meldinger. FÞlgeren pÄ megler 1 var en del av ISR, men var ikke helt synkronisert med lederen da den falt.

Ris. 8. Meldinger gÄr tapt nÄr den krasjer
I konfigurasjon bootstrap.servere Produsenten har flere meglere oppfĂžrt og kan spĂžrre en annen megler som er ny seksjonsleder. Den oppretter deretter en forbindelse til megler 1 og fortsetter Ă„ sende meldinger.

Ris. 9. Sendingen av meldinger fortsetter etter en kort pause
Megler 3 er enda lenger bak. Den gjÞr hentingsforespÞrsler, men kan ikke synkronisere. Dette kan skyldes treg nettverksforbindelse mellom meglere, lagringsproblem osv. Det fjernes fra ISR. NÄ bestÄr ISR av én kopi - lederen! Produsenten fortsetter Ä sende meldinger og motta bekreftelser.

Ris. 10. FÞlger pÄ megler 3 fjernes fra ISR
Megler 1 gÄr ned og lederrollen gÄr til megler 3 med tap av 15286 meldinger! Produsenten mottar en tilkoblingsfeilmelding. Overgangen til en leder utenfor ISR var bare mulig pÄ grunn av innstillingen unclean.leader.election.enable=true. Hvis den er installert i falsk, da ville ikke overgangen skje og alle lese- og skriveforespÞrsler ville bli avvist. I dette tilfellet venter vi pÄ at megler 1 kommer tilbake med sine intakte data i replikaen, som igjen vil ta over ledelsen.

Ris. 11. Megler 1 faller. NÄr en feil oppstÄr, gÄr et stort antall meldinger tapt
Produsenten etablerer forbindelse med den siste megleren og ser at han nÄ er leder for seksjonen. Han begynner Ä sende meldinger til megler 3.

Ris. 12. Etter en kort pause sendes meldinger igjen til seksjon 0
Vi sÄ at bortsett fra korte avbrudd for Ä etablere nye forbindelser og sÞke etter en ny leder, sendte produsenten stadig meldinger. Denne konfigurasjonen sikrer tilgjengelighet pÄ bekostning av konsistens (datasikkerhet). Kafka mistet tusenvis av meldinger, men fortsatte Ä godta nye skriverier.
Acks=all og ISR
La oss gjenta dette scenariet igjen, men med acks=alle. Broker 3 har en gjennomsnittlig ventetid pÄ fire sekunder. Produsenten sender melding med acks=alle, og fÄr nÄ ikke raskt svar. Lederen venter pÄ at meldingen skal lagres av alle replikaer i ISR.

Ris. 13. ISR med tre kopier. Den ene er treg, noe som resulterer i opptaksforsinkelser
Etter fire sekunders ekstra forsinkelse sender megler 2 en kvittering. Alle replikaer er nÄ fullstendig oppdatert.

Ris. 14. Alle replikaer lagrer meldinger og sender ack
Megler 3 faller nÄ lenger bak og fjernes fra ISR. Latensen reduseres betydelig fordi det ikke er noen langsomme replikaer igjen i ISR. Megler 2 venter nÄ kun pÄ megler 1, og han har et gjennomsnittlig etterslep pÄ 500 ms.

Ris. 15. Replikaen pÄ megler 3 fjernes fra ISR
Da faller megler 2 og lederskapet gÄr over til megler 1 uten tap av meldinger.

Ris. 16. Megler 2 faller
Produsenten finner en ny leder og begynner Ă„ sende meldinger til ham. Latensen er ytterligere redusert fordi ISR âânĂ„ bestĂ„r av en kopi! Derfor alternativet acks=alle legger ikke til redundans.

Ris. 17. Replika pÄ megler 1 tar ledelsen uten Ä miste meldinger
Da krasjer megler 1 og ledelsen gÄr til megler 3 med et tap pÄ 14238 meldinger!

Ris. 18. Megler 1 dĂžr og lederskapsovergang med urene omgivelser resulterer i omfattende datatap
Vi kunne ikke installere alternativet uren.leder.valg.aktivere til mening sant. Som standard er den lik falsk. Innstillinger acks=alle Ń unclean.leader.election.enable=true gir tilgjengelighet med noe ekstra datasikkerhet. Men som du kan se, kan vi fortsatt miste meldinger.
Men hva om vi Þnsker Ä Þke datasikkerheten? Du kan sette unclean.leader.election.enable = falsk, men dette vil ikke nÞdvendigvis beskytte oss mot tap av data. Hvis lederen falt hardt og tok dataene med seg, er meldinger fortsatt tapt, pluss at tilgjengeligheten gÄr tapt til administratoren gjenoppretter situasjonen.
Det er bedre Ă„ sĂžrge for at alle meldinger er overflĂždige, og ellers forkaste opptaket. Da er datatap, i hvert fall fra meglers side, kun mulig ved to eller flere samtidige feil.
Acks=all, min.insync.replicas og ISR
Med emnekonfigurasjon min.insync.replicas Vi Þker nivÄet pÄ datasikkerhet. La oss gÄ gjennom siste del av forrige scenario igjen, men denne gangen med min.insync.replicas=2.
SÄ megler 2 har en replikaleder og fÞlgeren pÄ megler 3 fjernes fra ISR.

Ris. 19. ISR fra to kopier
Megler 2 faller og ledelsen gÄr over til megler 1 uten tap av meldinger. Men nÄ bestÄr ISR av bare én kopi. Dette oppfyller ikke minimumsantallet for Ä motta poster, og derfor svarer megleren pÄ skriveforsÞket med en feil Ikke nok replikaer.

Ris. 20. Antallet ISRer er én lavere enn spesifisert i min.insync.replicas
Denne konfigurasjonen ofrer tilgjengelighet for konsistens. FÞr vi bekrefter en melding, sikrer vi at den er skrevet til minst to replikaer. Dette gir produsenten mye mer selvtillit. Her er meldingstap bare mulig hvis to replikaer mislykkes samtidig i et kort intervall inntil meldingen blir replikert til en ekstra fÞlger, noe som er usannsynlig. Men hvis du er superparanoid, kan du sette replikeringsfaktoren til 5, og min.insync.replicas innen 3. Her mÄ tre meglere falle samtidig for Ä miste rekorden! SelvfÞlgelig betaler du for denne pÄliteligheten med ekstra ventetid.
NÄr tilgjengelighet er nÞdvendig for datasikkerhet
Som i , noen ganger er tilgjengelighet nÞdvendig for datasikkerhet. Her er det du mÄ tenke pÄ:
- Kan utgiveren bare returnere en feil og fÄ oppstrÞmstjenesten eller brukeren til Ä prÞve igjen senere?
- Kan utgiveren lagre meldingen lokalt eller i en database for Ă„ prĂžve igjen senere?
Hvis svaret er nei, forbedrer optimalisering av tilgjengeligheten datasikkerheten. Du mister mindre data hvis du velger tilgjengelighet i stedet for Ä ikke ta opp. AltsÄ handler alt om Ä finne en balanse, og avgjÞrelsen avhenger av den konkrete situasjonen.
Betydningen av ISR
ISR-pakken lar deg velge den optimale balansen mellom datasikkerhet og latens. SÞrg for eksempel for tilgjengelighet i tilfelle feil pÄ de fleste replikaer, minimer virkningen av dÞde eller trege replikaer nÄr det gjelder ventetid.
Vi velger meningen selv replica.lagtime.max.ms i henhold til dine behov. I hovedsak betyr denne parameteren hvor mye forsinkelse vi er villige til Ă„ akseptere nĂ„r acks=alle. Standardverdien er ti sekunder. Hvis dette er for langt for deg, kan du redusere det. Da vil frekvensen av endringer i ISR ââĂžke, siden fĂžlgere vil bli fjernet og lagt til oftere.
RabbitMQ er ganske enkelt et sett med speil som mÄ replikeres. Langsomme speil introduserer ekstra ventetid, og dÞde speil kan vente til pakkene som sjekker tilgjengeligheten til hver node (nettikk) reagerer. ISR er en interessant mÄte Ä unngÄ disse latensproblemene pÄ. Men vi risikerer Ä miste overtallighet siden ISR bare kan krympe til lederen. For Ä unngÄ denne risikoen, bruk innstillingen min.insync.replicas.
Kundetilkoblingsgaranti
I innstillinger bootstrap.servere produsent og forbruker kan spesifisere flere meglere for Ä koble kunder. Tanken er at nÄr en node gÄr ned, er det flere reservedeler igjen som klienten kan Äpne en forbindelse med. Dette er ikke nÞdvendigvis seksjonsledere, men rett og slett et springbrett for innledende lasting. Klienten kan spÞrre dem hvilken node som er vert for lese-/skrivepartisjonslederen.
I RabbitMQ kan klienter koble seg til hvilken som helst node, og intern ruting sender forespÞrselen dit den skal. Dette betyr at du kan installere en lastbalanser foran RabbitMQ. Kafka krever at klienter kobler seg til noden som er vert for den tilsvarende partisjonslederen. I en slik situasjon kan du ikke installere en lastbalanser. Liste bootstrap.servere Det er avgjÞrende at klienter kan fÄ tilgang til og finne de riktige nodene etter en feil.
Kafka konsensusarkitektur
Til nÄ har vi ikke vurdert hvordan klyngen fÄr vite om meglerens fall og hvordan ny leder velges. For Ä forstÄ hvordan Kafka fungerer med nettverkspartisjoner, mÄ du fÞrst forstÄ konsensusarkitekturen.
Hver Kafka-klynge er distribuert sammen med en Zookeeper-klynge, som er en distribuert konsensustjeneste som lar systemet oppnÄ konsensus om en gitt tilstand, og prioriterer konsistens fremfor tilgjengelighet. Det kreves samtykke fra flertallet av Zookeeper-nodene for Ä godkjenne lese- og skriveoperasjoner.
Zookeeper lagrer klyngens tilstand:
- Liste over emner, seksjoner, konfigurasjon, gjeldende lederreplikaer, foretrukne replikaer.
- Klyngemedlemmer. Hver megler pinger Zookeeper-klyngen. Hvis den ikke mottar et ping innen en spesifisert tidsperiode, registrerer Zookeeper megleren som utilgjengelig.
- Velge hoved- og reservenoder for kontrolleren.
Kontrollnoden er en av Kafka-meglerne som er ansvarlig for Ä velge replika-ledere. Zookeeper sender varsler til kontrollÞren om klyngemedlemskap og emneendringer, og kontrollÞren mÄ handle pÄ disse endringene.
La oss for eksempel ta et nytt emne med ti partisjoner og en replikeringsfaktor pÄ 3. Kontrolleren mÄ velge en leder for hver partisjon, og forsÞke Ä fordele lederne optimalt mellom meglerne.
For hver seksjonskontroller:
- oppdaterer informasjon i Zookeeper om ISR og leder;
- Sender en LeaderAndISRCommand til hver megler som er vert for en kopi av denne partisjonen, og informerer meglerne om ISR og lederen.
NÄr en megler med en leder faller, sender Zookeeper en melding til kontrollÞren, og den velger en ny leder. Igjen oppdaterer kontrolleren fÞrst Zookeeper og sender deretter en kommando til hver megler som varsler dem om lederskiftet.
Hver leder er ansvarlig for Ä rekruttere ISRer. Innstillinger replica.lagtime.max.ms bestemmer hvem som skal inn der. NÄr ISR endres, sender lederen ny informasjon til Zookeeper.
Zookeeper er alltid informert om eventuelle endringer slik at ved svikt gÄr ledelsen jevnt over til ny leder.

Ris. 21. Kafka-konsensus
Replikeringsprotokoll
à forstÄ replikeringsdetaljene hjelper deg bedre Ä forstÄ potensielle tap av data.
Sampling-spĂžrringer, Log End Offset (LEO) og Highwater Mark (HW)
Vi vurderte at fĂžlgere med jevne mellomrom sender hentingsforespĂžrsler til lederen. Standardintervallet er 500ms. Dette skiller seg fra RabbitMQ ved at i RabbitMQ blir replikering ikke initiert av kĂžspeilet, men av masteren. Mesteren skyver endringer til speilene.
Lederen og alle fÞlgere lagrer Log End Offset (LEO) og Highwater (HW)-etiketten. LEO-merket lagrer forskyvningen av den siste meldingen i den lokale replikaen, og HW holder forskyvningen av den siste commit. Husk at for forpliktelsesstatus mÄ meldingen vedvares pÄ tvers av alle ISR-replikaer. Dette betyr at LEO vanligvis ligger litt foran HW.
NÄr lederen mottar en melding, lagrer den den lokalt. FÞlgeren foretar en henteforespÞrsel ved Ä overfÞre sin LEO. Lederen sender deretter en gruppe meldinger som starter fra denne LEO og overfÞrer ogsÄ gjeldende HW. NÄr lederen mottar informasjon om at alle replikaer har lagret meldingen ved gitt offset, flytter den HW-merket. Bare lederen kan flytte HW, sÄ alle fÞlgere vil vite gjeldende verdi i svarene pÄ forespÞrselen deres. Dette betyr at fÞlgere kan henge etter lederen i bÄde budskap og HW-kunnskap. Forbrukere mottar kun meldinger opp til gjeldende HW.
Merk at "vedvarende" betyr skrevet til minnet, ikke til disk. For ytelse synkroniserer Kafka til disk med et spesifikt intervall. RabbitMQ har ogsÄ et slikt intervall, men det vil sende en bekreftelse til utgiveren fÞrst etter at masteren og alle speil har skrevet meldingen til disken. Kafka-utviklerne bestemte seg av ytelsesgrunner for Ä sende en ack sÄ snart meldingen er skrevet til minnet. Kafka satser pÄ at redundans oppveier risikoen for kort lagring av bekreftede meldinger kun i minnet.
Ledersvikt
NÄr en leder faller, varsler Zookeeper kontrollÞren, og den velger en ny lederreplika. Den nye lederen setter et nytt HW-merke i henhold til sin LEO. FÞlgere fÄr da informasjon om den nye lederen. Avhengig av versjonen av Kafka, vil fÞlgeren velge ett av to scenarier:
- Den vil avkorte den lokale loggen til en kjent HW og sende en forespĂžrsel til den nye lederen om meldinger etter dette merket.
- Vil sende en forespÞrsel til lederen om Ä finne ut HW pÄ det tidspunktet han ble valgt til leder, og deretter avkorte loggen til denne forskyvningen. Den vil da begynne Ä sende periodiske hentingsforespÞrsler som starter med denne forskyvningen.
En fÞlger kan trenge Ä avkorte loggen av fÞlgende Ärsaker:
- NÄr en leder mislykkes, vinner den fÞrste fÞlgeren i ISR-settet registrert hos Zookeeper valget og blir leder. Alle fÞlgere pÄ ISR, selv om de anses som "synkronisert", har kanskje ikke mottatt kopier av alle meldinger fra den tidligere lederen. Det er fullt mulig at den omtalte fÞlgeren ikke har den mest oppdaterte kopien. Kafka sÞrger for at det ikke er noen divergens mellom replikaer. For Ä unngÄ avvik, mÄ hver fÞlger kutte loggen sin til HW-verdien til den nye lederen pÄ tidspunktet for hans valg. Dette er en annen grunn til Ä sette acks=alle sÄ viktig for konsistensen.
- Meldinger skrives med jevne mellomrom til disk. Hvis alle klyngenoder mislykkes samtidig, vil replikaer med forskjellige forskyvninger bli lagret pÄ diskene. Det er mulig at nÄr meglere kommer tilbake pÄ nett, vil den nye lederen som blir valgt stÄ bak fÞlgerne sine fordi han ble lagret pÄ disk fÞr de andre.
Gjensyn med klyngen
NÄr de blir med igjen i klyngen, gjÞr replikaene det samme som nÄr en leder mislykkes: de sjekker lederens replika og avkorter loggen til dens HW (pÄ valgtidspunktet). Til sammenligning behandler RabbitMQ pÄ samme mÄte gjenforente noder som helt nye. I begge tilfeller forkaster megleren enhver eksisterende tilstand. Hvis automatisk synkronisering brukes, mÄ masteren replikere absolutt alt gjeldende innhold til det nye speilet i en "la hele verden vente"-metoden. Masteren godtar ingen lese- eller skriveoperasjoner under denne operasjonen. Denne tilnÊrmingen skaper problemer i store kÞer.
Kafka er en distribuert logg og generelt lagrer den flere meldinger enn en RabbitMQ-kÞ, hvor data fjernes fra kÞen etter at den er lest. Aktive kÞer bÞr forbli relativt smÄ. Men Kafka er en logg med sin egen oppbevaringspolicy, som kan angi en periode pÄ dager eller uker. TilnÊrmingen til kÞblokkering og full synkronisering er absolutt uakseptabel for en distribuert logg. I stedet avkorter Kafka-tilhengere ganske enkelt loggen sin til lederens HW (pÄ tidspunktet for hans valg) hvis deres kopi er foran lederen. I det mer sannsynlige tilfellet, nÄr fÞlgeren er bak, begynner den ganske enkelt Ä gjÞre henteforespÞrsler som starter med sin nÄvÊrende LEO.
Nye eller gjenopptatte fÞlgere starter utenfor ISR og deltar ikke i forpliktelser. De jobber rett og slett sammen med gruppen, og mottar meldinger sÄ raskt de kan til de tar igjen lederen og gÄr inn i ISR. Det er ingen lÄsing og ingen grunn til Ä kaste all data.
Tap av tilkobling
Kafka har flere komponenter enn RabbitMQ, sÄ den har et mer komplekst sett med atferd nÄr klyngen blir frakoblet. Men Kafka ble opprinnelig designet for klynger, sÄ lÞsningene er veldig gjennomtenkte.
Nedenfor er flere scenarier for tilkoblingsfeil:
- Scenario 1: FĂžlgeren ser ikke lederen, men ser fortsatt dyrepasseren.
- Scenario 2: Lederen ser ingen fĂžlgere, men ser fortsatt Zookeeper.
- Scenario 3: FĂžlgeren ser lederen, men ser ikke dyrepasseren.
- Scenario 4: Lederen ser fĂžlgerne, men ser ikke dyrepasseren.
- Scenario 5: FÞlgeren er helt atskilt fra bÄde andre Kafka-noder og Zookeeper.
- Scenario 6: Lederen er helt atskilt fra bÄde andre Kafka-noder og Zookeeper.
- Scenario 7: Kafka kontrollernoden kan ikke se en annen Kafka node.
- Scenario 8: Kafka-kontrolleren ser ikke Zookeeper.
Hvert scenario har sin egen oppfĂžrsel.
Scenario 1: FĂžlger ser ikke lederen, men ser fortsatt Zookeeper

Ris. 22. Scenario 1: ISR av tre kopier
Tilkoblingsfeilen skiller megler 3 fra megler 1 og 2, men ikke fra Zookeeper. Megler 3 kan ikke lenger sende hentingsforespĂžrsler. Etter at tiden har gĂ„tt replica.lagtime.max.ms den fjernes fra ISR og deltar ikke i meldingsbekreftelser. NĂ„r tilkoblingen er gjenopprettet, vil den gjenoppta hentingsforespĂžrsler og bli med i ISR âânĂ„r den innhenter lederen. Zookeeper vil fortsette Ă„ motta ping og anta at megleren lever i beste velgĂ„ende.

Ris. 23. Scenario 1: Megleren fjernes fra ISR hvis ingen henteforespĂžrsel mottas fra den innenfor replica.lag.time.max.ms intervallet
Det er ingen delt hjerne eller node suspensjon som i RabbitMQ. I stedet reduseres redundansen.
Scenario 2: Leder ser ingen fĂžlgere, men ser fortsatt Zookeeper

Ris. 24. Scenario 2. Leder og to fĂžlgere
Et sammenbrudd i nettverkstilkoblingen skiller lederen fra fÞlgerne, men megleren ser fortsatt Zookeeper. Som i det fÞrste scenariet krymper ISR, men denne gangen kun til lederen ettersom alle fÞlgere slutter Ä sende henteforespÞrsler. Igjen, det er ingen logisk inndeling. I stedet er det tap av redundans for nye meldinger inntil tilkoblingen er gjenopprettet. Zookeeper fortsetter Ä motta ping og mener at megleren lever i beste velgÄende.

Ris. 25. Scenario 2. ISR har krympet bare til lederen
Scenario 3. FĂžlger ser lederen, men ser ikke dyrepasseren
FÞlgeren er skilt fra Zookeeper, men ikke fra megleren med lederen. Som et resultat fortsetter fÞlgeren Ä gjÞre hentingsforespÞrsler og vÊre medlem av ISR. Zookeeper mottar ikke lenger ping og registrerer et meglerkrasj, men siden det kun er en fÞlger, fÄr det ingen konsekvenser etter gjenoppretting.

Ris. 26. Scenario 3: FĂžlgeren fortsetter Ă„ sende hentingsforespĂžrsler til lederen
Scenario 4. Leder ser fĂžlgere, men ser ikke Zookeeper

Ris. 27. Scenario 4. Leder og to fĂžlgere
Lederen er skilt fra Zookeeper, men ikke fra meglerne med fĂžlgere.

Ris. 28. Scenario 4: Leder isolert fra Zookeeper
Etter en tid vil Zookeeper registrere en meglerfeil og varsle kontrollÞren om det. Han vil velge en ny leder blant sine fÞlgere. Den opprinnelige lederen vil imidlertid fortsette Ä tro at det er lederen og vil fortsette Ä ta imot pÄmeldinger fra acks=1. FÞlgere sender ham ikke lenger henteforespÞrsler, sÄ han vil vurdere dem som dÞde og prÞve Ä krympe ISR til seg selv. Men siden den ikke har en forbindelse til Zookeeper, vil den ikke kunne gjÞre dette, og pÄ det tidspunktet vil den nekte Ä godta flere oppfÞringer.
meldinger acks=alle vil ikke motta en bekreftelse fordi ISR ââfĂžrst slĂ„r pĂ„ alle replikaer, og meldinger nĂ„r dem ikke. NĂ„r den opprinnelige lederen prĂžver Ă„ fjerne dem fra ISR, vil den ikke vĂŠre i stand til Ă„ gjĂžre det og vil slutte Ă„ godta noen meldinger i det hele tatt.
Klienter merker snart endringen i leder og begynner Ä sende poster til den nye serveren. NÄr nettverket er gjenopprettet, ser den opprinnelige lederen at den ikke lenger er en leder og avkorter loggen sin til HW-verdien som den nye lederen hadde pÄ tidspunktet for unnlatelse av Ä unngÄ logdivergens. Den vil da begynne Ä sende hentingsforespÞrsler til den nye lederen. Alle poster fra den opprinnelige lederen som ikke er replikert til den nye lederen gÄr tapt. Det vil si at meldinger som ikke ble bekreftet av den opprinnelige lederen i lÞpet av de fÄ sekundene da to ledere jobbet, vil gÄ tapt.

Ris. 29. Scenario 4. Lederen pÄ megler 1 blir en fÞlger etter at nettverket er gjenopprettet
Scenario 5: FÞlgeren er helt atskilt fra bÄde andre Kafka-noder og Zookeeper
FÞlgeren er fullstendig isolert fra bÄde andre Kafka-noder og Zookeeper. Han fjerner seg ganske enkelt fra ISR til nettverket er gjenopprettet, og tar deretter igjen de andre.

Ris. 30. Scenario 5: Isolert fĂžlger fjernes fra ISR
Scenario 6: Lederen er helt atskilt fra bÄde andre Kafka-noder og Zookeeper

Ris. 31. Scenario 6. Leder og to fĂžlgere
Lederen er fullstendig isolert fra sine fÞlgere, kontrollÞren og dyrepasseren. I en kort periode vil den fortsette Ä ta imot pÄmeldinger fra acks=1.

Ris. 32. Scenario 6: Isolering av lederen fra andre Kafka- og Zookeeper-noder
Har ikke mottatt forespĂžrsler etter utlĂžp replica.lagtime.max.ms, vil den prĂžve Ă„ krympe ISR til seg selv, men vil ikke vĂŠre i stand til Ă„ gjĂžre det fordi det ikke er noen kommunikasjon med Zookeeper, da vil den slutte Ă„ godta skriverier.
I mellomtiden vil Zookeeper markere den isolerte megleren som dĂžd og kontrollĂžren vil velge en ny leder.

Ris. 33. Scenario 6. To ledere
Den opprinnelige lederen kan godta oppfÞringer i noen sekunder, men slutter deretter Ä godta eventuelle meldinger. Klienter oppdateres hvert 60. sekund med de nyeste metadataene. De vil bli informert om lederbyttet og vil begynne Ä sende pÄmeldinger til den nye lederen.

Ris. 34. Scenario 6: Produsenter bytter til en ny leder
Alle bekreftede oppfÞringer gjort av den opprinnelige lederen siden tap av tilkobling vil gÄ tapt. NÄr nettverket er gjenopprettet, vil den opprinnelige lederen oppdage gjennom Zookeeper at den ikke lenger er lederen. Deretter vil den avkorte loggen sin til HW for den nye lederen pÄ valgtidspunktet og begynne Ä sende forespÞrsler som fÞlger.

Ris. 35. Scenario 6: Den opprinnelige lederen blir en fĂžlger etter at nettverkstilkoblingen er gjenopprettet
I denne situasjonen kan logisk separasjon forekomme i en kort periode, men bare hvis acks=1 О min.insync.replicas ogsÄ 1. Logisk separasjon avsluttes automatisk enten etter at nettverket er gjenopprettet, nÄr den opprinnelige lederen innser at han ikke lenger er lederen, eller nÄr alle klienter innser at lederen har endret seg og begynner Ä skrive til den nye lederen - avhengig av hva som skjer fÞrst. I alle fall vil noen meldinger gÄ tapt, men bare med acks=1.
Det er en annen variant av dette scenariet der, rett fĂžr nettverket delte seg, falt fĂžlgerne bak og lederen komprimerte ISR til bare seg selv. Den blir da isolert pĂ„ grunn av tap av tilkobling. En ny leder velges, men den opprinnelige lederen fortsetter Ă„ ta imot pĂ„meldinger, til og med acks=alle, fordi det er ingen andre i ISR ââenn ham. Disse postene vil gĂ„ tapt nĂ„r nettverket er gjenopprettet. Den eneste mĂ„ten Ă„ unngĂ„ dette alternativet pĂ„ er min.insync.replicas = 2.
Scenario 7: Kafka Controller Node kan ikke se en annen Kafka Node
Generelt, nÄr forbindelsen med en Kafka-node er tapt, vil ikke kontrolleren vÊre i stand til Ä overfÞre informasjon om lederendring til den. I verste fall vil dette fÞre til et kortsiktig logisk skille, som i scenario 6. Oftere enn ikke vil megleren rett og slett ikke bli en lederkandidat dersom sistnevnte mislykkes.
Scenario 8: Kafka-kontrolleren ser ikke Zookeeper
Zookeeper vil ikke motta et ping fra den falne kontrolleren og vil velge en ny Kafka-node som kontroller. Den originale kontrolleren kan fortsette Ä presentere seg selv som sÄdan, men den mottar ikke varsler fra Zookeeper, sÄ den vil ikke ha noen oppgaver Ä utfÞre. NÄr nettverket er gjenopprettet, vil han innse at han ikke lenger er en kontroller, men har blitt en vanlig Kafka-node.
Konklusjoner fra scenariene
Vi ser at tap av follower-tilkobling ikke resulterer i meldingstap, men reduserer rett og slett midlertidig redundans inntil nettverket er gjenopprettet. Dette kan selvfÞlgelig fÞre til tap av data dersom en eller flere noder gÄr tapt.
Hvis lederen blir skilt fra Zookeeper pÄ grunn av tap av tilkobling, kan dette fÞre til at meldinger gÄr tapt fra acks=1. Mangel pÄ kommunikasjon med Zookeeper forÄrsaker en kort logisk splittelse med de to lederne. Dette problemet lÞses av parameteren acks=alle.
Parameter min.insync.replicas inn i to eller flere replikaer gir ytterligere forsikring om at slike kortsiktige scenarier ikke vil resultere i tapte meldinger som i scenario 6.
Sammendrag av tapte meldinger
La oss liste opp alle mÄtene du kan miste data pÄ i Kafka:
- Enhver lederfeil hvis meldinger ble bekreftet ved hjelp av acks=1
- Enhver uren overgang av lederskap, det vil si til en tilhenger utenfor ISR, selv med acks=alle
- Isolerer lederen fra Zookeeper hvis meldinger ble bekreftet ved hjelp av acks=1
- Fullstendig isolasjon av lederen som allerede har krympet ISR-gruppen ned til seg selv. Alle meldinger vil gÄ tapt, til og med acks=alle. Dette er bare sant hvis min.insync.replicas=1.
- Samtidig feil pÄ alle partisjonsnoder. Fordi meldinger bekreftes fra minnet, kan det hende at noen ennÄ ikke er skrevet til disk. Etter omstart av serverne kan det hende at noen meldinger mangler.
Uren lederskapsoverganger kan unngÄs ved enten Ä forby dem eller sikre minst to oppsigelser. Den mest holdbare konfigurasjonen er en kombinasjon acks=alle О min.insync.replicas mer enn 1.
Direkte sammenligning av pÄliteligheten til RabbitMQ og Kafka
For Ä sikre pÄlitelighet og hÞy tilgjengelighet implementerer begge plattformene et primÊrt og sekundÊrt replikeringssystem. RabbitMQ har imidlertid en akilleshÊl. NÄr du kobler til igjen etter en feil, forkaster noder dataene sine og synkronisering blokkeres. Denne doble knallen setter spÞrsmÄlstegn ved levetiden til store kÞer i RabbitMQ. Du mÄ akseptere enten redusert redundans eller lange blokkeringstider. Redusering av redundans Þker risikoen for massivt tap av data. Men hvis kÞene er smÄ, kan korte perioder med utilgjengelighet (noen fÄ sekunder) av hensyn til redundansen hÄndteres ved Ä bruke gjentatte tilkoblingsforsÞk.
Kafka har ikke dette problemet. Den forkaster data bare fra punktet av divergens mellom lederen og fÞlgeren. Alle delte data lagres. I tillegg blokkerer ikke replikering systemet. Lederen fortsetter Ä godta innlegg mens den nye fÞlgeren tar igjen, sÄ for devops blir det en triviell oppgave Ä bli med eller bli med i klyngen igjen. SelvfÞlgelig er det fortsatt problemer som nettverksbÄndbredde under replikering. Hvis du legger til flere fÞlgere samtidig, kan du stÞte pÄ en bÄndbreddegrense.
RabbitMQ er overlegen Kafka nÄr det gjelder pÄlitelighet nÄr flere servere i en klynge svikter samtidig. Som vi allerede har sagt, sender RabbitMQ en bekreftelse til utgiveren fÞrst etter at meldingen er skrevet til disken av masteren og alle speil. Men dette legger til ekstra ventetid av to grunner:
- fsync med noen hundre millisekunder
- Feilen i speilet kan bare merkes etter at levetiden til pakkene som sjekker tilgjengeligheten til hver node (nettikk) er utlĂžpt. Hvis speilet bremser ned eller faller, legger dette til en forsinkelse.
Kafkas innsats er at hvis en melding er lagret pÄ tvers av flere noder, kan den bekrefte meldinger sÄ snart de treffer minnet. PÄ grunn av dette er det en risiko for Ä miste meldinger av enhver type (til og med acks=alle, min.insync.replicas=2) ved samtidig feil.
Totalt sett viser Kafka bedre programvareytelse og er designet fra grunnen av for klynger. Antall fÞlgere kan Þkes til 11 hvis det er nÞdvendig for pÄliteligheten. Replikeringsfaktor 5 og minimum antall replikaer i synkronisering min.insync.replicas=3 vil gjÞre meldingstap til en svÊrt sjelden hendelse. Hvis infrastrukturen din kan stÞtte dette replikeringsforholdet og redundansnivÄet, kan du velge dette alternativet.
RabbitMQ clustering er bra for smÄ kÞer. Men selv smÄ kÞer kan vokse raskt nÄr det er stor trafikk. NÄr kÞene blir store, mÄ du ta tÞffe valg mellom tilgjengelighet og pÄlitelighet. RabbitMQ-klynger er best egnet for ikke-typiske situasjoner der fordelene med RabbitMQs fleksibilitet oppveier eventuelle ulemper ved klyngingen.
En motgift mot RabbitMQs sÄrbarhet for store kÞer er Ä dele dem opp i mange mindre kÞer. Hvis du ikke krever fullstendig bestilling av hele kÞen, men bare de relevante meldingene (for eksempel meldinger fra en spesifikk klient), eller ikke bestiller noe i det hele tatt, er dette alternativet akseptabelt: se pÄ prosjektet mitt Ä dele opp kÞen (prosjektet er fortsatt pÄ et tidlig stadium).
Til slutt, ikke glem en rekke feil i klynge- og replikeringsmekanismene til bÄde RabbitMQ og Kafka. Over tid har systemene blitt mer modne og stabile, men ingen meldinger vil noen gang vÊre 100 % sikre mot tap! I tillegg skjer det store ulykker i datasentre!
Hvis jeg har gÄtt glipp av noe, gjort en feil, eller du er uenig i noen av punktene, skriv gjerne en kommentar eller kontakt meg.
Jeg blir ofte spurt: "Hva skal jeg velge, Kafka eller RabbitMQ?", "Hvilken plattform er bedre?". Sannheten er at det virkelig avhenger av din situasjon, nÄvÊrende erfaring osv. Jeg er nÞlende med Ä si min mening fordi det ville vÊre for mye av en overforenkling Ä anbefale én plattform for alle brukstilfeller og mulige begrensninger. Jeg skrev denne serien med artikler slik at du kan danne deg din egen mening.
Jeg vil si at begge systemene er ledende pÄ dette omrÄdet. Jeg kan vÊre litt forutinntatt fordi fra min erfaring med prosjekter har jeg en tendens til Ä verdsette ting som garantert meldingsbestilling og pÄlitelighet.
Jeg ser andre teknologier som mangler denne pÄliteligheten og garantert bestilling, sÄ ser jeg pÄ RabbitMQ og Kafka og innser den utrolige verdien av begge disse systemene.
Kilde: www.habr.com
