
Uues Me arutasime RabbitMQ klasterdamist, et tagada talitlushĂ€irete ja kĂ”rge kĂ€ttesaadavuse. NĂŒĂŒd sĂŒveneme Apache Kafka.
Siin on replikatsiooniĂŒksuseks partitsioon (partition). Igal teemal on ĂŒks vĂ”i mitu partitsiooni. Igas partitsioonis on juht ja vĂ”imalikud jĂ€rgijad vĂ”i mitte. Teema loomisel mÀÀratakse partitsioonide arv ja replikatsiooni koefitsient. Tavaline vÀÀrtus on 3, mis tĂ€hendab kolme replikatsiooni: ĂŒks juht ja kaks jĂ€rgijat.

Joon. 1. Neli partitsiooni on jaotatud kolme maakleri vahel
KĂ”ik lugemis- ja kirjutamissoovid suunatakse juhile. JĂ€rgijad saadavad juhile perioodiliselt pĂ€ringuid viimaste sĂ”numite saamiseks. Tarbijad ei pöördu kunagi jĂ€rgijate poole, viimased eksisteerivad ainult ĂŒleliigsuse ja talitlushĂ€irete kindlustamiseks.

Partitsiooni rike
Kui maakler kaob, jÀÀvad sageli mitme partitsioonijuhid ilma. Igas nendes mÀÀratakse uueks juhiks teine sĂ”lm. Tegelikult ei pruugi see alati nii olla, kuna mĂ”jutab ka sĂŒnkroniseerimise tegur: kas on sĂŒnkroniseeritud jĂ€rgijaid ja kui neid ei ole, kas on lubatud ĂŒleminek sĂŒnkroniseerimata replikale. Aga hetkel ei hakka me seda keeruliseks muutma.
VĂ”rgust kaob maakler 3 â ja partitsioonile 2 valitakse uus juht maakleris 2.

Joon. 2. Maakler 3 sureb ja tema jÀrgija maakleris 2 valitakse partitsiooni 2 uueks juhiks
SeejÀrel kaob maakler 1 ja partitsioon 1 kaotab oma juhi, mille roll lÀheb maaklerile 2.

Joon. 3. JĂ€rele on jÀÀnud ainult ĂŒks maakler. KĂ”ik juhid asuvad ĂŒhes maakleris nulli ĂŒleliigsusega
Kui maakler 1 tuleb vĂ”rku tagasi, lisab ta neli jĂ€rgijat, tagades igale partitsioonile teatava ĂŒleliigsuse. Kuid kĂ”ik juhid jÀÀvad endiselt maaklerisse 2.

Joon. 4. Juhid jÀÀvad maaklerisse 2
Kui maakler 3 kÀivitatakse, naaseme kolme replikatsiooni juurde partitsioonis. Kuid kÔik juhid jÀÀvad endiselt maaklerisse 2.

Joon. 5. EbaĂŒhtlane juhtide paigutus pĂ€rast maaklerite 1 ja 3 taastumist
Kafkal on tööriist juhtide tĂ”husamaks ĂŒmberjaotamiseks kui RabbitMQ-l. Seal tuli kasutada kolmandate osapoolte pistikut vĂ”i skripti, mis muutis poliitikaid peamise sĂ”lme migreerimise nimel, vĂ€hendades samal ajal ĂŒleliigsust migreerimise ajal. Lisaks pidid suurte jĂ€rjekordade korral leppima kĂ€ttesaamatusega sĂŒnkroniseerimise ajal.
Kafkal on mĂ”isted âsoovitavad koopiaidâ liidri rolli jaoks. Kui teema osad luuakse, pĂŒĂŒab Kafka juhtide jaotuse tasakaalu ning mĂ€rgib need esimesed juhid kui soovitatavad. Aja jooksul serverite taaskĂ€ivituste, tĂ”rgete ja ĂŒhenduse katkemise tĂ”ttu vĂ”ivad juhid sattuda teistele sĂ”lmedele, nagu eelnevalt kirjeldatud ÀÀrmuslikul juhul.
Selle parandamiseks pakub Kafka kahte varianti:
- Valik auto.leader.rebalance.enable=true see vÔimaldab kontrolleri sÔlmel automaatselt juhtida juhte tagasi soovitatavatele koopiatele ja taastada seelÀbi tasakaalustatud jaotuse.
- Administraator saab kĂ€ivitada skripti kafka-preferred-replica-election.sh kopeerimise kĂ€sitsi ĂŒmbernimetamiseks.

Kujutis 6. Koopiad pĂ€rast ĂŒmberjaotust
See oli lihtsustatud tĂ”rkeversioon, kuid reaalsus on keerulisem, kuigi siin pole midagi liiga keerulist. KĂ”ik tugineb sĂŒnkroonitud koopiatele (In-Sync Replicas, ISR).
SĂŒnkroonitud koopiad (ISR)
ISR on sektsiooni koopiate kogum, mida peetakse âsĂŒnkroonitudâ (in-sync). Siin on juht, kuid jĂ€rgijaid ei pruugi olla. JĂ€rgija loetakse sĂŒnkroonitud, kui ta on teinud tĂ€psed kopeerimised kĂ”ikidest sĂ”numitest liider enne vaheaja möödumist replica.lag.time.max.ms.
JĂ€rjeks hodpareltakse ISR-st, kui ta:
- ei ole kutsunud kaevet vooru jooksul replica.lag.time.max.ms (loetakse surnuks)
- ei ole ajaga vÀrskendatud replica.lag.time.max.ms (loetakse aeglaseks)
JĂ€rgjad teevad kaevet vooru intervallis replica.fetch.wait.max.ms, mis vaikimisi on 500 ms.
ISR-i eesmÀrgi selgeks tegemiseks tuleb vaadata tootjalt saabuvaid kinnitusd ja mÔned vÀljalangemisstsenaariumid. Tootjad vÔivad valida, millal maakler saadab kinnituse:
- acks=0, kinnitust ei saadeta
- acks=1, kinnitust saadetakse pÀrast seda, kui liider on sÔnumi oma kohalikku logi salvestanud
- acks=all, kinnitust saadetakse pÀrast seda, kui kÔik koopiad ISR-is on sÔnumi kohalikesse logidesse salvestanud
Kafkas terminoloogias, kui ISR on sĂ”numi salvestanud, toimub selle âkinnitamineâ. Acks=all on kĂ”ige turvalisem valik, kuid see toob kaasa ka tĂ€iendava viivituse. Vaadakem kahte tĂ”rke nĂ€idet ja kuidas erinevad 'acks' valikud suheldes ISR kontseptsiooniga.
Acks=1 ja ISR
Selles nĂ€ites nĂ€eme, et kui liider ei oota, et iga sĂ”num kĂ”ikidelt jĂ€lgijatelt salvestatakse, vĂ”ib juhi tĂ”rke korral andmeid kaotsi minna. Ăleminek sĂŒnkroonimata jĂ€lgijale vĂ”ib olla lubatud vĂ”i keelatud seadistusega unclean.leader.election.enable.
Selles nĂ€ites on tootjal seadistatud acks=1. Jagune on jaotatud kolme maakleri vahel. Maakler 3 on maas, ta sĂŒnkroonis liidriga kaheksa sekundit tagasi ja nĂŒĂŒd on tal 7456 sĂ”numi kaugus. Maakler 1 on maas vaid ĂŒhe sekundi. Meie tootja saadab sĂ”numi ja saab kiiresti ack'i tagasi, ilma ĂŒlekoormuseta aeglastele vĂ”i surnud jĂ€lgijatele, kes liidrit ei oota.

Joonis 7. ISR kolme replikaga
Maakler 2 langeb vĂ€lja ja tootja saab ĂŒhenduse tĂ”rke. PĂ€rast juhtimise ĂŒleminekut maaklerile 1 kaotame 123 sĂ”numit. JĂ€lgija maakleris 1 oli ISR-is, kuid ei olnud tĂ€ielikult liidriga sĂŒnkroonitud, kui too kukkus.

Joonis 8. TÔrke korral kaovad sÔnumid
Konfiguratsioonis bootstrap.servers on tootjal loetletud mitu maaklerit ja ta vĂ”ib kĂŒsida teiselt maaklerilt, kes on saanud jagundi uue liidri. SeejĂ€rel loob ta ĂŒhenduse maakleriga 1 ja jĂ€tkab sĂ”numite saatmist.

Joonis 9. SĂ”numite saatmine jĂ€tkub pĂ€rast lĂŒhikest pausi
Maakler 3 on veelgi rohkem mahajÀÀmuses. Ta teeb pĂ€ringuid, kuid ei saa sĂŒnkroonida. See vĂ”ib olla tingitud aeglasest vĂ”rguĂŒhendusest maaklerite vahel, salvestamise probleemidest jne. Ta eemaldatakse ISR-ist. NĂŒĂŒd koosneb ISR ĂŒhest replikast â liidrist! Tootja jĂ€tkab sĂ”numite saatmist ja kinnituste saamist.

Joonis 10. JĂ€lgija maakleris 3 eemaldatakse ISR-ist
Maakler 1 kukub ja liidri roll lĂ€heb maaklerile 3, kaotades 15286 sĂ”numit! Tootja saab ĂŒhenduse tĂ”rke teate. Ăleminek liidrile vĂ€ljaspool ISR-i oli vĂ”imaldanud ainult seadistuse tĂ”ttu unclean.leader.election.enable=true. Kui see on seadistatud false, siis ĂŒleminekut ei toimuks ja kĂ”ik lugemise ja kirjutamise pĂ€ringud oleksid tagasi lĂŒkatud. Sellisel juhul ootame maakler 1 naasmist tema puutumatute andmetega replikas, mis taas vĂ”tab juhi rolli.

Joonis 11. Maakler 1 kukub. Suur osa sÔnumitest kaob tÔrke korral
Tootja loob ĂŒhenduse viimase maakleriga ja nĂ€eb, et see on nĂŒĂŒd jaotise juht. Ta hakkab saatma sĂ”numeid maaklerile 3.

Joonis 12. PĂ€rast lĂŒhikest pausi saadetakse sĂ”numid uuesti jaotisse 0.
Oleme nĂ€inud, et lisaks lĂŒhikestele pausidele uute ĂŒhenduste seadistamiseks ja uue juhi leidmiseks, saatis tootja pidevalt sĂ”numeid. See konfiguratsioon tagab kĂ€ttesaadavuse koos jĂ€rjepidevuse (andmete turvalisuse) nĂ”udega. Kafka kaotas tuhandeid sĂ”numeid, kuid jĂ€tkas uute kirjade vastuvĂ”tmist.
Acks=all ja ISR.
Korrake seda stsenaariumi veel kord, kuid koos acks=all. Maakleri 3 viivitus on keskmiselt neli sekundit. Tootja saadab sĂ”numi acks=all, ja nĂŒĂŒd ei saa ta kiiret vastust. Juht ootab, kuni kĂ”ik koopiad ISR-is sĂ”numi salvestavad.

Joonis 13. ISR kolme koopiaga. Ăks töötab aeglaselt, mis pĂ”hjustab salvestamise viivituse.
PĂ€rast nelja sekundi lisaviivitust saadab maakler 2 ack. KĂ”ik koopiad on nĂŒĂŒd tĂ€ielikult uuendatud.

Joonis 14. KÔik koopiad salvestavad sÔnumeid ja saadavad acki.
Maakler 3 jÀÀb nĂŒĂŒd veelgi maha ja eemaldatakse ISR-ist. Viivitus vĂ€heneb mĂ€rgatavalt, kuna ISR-is ei ole enam aeglaseid koopiaid. Maakler 2 ootab nĂŒĂŒd ainult maaklerit 1, kellel on keskmine viivitus 500 ms.

Joonis 15. Koopia maakleris 3 eemaldatakse ISR-ist.
Siis kukub maakler 2 ja juhtimine lÀheb maaklerile 1 ilma sÔnumite kadumiseta.

Joonis 16. Maakler 2 kukub.
Tootja leiab uue juhi ja hakkab sellele sĂ”numeid saatma. Viivitus vĂ€heneb veelgi, kuna nĂŒĂŒd koosneb ISR ĂŒhest koopiast! SeetĂ”ttu vĂ”imalus acks=all ei lisa liigset turvalisust.

Joonis 17. Koopia maakleris 1 vĂ”tab juhtimise ĂŒle ilma sĂ”numite kadumiseta.
Siis kukub maakler 1 ja juhtimine lÀheb maaklerile 3, mille kÀigus kaob 14238 sÔnumit!

Joonis 18. Maakler 1 sureb ja juhtimise ĂŒleminek mÀÀranguga unclean toob kaasa ulatusliku andmekao.
Me oleksime vÔinud mitte seada vÔimalust unclean.leader.election.enable vÀÀrtuseks true. Vaikimisi on see false. Seadistus acks=all jot unclean.leader.election.enable=true tagab kÀttesaadavuse koos mÔningase tÀiendava andmete turvalisusega. Kuid nagu nÀete, vÔime siiski sÔnumeid kaotada.
Aga mis siis, kui me tahame andmete turvalisust suurendada? Saame seadistada unclean.leader.election.enable = false, kuid see ei pruugi meid kaitsta andmete kaotuse eest. Kui juht tÔsiselt kokku kukub ja andmed kaovad, on sÔnumid endiselt kadunud ning juurdepÀÀs on kadunud, kuni administraator olukorra taastab.
Parim on tagada kÔigi sÔnumite mitmekesisus, vastasel juhul loobuda registreerimisest. Nii et vÀhemalt maaklerina on andmete kaotus vÔimalik ainult kahe vÔi enama samaaegse rikke korral.
Acks=all, min.insync.replicas ja ISR
Teema konfiguratsiooniga min.insync.replicas tÔstame andmete turvalisuse taset. Kordame veel kord eelmise stsenaariumi viimast osa, kuid seekord koos min.insync.replicas=2.
Nii et maakleril 2 on replikatsiooni juht ja jÀlgija maakleril 3 on ISR-ist eemaldatud.

Joon. 19. ISR kahest replikast
Maakler 2 kukub kokku ja juhtimine ĂŒleminek maaklerile 1 ilma sĂ”numite kaotuseta. Kuid nĂŒĂŒd koosneb ISR ainult ĂŒhest replikast. See ei vasta minimaalsetele nĂ”uetele kirje saamiseks ja seetĂ”ttu vastab maakler kirje tegemise katsele veaga. NotEnoughReplicas.

Joon. 20. ISR arv on ĂŒks vĂ€hem, kui on nĂ€idatud min.insync.replicas
See konfigureerimine ohverdab kĂ€ttesaadavuse ĂŒhtsuse nimel. Enne sĂ”numi kinnitamist tagame, et see salvestatakse vĂ€hemalt kahele replikale. See annab tootjale palju suurema kindluse. Siin on sĂ”numite kaotus vĂ”imalik ainult kahe replikasi samaaegse rikke korral lĂŒhikeses ajavahemikus, enne kui sĂ”num on replikatsiooniks lisajĂ€lgijale, mis on ebatĂ”enĂ€oline. Kuid kui olete superparanoiline, vĂ”ite seadistada replikatsiooni koefitsiendi 5 ja min.insync.replicas 3. Siin peavad kohe kolm maaklerit kokku kukkuma, et kirje kaotada! Muidugi, sellise usaldusvÀÀrsuse eest maksate lisaviivituse.
Kui kÀttesaadavus on andmete turvalisuse jaoks vajalik
Nagu ka , mÔnikord on kÀttesaadavus andmete turvalisuse jaoks vajalik. Peate mÔtlema jÀrgmisele:
- Kas avaldaja saab lihtsalt vea tagastada ja ĂŒlemine teenus vĂ”i kasutaja proovida hiljem uuesti?
- Kas avaldaja saab sÔnumi kohapeal vÔi andmebaasis hoida, et proovida hiljem uuesti?
Kui vastus on negatiivne, siis kĂ€ttesaadavuse optimeerimine suurendab andmete turvalisust. Te kaotate vĂ€hem andmeid, kui valite kĂ€ttesaadavuse salvestamise keeldumise asemel. Seega on kĂ”ik tasakaalu leidmise kĂŒsimus ja otsus sĂ”ltub konkreetsest olukorrast.
ISR tÀhendus
ISR komplekt vÔimaldab leida optimaalse tasakaalu andmete turvalisuse ja viivituse vahel. NÀiteks tagab see kÀttesaadavuse enamiku koopiate rikke korral, minimeerides surnud vÔi aeglaste koopiate viivituse mÔju.
Me ise valime vÀÀrtuse replica.lag.time.max.ms vastavalt oma vajadustele. Sisuliselt tĂ€hendab see parameeter, millise viivituse oleme valmis aktsepteerima acks=all. Vaikimisi on vÀÀrtus kĂŒmme sekundit. Kui see on teie jaoks liiga kaua, siis vĂ”ite seda vĂ€hendada. Sel juhul suureneb ISR-i muutuste sagedus, kuna jĂ€rgijad eemaldatakse ja lisatakse sagedamini.
RabbitMQ-s on lihtsalt peegelduse komplekt, mida tuleb replitseerida. Aeglaselt toimivad peegeldused toovad kaasa lisaviivituse ja surnud peegelduste vastamist vĂ”ib oodata pakettide eluea lĂ”ppemiseni, mis kontrollivad iga sĂ”lme kĂ€ttesaadavust (net tick). ISR on huvitav viis nende viivituse probleemide vĂ€ltimiseks. Kuid me riskime ĂŒleliigsuse kaotamisega, kuna ISR vĂ”ib lĂŒheneda ainult liidrini. Selle riski vĂ€ltimiseks kasutage seadistust. min.insync.replicas.
KliendiĂŒhenduse garantii
Seadetes bootstrap.servers tootjat ja tarbijat saab mÀÀrata mitmeid brokereid klientide ĂŒhendamiseks. Idee on, et ĂŒhe sĂ”lme vĂ€ljalangemise korral jÀÀb veel mitu varusĂ”lme, millega klient saab ĂŒhenduse luua. Need ei pea olema jagamise liidrid, vaid lihtsalt tugipunkt alglaadimiseks. Klient vĂ”ib nende kĂ€est kĂŒsida, millisel sĂ”lmel asub jagamise liider lugemiseks/kirjeldamiseks.
RabbitMQ-s saavad kliendid ĂŒhenduda mis tahes sĂ”lmega ning sisemine marsruutimine saadab pĂ€ringu sinna, kuhu vaja. See tĂ€hendab, et saate seadistada koormuse tasakaalustaja RabbitMQ ees. Kafka nĂ”uab, et kliendid ĂŒhenduksid sĂ”lmega, kus asub vastava jagamise liider. Sellises olukorras ei saa koormuse tasakaalustajat seadistada. Loend bootstrap.servers on kriitilise tĂ€htsusega, et kliendid saaksid suhelda vajalike sĂ”lmedega ja leida need pĂ€rast riket.
Kafka konsensuse arhitektuur
Klassi senik ei ole kÀsitlenud, kuidas klaster saadab teate vÔrgu puudumise kohta ja kuidas valitakse uus juht. Et mÔista, kuidas Kafka töötab vÔrgu osadega, on kÔigepealt vajalik mÔista konsensuse arhitektuuri.
Iga Kafka klaster on seadistatud koos Zookeeper klastri - see on jaotatud konsensuse teenus, mis vĂ”imaldab sĂŒsteemil saavutada konsensust teatud oleku kohta prioriteediga jĂ€rjepidevuse ĂŒle kerguse. Lugemise ja kirjutamise toimingute heakskiitmiseks on vajalik Zookeeper'i enamus nĂ”usolek.
Zookeeper salvestab klastri oleku:
- Teemade, osade, seadistuse, praeguste liidrite koopia, eelistatud koopiate loetelu.
- Klastri liikmed. Iga broker saadab pingi Zookeeper'i. Kui Zookeeper ei saa pingi teate antud ajavahemiku jooksul, registreerib ta brokero kui kÀttesaamata.
- Peamise ja varu sÔlmede valimine kontrollerile.
Kontrolleri sĂ”lm on ĂŒks Kafka brokereid, kes vastutab koopiate liidrite valimise eest. Zookeeper saadab kontrollerile teateid klastri liikmelisuse ja teema muudatuste kohta ning kontroller peab nende muudatustega arvestama.
NĂ€iteks, vĂ”tame uue teema kĂŒmne osaga ja koopiate suhe 3. Kontroller peab valima iga osa liidri, pĂŒĂŒdes optimaalselt jagada liidreid brokede vahel.
Iga osa puhul kontroller:
- uuendab Zookeeperis ISR ja liidri teavet;
- saadab iga brokeri, kes haldab selle osa koopiat, LeaderAndISRCommand'i kÀsu, teavitades brokereid ISR ja liidri kohta.
Kui liidri broker kukub, saadab Zookeeper teate kontrollerile ja see valib uue liidri. Veel kord, kontroller uuendab esmalt Zookeeperit ja seejÀrel saadab igale brokerile kÀsu, teavitades neid juhtimisvahetusest.
Iga liider vastutab ISR komplekti eest. Konfiguratsioon replica.lag.time.max.ms mÀÀrab, kes sinna kuulub. Kui ISR muutub, edastab liider Zookeeperile uue teabe.
Zookeeper on alati teadlik igasugustest muudatustest, et juhatus saaks sujuvalt uuele liidrile liikuda, kui juhi vĂ”i sĂŒsteemi katkestus toimub.

Joon. 21. Kafka konsensus
Replikatsiooni protokoll
Replikatsiooni ĂŒksikasjade mĂ”istmine aitab paremini aru saada potentsiaalsetest andmete kadumise stsenaariumidest.
PÀringud, eralduse lÔpp-punkt (LEO) ja KÔrgeim Vee Mark (HW)
Me oleme uurinud, et jÀrgijad saadavad juhile aeg-ajalt pÀringuid andmete tÔmbamiseks (fetch). Vaikimisi intervall on 500 ms. See erineb RabbitMQ-st, kuna RabbitMQ-s algatatakse replikatsioon mitte jÀrje peegelduse, vaid meistri poolt. Meister saadab muudatused peegeldustele.
Juht ja kĂ”ik jĂ€rgijad sĂ€ilitavad logi lĂ”pu nihke (Log End Offset, LEO) ja kĂ”rge veetase (Highwater, HW). LEO mĂ€rk sĂ€ilitab viimase sĂ”numi nihke kohalikus replikas, samas kui HW â viimase kinnituse nihke. Pidage meeles, et «kinnituse» staatuse jaoks peab sĂ”num olema salvestatud kĂ”igisse replikatesse ISR. See tĂ€hendab, et LEO jÀÀb tavaliselt natuke HW-st ette.
Kui juht saab sÔnumi, salvestab ta selle kohapeal. JÀrgija teeb tÔmbepÀringu, edastades oma LEO. Siis saadab juht sÔnumite paketti alates sellest LEO-st ja edastab ka aktuaalse HW. Kui juht saab teavet, et kÔik replikad on sÀilitanud sÔnumi antud nihkega, liigub ta HW mÀrgi edasi. Ainult juht vÔib HW-d edasi liikuda ning seega saavad kÔik jÀrgijad selle aktuaalse vÀÀrtuse oma pÀringute vastustes. See tÀhendab, et jÀrgijad vÔivad juhtist maha jÀÀda nii sÔnumites kui ka teadmises HW-st. Tarbijad saavad sÔnumeid ainult kuni aktuaalse HW-ni.
Pange tĂ€hele, et «sĂ€ilitatud» (persisted) tĂ€hendab salvestatud mĂ€lu, mitte kettale. JĂ”udluse huvides viib Kafka kettale sĂŒnkroonimise kindla intervalliga. RabbitMQ-l on samuti selline intervall, kuid see saadab kinnituse vĂ€ljaandjale alles pĂ€rast seda, kui meister ja kĂ”ik peegeldused on sĂ”numi kettale salvestanud. Kafka arendajad otsustasid jĂ”udluse kaalutlustel saata ack nii kiiresti, kui sĂ”num on mĂ€lu salvestatud. Kafka panustab, et liigse replikatsiooni kasutamine kompenseerib lĂŒhiajalise kinnitatud sĂ”numite salvestamise ainult mĂ€llu tekkiva riski.
Juhi rike
Kui juht langeb, teavitab Zookeeper kontrollerit, kes valib uue juhi replikana. Uus juht seab uue HW mĂ€rgi vastavalt oma LEO-le. Siis saavad jĂ€rgijad oma teavet uue juhi kohta. Olenevalt Kafka versioonist valib jĂ€rgija ĂŒhe kahest stsenaariumist:
- LĂŒhendab kohaliku logi tuntud HW-ni ja saadab uuele juhile pĂ€ringu selle mĂ€rgi jĂ€rel olevate sĂ”numite kohta.
- Saadetab liidrile pÀringu, et teada saada HW tema liidriks valimise hetkel, ja seejÀrel kÀrbib logi kuni sellele nihkele. SeejÀrel hakkab ta perioodiliselt pÀringuid tegema valimise algusest peale.
JÀrgnejal vÔivad tekkida vajadus logi kÀrpimise jÀrele jÀrgmistel pÔhjustel:
- Kui liider ebaĂ”nnestub, saab esimene jĂ€rgija ISR-ist, kes on registreeritud Zookeeperis, valimistel vĂ”idu ja temast saab liider. KĂ”ik ISR-is olevad jĂ€rgijad, kuigi neid peetakse "sĂŒnkroniseeritud", ei pruugi endiselt olla saanud endiselt liidri koopiaid kĂ”igist teadetest. On tĂ€iesti vĂ”imalik, et valitud jĂ€rgijal ei ole kĂ”ige ajakohasemat koopiaid. Kafka tagab, et replikate vahel ei esine lahknevusi. SeetĂ”ttu peab iga jĂ€rgija kĂ€rpima oma logi uue liidri HW vÀÀrtuseni tema valimise hetkel, et vĂ€ltida lahknevusi. See on veel ĂŒks pĂ”hjus, miks seadistamine acks=all on nĂ”udlik kooskĂ”la tagamise jaoks.
- Teated kirjutatakse perioodiliselt kettale. Kui kÔik klastrite sÔlmed ebaÔnnestuvad samal ajal, salvestatakse kettale replikad erineva nihkega. On tÀiesti vÔimalik, et kui maaklerid naasevad vÔrku, osutub uus valitud liider oma jÀrgijatest maha jÀÀvaks, kuna ta salvestati kettale varem kui teised.
Klastriga taaskoondumine
Klastriga taaskoondumisel replikad kĂ€ituvad samamoodi nagu liidri ebaĂ”nnestumisel: nad kontrollivad liidri replit ja kĂ€rbivad oma logi tema HW-le (valimise hetkel). VĂ”rdlemiseks kĂ€sitleb RabbitMQ taaskoondatud sĂ”lmi tĂ€iesti uutena. MĂ”lemal juhul loob maakler iga olemasoleva oleku. Kui kasutatakse automaatset sĂŒnkroniseerimist, peab meister replitseerima kogu praeguse sisu uude peegeldusse viisil "ja las kogu maailm ootab". Selle operatsiooni ajal ei aktsepteeri meister ĂŒhtegi lugemise vĂ”i kirjutamise toimingut. Selline lĂ€henemine tekitab probleeme suurte jĂ€rjekordade korral.
Kafka on hajutatud pĂ€evik, ja ĂŒldiselt sĂ€ilitab see rohkem sĂ”numeid kui RabbitMQ jĂ€rjekord, kus andmed eemaldatakse jĂ€rjekorrast pĂ€rast nende lugemist. Aktiivsed jĂ€rjekorrad peaksid jÀÀma suhteliselt vĂ€ikesteks. Kuid Kafka on pĂ€evik oma hoidmisreeglitega, mis vĂ”ivad seadistada tĂ€htaja pĂ€evade vĂ”i nĂ€dalate kaupa. JĂ€rjekorra lukustamise ja tĂ€ieliku sĂŒnkroniseerimise lĂ€henemine ei ole hajutatud pĂ€eviku jaoks tĂ€iesti vastuvĂ”etav. Selle asemel lĂ”ikavad Kafka jĂ€rgijad lihtsalt oma pĂ€eviku HW liidri peale (hetkel, mil ta valitakse), juhul kui nende koopia on liidrist ette. Enamasti, kui jĂ€rgija on maas, alustab ta lihtsalt pĂ€ringute tegemist, alates oma praegsest LEO-st.
Uued vĂ”i taasĂŒhendatud jĂ€rgijad alustavad vĂ€ljaspool ISR-i ja ei osale komiteeringutes. Nad töötavad lihtsalt rĂŒhma kĂ”rval, saades sĂ”numeid nii kiiresti kui saavad, kuni nad jĂ”uavad liidrini ja sisenevad ISR-i. Siin ei ole lukustamist ja pole vaja visata Ă€ra kĂ”iki oma andmeid.
Sidususe rikkumine
Kafkal on rohkem komponente kui RabbitMQ-l, seega on siin keerulisem kÀitumiste kogum, kui klastris esineb sidususe rikkumine. Kuid Kafka kavandati algselt klastrite jaoks, seega on lahendused vÀga hÀsti lÀbi mÔeldud.
Allpool on toodud mÔned sidususe rikkumise stsenaariumid:
- Stsenaarium 1. JÀrgija ei nÀe liidrit, kuid nÀeb endiselt Zookeeperi.
- Stsenaarium 2. Liider ei nĂ€e ĂŒhtegi jĂ€rgijat, kuid nĂ€eb endiselt Zookeeperi.
- Stsenaarium 3. JÀrgija nÀeb liidrit, kuid ei nÀe Zookeeperi.
- Stsenaarium 4. Liider nÀeb jÀrgijaid, kuid ei nÀe Zookeeperi.
- Stsenaarium 5. JÀrgija on tÀielikult eraldatud nii teistest Kafka sÔlmedest kui ka Zookeeperist.
- Stsenaarium 6. Liider on tÀielikult eraldatud nii teistest Kafka sÔlmedest kui ka Zookeeperist.
- Stsenaarium 7. Kafka kontrollsÔlm ei nÀe teist Kafka sÔlme.
- Stsenaarium 8. Kafka kontrollsÔlm ei nÀe Zookeeperit.
Iga stsenaariumi jaoks on ette nÀhtud oma kÀitumine.
Stsenaarium 1. JÀrgija ei nÀe liidrit, kuid nÀeb endiselt Zookeeperi

Joon. 22. Stsenaarium 1. ISR kolme replikaga
Sidususe rikkumine eraldab maakler 3 maakleritest 1 ja 2, kuid mitte Zookeeperist. Maakler 3 ei saa enam pĂ€ringute tegemisega edasi minna. Aja möödudes replica.lag.time.max.ms ta eemaldatakse ISR-ist ja ei osale sĂ”numite commit'ides. Niipea, kui ĂŒhenduvus on taastatud, jĂ€tkab ta andmete pĂ€ringute saatmist ja liitub ISR-iga, kui jĂ”uab juhitajale jĂ€rele. Zookeeper jĂ€tkab pingide vastuvĂ”tmist ja peab brokereid elusateks.

Kujund 23. Stsenaarium 1. Broker eemaldatakse ISR-ist, kui sellelt ei saadeta andmete pÀringut replica.lag.time.max.ms intervali jooksul
Ei ole mingit loogilist jagunemist (split-brain) ega sĂ”lme peatamist, nagu RabbitMQ-s. Selle asemel vĂ€hendada ĂŒleliigsust.
Stsenaarium 2. Juhataja ei nĂ€e ĂŒhtegi jĂ€rgijat, kuid nĂ€eb siiski Zookeeperit

Kujund 24. Stsenaarium 2. Juhataja ja kaks jÀrgijat
VĂ”rgupuutumatuse rikkumine eraldab juhataja jĂ€rgijatelt, kuid broker nĂ€eb Zookeeperit endiselt. Nagu esimese stsenaariumi puhul, ISR kokku tĂ”mbub, kuid seekord ainult juhatajani, kuna kĂ”ik jĂ€rgijad lĂ”petavad andmete pĂ€ringute saatmise. Taaskord, puudub loogiline jagunemine. Selle asemel toimub uute sĂ”numite osas ĂŒleliigsuse kadu, kuni ĂŒhenduvus on taastatud. Zookeeper jĂ€tkab pingide vastuvĂ”tmist ja peab brokereid elusateks.

Kujund 25. Stsenaarium 2. ISR tÔmbus kokku ainult juhatajani
Stsenaarium 3. JÀrgjat nÀeb juhatajat, kuid ei nÀe Zookeeperit
JÀrgjat eraldatakse Zookeeperist, kuid mitte juhatajast koos brokeritega. Selle tulemusena jÀtkab jÀrgija andmete pÀringute saatmist ja on ISR-i liige. Zookeeper ei saa enam pingisid ja registreerib brokera kukkumise, kuid kuna tegemist on ainult jÀrgijaga, pole taastumise jÀrel mingeid tagajÀrgi.

Kujund 26. Stsenaarium 3. JÀrgjat jÀtkab andmete pÀringute saatmist juhatajale
Stsenaarium 4. Juhataja nÀeb jÀrgijaid, kuid ei nÀe Zookeeperit

Kujund 27. Stsenaarium 4. Juhataja ja kaks jÀrgijat
Juhataja on eraldatud Zookeeperist, kuid mitte brokeritest koos jÀrgijatega.

Kujund 28. Stsenaarium 4. Juhataja on Zookeeperist isoleeritud
MĂ”ne aja pĂ€rast registreerib Zookeeper brokera kukkumise ja teavitab sellest kontrollerit. See valib jĂ€rgijate hulgast uue juhataja. Kuid algne juhataja peab endiselt end juhatajaks ja jĂ€tkab kirjeid vastuvĂ”tmist acks=1. JĂ€rgjad ei saada enam andmete pĂ€ringuid, seega peab ta neid surnud ja ĂŒritab ISR-i kokku tĂ”mmata enda peale. Kuid kuna tal puudub ĂŒhendus Zookeeperiga, ei saa ta seda teha ja loobub edasise kirje vastuvĂ”tmisest.
SĂ”numid acks=all ei saa kinnitust, kuna esmalt hĂ”lmab ISR kĂ”iki replikaate ja sĂ”numid ei jĂ”ua nende juurde. Kui algne juht ĂŒritab neid ISR-ist eemaldada, ei saa ta seda teha ja lĂ”petab igasuguste sĂ”numite vastuvĂ”tmise.
Kliendid mÀrkavad peagi juhi vahetust ja hakkavad saatma kirjeid uuele serverile. Kui vÔrk taastub, nÀeb algne juht, et ta ei ole enam juht ja kÀrbib oma logi HW vÀÀrtusele, mis oli uuel juhil enamiku katkestuse hetkel, et vÀltida logide erinevust. Siis hakkab ta saatma pÀringuid uuele juhile. KÔik algse juhi kirjed, mis ei olnud uuele juhile replitseeritud, kaovad. See tÀhendab, et kaovad sÔnumid, mis algne juht ei ole nende paar sekundi jooksul kinnitanud, mil kaks juhti töötasid.

Joonis 29. Stseen 4. Juht brokeris 1 muutub jÀrgijaks vÔrgu taastumise peale
Stseen 5. JÀrgija on tÀielikult eraldatud teistest Kafka sÔlmedest ja Zookeeperist
JÀrgija on tÀielikult isoleeritud teistest Kafka sÔlmedest ja Zookeeperist. Ta eemaldatakse ISR-ist, kuni vÔrk taastub, ja seejÀrel jÀrgib ta teisi.

Joonis 30. Stseen 5. Isoleeritud jÀrgija eemaldatakse ISR-ist
Stseen 6. Juht on tÀielikult eraldatud teistest Kafka sÔlmedest ja Zookeeperist

Joonis 31. Stseen 6. Juht ja kaks jÀrgijat
Juht on tĂ€ielikult isoleeritud oma jĂ€rgijatest, kontrollerist ja Zookeeperist. LĂŒhikese aja jooksul jĂ€tkab ta kirjeid vastu vĂ”tmist. acks=1.

Joonis 32. Stseen 6. Juhi isoleerimine teistest Kafka sÔlmedest ja Zookeeperist
Ei saa pĂ€ringuid pĂ€rast replica.lag.time.max.ms, ta ĂŒritab ISR-i endaks kokku suruda, kuid ei saa seda teha, kuna Zookeeperiga pole ĂŒhendust, siis lĂ”petab ta kirjeid vastu vĂ”tmise.
Samaan, Zookeeper mÀrkab isoleeritud brokerit kui surnud, ja kontroller valib uue juhi.

Joonis 33. Stseen 6. Kaks juhti
Algne juht vÔib vÔtta kirjeid vastu paar sekundi jooksul, kuid seejÀrel lÔpetab ta igasuguste sÔnumite vastuvÔtmise. Kliendid uuendavad iga 60 sekundi tagant viimaseid metaandmeid. Nad saavad teate juhi vahetusest ja hakkavad saatma kirjeid uuele juhile.

Joonis 34. Stseen 6. Tootjad lĂŒlituvad uuele juhile
KĂ”ik kinnitatud kirjed, mille on teinud algne juht alates ĂŒhenduse kadumisest, lĂ€hevad kaotsi. Kui vĂ”rk on taastatud, avastab algne juht Zookeeperi kaudu, et ta ei ole enam juht. SeejĂ€rel lĂŒkkab ta oma logi tagasi uue juhi HW-le hetkest, mil ta valiti, ja hakkab saatma pĂ€ringuid jĂ€rgijana.

Joon. 35. Stsenaarium 6. Algne juht muutub jĂ€rgijaks pĂ€rast vĂ”rgu ĂŒhenduse taastamist
Selles olukorras vĂ”ib lĂŒhikese perioodi jooksul tĂ€heldada loogilist eraldatust, kuid ainult juhul kui acks=1 ja min.insync.replicas loogiline eraldatus lĂ”ppeb automaatselt kas pĂ€rast vĂ”rgu taastamist, kui algne juht mĂ”istab, et ta ei ole enam juht, vĂ”i kui kĂ”ik kliendid mĂ”istavad, et juht on muutunud ja hakkavad kirjutama uuele juhile â sĂ”ltuvalt sellest, mis juhtub varem. Igal juhul toimub alguns sĂ”numite kadu, kuid ainult acks=1.
On olemas teine variant sellest stsenaariumist, kus vahetult enne vĂ”rgu eraldumist jĂ€id jĂ€rgijad maha, ja juht lĂŒhendas ISR-i vaid endani. Siis eraldub ta ĂŒhenduse kaotamise tĂ”ttu. Valitakse uus juht, kuid algne juht jĂ€tkab kirjete vastuvĂ”ttu isegi acks=all, kuna ISR-is pole kedagi peale tema. Need kirjed lĂ€hevad vĂ”rgu taastamisel kaotsi. Ainus viis sellise variandi vĂ€ltimiseks on min.insync.replicas = 2.
Stsenaarium 7. Kafka kontroller ei nÀe teist Kafka sÔlme
Ăldiselt, pĂ€rast ĂŒhenduse katkemist Kafka sĂ”lmega ei suuda kontroller edastada sellele mingit teavet juhi vahetamise kohta. Halvimal juhul toob see kaasa lĂŒhiajalise loogilise eraldatuse, nagu stsenaarium 6. Enamasti ei saa maakler lihtsalt juhtivaks kandidaadiks, kui viimane ebaĂ”nnestub.
Stsenaarium 8. Kafka kontroller ei nÀe Zookeeperi
Ebatavalise Zookeeperi kontroller ei saa pinget ja valib uue Kafka sĂ”lme kontrolleriks. Algne kontroller vĂ”ib jĂ€tkata enda esindamist kui sellist, kuid ei saa Zookeeperilt teateid, seega puuduvad tal ĂŒlesanded tĂ€itmiseks. Kui vĂ”rk taastub, mĂ”istab ta, et ta ei ole enam kontroller, vaid saanud tavaline Kafka sĂ”lm.
JĂ€reldused stsenaariumitest
NĂ€eme, et jĂ€lgijate ĂŒhenduse kadumine ei too kaasa sĂ”numite kaotust, vaid lihtsalt ajutiselt vĂ€hendab ĂŒlejÀÀtuvust, kuni vĂ”rk taastub. See vĂ”ib muidugi pĂ”hjustada andmete kaotust, kui ĂŒks vĂ”i mitu sĂ”lme on kadunud.
Kui ĂŒhenduse kadumise tĂ”ttu juhiĂŒhendus Zookeeperist katkeb, vĂ”ib see tuua kaasa sĂ”numite kadumise. acks=1. Ăhenduse puudumine Zookeeperiga pĂ”hjustab lĂŒhiajalise loogilise jagunemise kahe juhiga. Selle probleemi lahendab parameeter acks=all.
Parameeter min.insync.replicas kahe vĂ”i enama replikaga, mis annab tĂ€iendavaid garanteeringuid, et sellised lĂŒhiajalised stsenaariumid ei too kaasa sĂ”numite kaotust, nagu stsenaariumis 6.
SÔnumite kaotuse kokkuvÔte
Loetleme kÔik viisid, kuidas andmed Kafka-s vÔivad kaduda:
- Iga juhi rike, kui sÔnumid on kinnitatud acks=1
- Iga rĂ€pane juhtimise ĂŒleminek, st jĂ€lgijale, mis on vĂ€ljaspool ISR-i, isegi acks=all
- Juhi isoleerimine Zookeeperist, kui sÔnumid on kinnitatud acks=1
- Juhi tĂ€ielik isoleerimine, kes on juba tĂ”mmanud ISR-i rĂŒhma endast alla. KĂ”ik sĂ”numid on kadunud, isegi acks=all. See on tĂ”si ainult juhul, kui min.insync.replicas=1.
- KÔikide jaotuse sÔlmede samal ajal rikke. Kuna sÔnumid kinnitatakse mÀlust, vÔib osa neist veel ketta kirjutamata jÀÀda. Serverite taaskÀivitamisel vÔib mÔnest sÔnumist puudu olla.
RĂ€pase juhtimise ĂŒleminekuid saab vĂ€ltida kas nende keelamise vĂ”i vĂ€hemalt kahe replikatsiooni tagamisega. KĂ”ige usaldusvÀÀrsem konfiguratsioon on kombinatsioon acks=all ja min.insync.replicas rohkem kui 1.
Langetades RabbitMQ ja Kafka usaldusvÀÀrsuse vahetut vÔrdlust.
UsaldusvÀÀrsuse ja kĂ”rge kĂ€ttesaadavuse tagamiseks on mĂ”lemal platvormil rakendatud peamise ja sekundaarse replikatsiooni sĂŒsteem. Kuid RabbitMQ-l on Achilleuse kand. Vigade taastumisel viskavad sĂ”lmed oma andmed Ă€ra ja sĂŒnkroonimine blokeeritakse. See kahekordne löök seab kahtluse alla suurte jĂ€rjekordade pikaealisuse RabbitMQ-s. Peate leppima kas vĂ€hendatud ĂŒlejÀÀtuvuse vĂ”i pikaajaliste blokeeringutega. ĂlejÀÀtuvuse vĂ€hendamine suurendab massiliste andmekao riski. Ent kui jĂ€rjekorrad on vĂ€ikesed, saab ĂŒlejÀÀtuvuse tagamiseks lĂŒhikeste mittesaadavuse perioodide (mĂ”ned sekundid) tĂ”ttu hakkama ĂŒhenduse uuesti proovimisega.
Kafkas ei ole sellist probleemi. See viskab andmed kĂ”rvale ainult liidri ja jĂ€rgija vaheline erinevuse kohalt. KĂ”ik ĂŒhised andmed sĂ€ilivad. Lisaks ei blokeeri replikatsioon sĂŒsteemi. Liider jĂ€tkab sisestuste vastuvĂ”tmist, samal ajal kui uus jĂ€rgija teda jĂ€rele jĂ”uab, mistĂ”ttu on devops'i jaoks klastriga liitumine vĂ”i uuesti liitumine triviaalne ĂŒlesanne. Loomulikult jÀÀvad kĂ”rvale ka probleemid, nagu replikatsiooni ajal vĂ”rgu lĂ€bilaskevĂ”ime. Kui korraga lisatakse mitu jĂ€rgijat, vĂ”ib esineda lĂ€bilaskevĂ”ime piirangut.
RabbitMQ ĂŒletab Kafkat usaldusvÀÀrsuses, kui mitme serveri rike klastris on samaaegselt toimunud. Nagu me juba rÀÀkisime, saadab RabbitMQ avaldajale kinnituse alles pĂ€rast sĂ”numi kirjutamist kettale peamisel ja kĂ”ikidel peegeldustel. Kuid see toob kaasa tĂ€iendava viivituse kahe pĂ”hjuse tĂ”ttu:
- fsync iga paari sajandi millisekundi jÀrel
- Peegeldamise katkestust saab mÀrgata alles pakettide eluea möödumisel, mis kontrollivad iga sÔlme kÀttesaadavust (net tick). Kui peegel on blokeeritud vÔi vÀljas, lisab see viivituse.
Kafka panustab sellele, et kui sÔnum on salvestatud mitmele sÔlmele, saab sÔnumeid kinnitada, niipea kui need on mÀllu jÔudnud. SeetÔttu on oht kaotada sÔnumeid igasuguses vormis (isegi acks=all, min.insync.replikad=2) juhul, kui samal ajal toimub rike.
Ăldiselt nĂ€itab Kafka kĂ”rgemat jĂ”udlust ja on algselt projekteeritud klastrite jaoks. JĂ€rgjate arvu saab suurendada kuni 11-ni, kui see on vajalik usaldusvÀÀrsuse saavutamiseks. Replikatsiooni suhe 5 ja miniaalne arv sĂŒnkroonitud replikate min.insync.replicas=3 teevad sĂ”numi kaotamise vĂ€ga harvaks sĂŒndmuseks. Kui teie infrastruktuur suudab pakkuda sellist replikatsiooni suhet ja taseme ĂŒleliigsust, vĂ”ite valida selle variandi.
RabbitMQ klasterdamine sobib vĂ€ikeste jĂ€rjekordade jaoks. Kuid isegi vĂ€ikesed jĂ€rjekorrad vĂ”ivad suure liikluse korral kiiresti kasvada. Kui jĂ€rjekorrad saavad suurteks, tuleb teha kindel valik kĂ€ttesaadavuse ja usaldusvÀÀrsuse vahel. RabbitMQ klasterdamine sobib kĂ”ige paremini ebatĂŒĂŒpiliste olukordade jaoks, kus RabbitMQ paindlikkuse eelised kaaluvad ĂŒles selle klasterdamise puudused.
Ăks vastumĂŒrk RabbitMQ haavatavusele suurte jĂ€rjekordade osas on jagada need paljudeks vĂ€iksemateks. Kui ei nĂ”uta kogu jĂ€rjekorra tĂ€ielikku jĂ€rjestamist, vaid ainult konkreetsete sĂ”numite (nĂ€iteks konkreetse kliendi sĂ”numite) vĂ”i hoopis midagi ei jĂ€rjestata, on see variant aktsepteeritav: vaadake minu projekti jĂ€rjekorra jagamiseks (projekt on veel varases staadiumis).
LĂ”puks Ă€rge unustage rida vigu klastrite ja replikatsiooni mehhanismides nii RabbitMQ-s kui ka Kafka-s. Aja jooksul on sĂŒsteemid muutunud kĂŒpsemaks ja stabiilsemaks, kuid ĂŒkski sĂ”num ei ole kunagi 100% kaitstud kadumise eest! Lisaks esinevad andmekeskustes suured Ă”nnetused!
Kui olen midagi vahele jĂ€tnud, teinud vea vĂ”i te ei nĂ”ustu mĂ”ne vĂ€itega, Ă€rge kartke kirjutada kommentaar vĂ”i vĂ”tta minuga ĂŒhendust.
KĂŒsimus, mida sageli kĂŒsin: "Mida valida, Kafka vĂ”i RabbitMQ?", "Milline platvorm on parem?". TĂ”de on see, et see sĂ”ltub tĂ”eliselt teie olukorrast, praegusest kogemusest jne. Ma ei julge oma arvamust avaldada, kuna oleks liiga suur lihtsustamine soovitada ĂŒksikut platvormi kĂ”ikide kasutusvĂ”imaluste ja vĂ”imalike piirangute jaoks. Olen kirjutanud selle artiklite seeria, et saaksite kujundada oma arvamuse.
Tahan öelda, et mĂ”lemad sĂŒsteemid on valdkonna liidrid. VĂ”ib-olla olen ma veidi kallutatud, kuna oma projektide kogemuse pĂ”hjal hindan rohkem selliseid asju nagu sĂ”numite garantii jĂ€rjekord ja usaldusvÀÀrsus.
NĂ€en teisi tehnoloogiaid, millel puudub see usaldusvÀÀrsus ja garanteeritud jĂ€rjestamine, seejĂ€rel vaatan RabbitMQ-d ja Kafka-d â ja mĂ”istan, kui uskumatu vÀÀrtus on mĂ”lemas nendes sĂŒsteemides.
Allikas: habr.com
