Š
Å eit replikÄcijas vienÄ«ba ir nodalÄ«jums. Katrai tÄmai ir viena vai vairÄkas sadaļas. Katrai sadaļai ir vadÄ«tÄjs ar vai bez sekotÄjiem. Veidojot tÄmu, jÅ«s norÄdÄt nodalÄ«jumu skaitu un replikÄcijas koeficientu. ParastÄ vÄrtÄ«ba ir 3, kas nozÄ«mÄ trÄ«s kopijas: viens lÄ«deris un divi sekotÄji.
RÄ«si. 1. Äetras sadaļas ir sadalÄ«tas starp trim brokeriem
Visi lasÄ«Å”anas un rakstÄ«Å”anas pieprasÄ«jumi nonÄk vadÄ«tÄjam. SekotÄji periodiski nosÅ«ta vadÄ«tÄjam pieprasÄ«jumus saÅemt jaunÄkÄs ziÅas. PatÄrÄtÄji nekad nevÄrÅ”as pie sekotÄjiem; pÄdÄjie pastÄv tikai atlaiÅ”anas un kļūdu tolerances dÄļ.
Sadalījuma kļūme
Kad brokeris neizdodas, nereti neizdodas izgÄzties vairÄku sadaļu vadÄ«tÄji. KatrÄ no tiem par lÄ«deri kļūst sekotÄjs no cita mezgla. Faktiski tas ne vienmÄr notiek, jo sinhronizÄcijas faktors arÄ« ietekmÄ: vai ir sinhronizÄti sekotÄji, un, ja nÄ, tad vai ir atļauta pÄreja uz nesinhronizÄtu repliku. Bet pagaidÄm nesarežģīsim lietas.
Brokeris 3 atstÄj tÄ«klu, un 2. sadaÄ¼Ä tiek ievÄlÄts jauns vadÄ«tÄjs.
RÄ«si. 2. Brokeris 3 nomirst, un viÅa sekotÄjs brokerim 2 tiek ievÄlÄts par jauno 2. nodalÄ«juma vadÄ«tÄju.
Tad brokeris 1 aiziet un arÄ« 1. sadaļa zaudÄ savu lÄ«deri, kura loma pÄriet 2. brokerim.
RÄ«si. 3. Palicis viens brokeris. Visi vadÄ«tÄji ir pie viena brokera ar nulles atlaiÅ”anu
Kad brokeris 1 atgriežas tieÅ”saistÄ, tas pievieno Äetrus sekotÄjus, nodroÅ”inot zinÄmu atlaiÅ”anu katram nodalÄ«jumam. Bet visi lÄ«deri joprojÄm palika uz 2. brokera.
RÄ«si. 4. LÄ«deri paliek 2. brokerim
Kad parÄdÄs brokeris 3, mÄs atgriežamies pie trim replikÄm katrÄ nodalÄ«jumÄ. Bet visi lÄ«deri joprojÄm ir brokeris 2.
RÄ«si. 5. NesabalansÄts lÄ«deru izvietojums pÄc brokeru 1. un 3. atjaunoÅ”anas
Kafkai ir rÄ«ks labÄkai lÄ«deru lÄ«dzsvara atjaunoÅ”anai nekÄ RabbitMQ. Tur bija jÄizmanto treÅ”Äs puses spraudnis vai skripts, kas mainÄ«ja galvenÄ mezgla migrÄÅ”anas politikas, samazinot dublÄÅ”anu migrÄcijas laikÄ. TurklÄt lielÄm rindÄm mums bija jÄpieÅem nepieejamÄ«ba sinhronizÄcijas laikÄ.
Kafkai ir jÄdziens āvÄlamÄs kopijasā lÄ«dera lomai. Kad tiek izveidoti tÄmu nodalÄ«jumi, Kafka mÄÄ£ina vienmÄrÄ«gi sadalÄ«t lÄ«derus pa mezgliem un atzÄ«mÄ Å”os pirmos lÄ«derus kÄ vÄlamos. Laika gaitÄ servera atsÄknÄÅ”anas, kļūmju un savienojamÄ«bas bojÄjumu dÄļ lÄ«deri var nonÄkt citos mezglos, kÄ tas ir iepriekÅ” aprakstÄ«tajÄ galÄjÄ gadÄ«jumÄ.
Lai to labotu, Kafka piedÄvÄ divas iespÄjas:
- Opcija auto.leader.rebalance.enable=true ļauj kontrollera mezglam automÄtiski atkÄrtoti pieŔķirt lÄ«derus atpakaļ vÄlamajÄm replikÄm un tÄdÄjÄdi atjaunot vienotu sadalÄ«jumu.
- Administrators var palaist skriptu kafka-preferred-replica-election.sh manuÄlai pÄrcelÅ”anai.
RÄ«si. 6. Replikas pÄc balansÄÅ”anas
Å Ä« bija neveiksmes vienkÄrÅ”ota versija, taÄu realitÄte ir sarežģītÄka, lai gan Å”eit nav nekÄ pÄrÄk sarežģīta. Tas viss ir saistÄ«ts ar sinhronizÄtÄm replikÄm (In-Sync Replicas, ISR).
SinhronizÄtÄs kopijas (ISR)
ISR ir nodalÄ«juma kopiju kopa, kas tiek uzskatÄ«ta par āsinhronizÄtuā (sinhronizÄtu). Ir lÄ«deris, bet var nebÅ«t sekotÄju. SekotÄjs tiek uzskatÄ«ts par sinhronizÄtu, ja tas ir izveidojis precÄ«zas visu lÄ«dera ziÅojumu kopijas pirms intervÄla beigÄm replica.lag.time.max.ms.
SekotÄjs tiek noÅemts no ISR kopas, ja:
- neiesniedza pieprasÄ«jumu atlasÄ«t intervÄlu replica.lag.time.max.ms (domÄjams, ka miris)
- intervÄlÄ neizdevÄs atjauninÄt replica.lag.time.max.ms (tiek uzskatÄ«ts par lÄnu)
SekotÄji veic izlases pieprasÄ«jumus intervÄlÄ replica.fetch.wait.max.ms, kas pÄc noklusÄjuma ir 500 ms.
Lai skaidri izskaidrotu ISR mÄrÄ·i, mums ir jÄaplÅ«ko ražotÄja apstiprinÄjumi un daži neveiksmju scenÄriji. RažotÄji var izvÄlÄties, kad brokeris nosÅ«ta apstiprinÄjumu:
- acks=0, apstiprinÄjums nav nosÅ«tÄ«ts
- acks=1, apstiprinÄjums tiek nosÅ«tÄ«ts pÄc tam, kad vadÄ«tÄjs ir uzrakstÄ«jis ziÅojumu savam lokÄlajam žurnÄlam
- acks=all, apstiprinÄjums tiek nosÅ«tÄ«ts pÄc tam, kad visas ISR kopijas ir ierakstÄ«juÅ”as ziÅojumu lokÄlajos žurnÄlos
PÄc Kafkas terminoloÄ£ijas, ja ISR ir saglabÄjis ziÅojumu, tas ir āapÅÄmiesā. Acks=all ir droÅ”ÄkÄ iespÄja, taÄu tÄ arÄ« pievieno papildu aizkavi. ApskatÄ«sim divus neveiksmju piemÄrus un to, kÄ dažÄdas āackā iespÄjas mijiedarbojas ar ISR koncepciju.
Acks=1 un ISR
Å ajÄ piemÄrÄ mÄs redzÄsim, ka, ja vadÄ«tÄjs negaida, lÄ«dz tiks saglabÄts katrs ziÅojums no visiem sekotÄjiem, tad ir iespÄjams datu zudums, ja vadÄ«tÄjs neizdodas. PÄrvietoÅ”anos uz nesinhronizÄtu sekotÄju var iespÄjot vai atspÄjot, iestatot netÄ«rs.vadÄ«tÄjs.vÄlÄÅ”anas.iespÄjot.
Å ajÄ piemÄrÄ ražotÄja vÄrtÄ«ba ir acks=1. Sadaļa ir sadalÄ«ta starp visiem trim brokeriem. Broker 3 ir aiz muguras, tas sinhronizÄjÄs ar lÄ«deri pirms astoÅÄm sekundÄm un tagad atpaliek par 7456 ziÅojumiem. Brokeris 1 atpalika tikai par sekundi. MÅ«su producents nosÅ«ta ziÅu un Ätri saÅem atbildi, bez lÄniem vai miruÅ”iem sekotÄjiem, kurus lÄ«deris negaida.
RÄ«si. 7. ISR ar trim replikÄm
Broker 2 neizdodas, un ražotÄjs saÅem savienojuma kļūdu. PÄc tam, kad vadÄ«ba tiek nodota brokerim 1, mÄs zaudÄjam 123 ziÅojumus. 1. brokera sekotÄjs bija daļa no ISR, bet nebija pilnÄ«bÄ sinhronizÄts ar lÄ«deri, kad tas kritÄs.
RÄ«si. 8. ZiÅojumi tiek zaudÄti, kad tas avarÄ
KonfigurÄcijÄ bootstrap.servers RažotÄjam ir norÄdÄ«ti vairÄki brokeri, un tas var jautÄt citam brokerim, kurÅ” ir jaunais sadaļas vadÄ«tÄjs. PÄc tam tas izveido savienojumu ar brokeri 1 un turpina sÅ«tÄ«t ziÅojumus.
RÄ«si. 9. ZiÅojumu sÅ«tÄ«Å”ana tiek atsÄkta pÄc neliela pÄrtraukuma
Brokeris 3 atpaliek vÄl vairÄk. Tas veic ieneÅ”anas pieprasÄ«jumus, bet nevar sinhronizÄt. Tas var bÅ«t saistÄ«ts ar lÄnu tÄ«kla savienojumu starp brokeriem, krÄtuves problÄmu utt. Tas ir noÅemts no ISR. Tagad ISR sastÄv no viena replika - lÄ«dera! RažotÄjs turpina sÅ«tÄ«t ziÅojumus un saÅemt apstiprinÄjumus.
RÄ«si. 10. Brokera 3 sekotÄjs tiek noÅemts no ISR
Brokeris 1 zaudÄ spÄku, un lÄ«dera loma tiek pieŔķirta brokerim 3, zaudÄjot 15286 ziÅojumus! RažotÄjs saÅem savienojuma kļūdas ziÅojumu. PÄreja uz lÄ«deri Ärpus ISR bija iespÄjama tikai iestatÄ«juma dÄļ unclean.leader.election.enable=true. Ja tas ir instalÄts nepatiess, tad pÄreja nenotiktu un visi lasÄ«Å”anas un rakstÄ«Å”anas pieprasÄ«jumi tiktu noraidÄ«ti. Å ajÄ gadÄ«jumÄ mÄs gaidÄm, kamÄr brokeris 1 atgriezÄ«sies ar neskartiem datiem replikÄ, kas atkal pÄrÅems vadÄ«bu.
RÄ«si. 11. Brokeris 1 krÄ«t. Ja rodas kļūme, tiek zaudÄts liels skaits ziÅojumu
Producents nodibina saikni ar pÄdÄjo brokeri un redz, ka tagad ir sadaļas vadÄ«tÄjs. ViÅÅ” sÄk sÅ«tÄ«t ziÅojumus brokerim 3.
RÄ«si. 12. PÄc neliela pÄrtraukuma ziÅas atkal tiek nosÅ«tÄ«tas uz 0. sadaļu
MÄs redzÄjÄm, ka, neskaitot Ä«sus pÄrtraukumus, lai izveidotu jaunus savienojumus un meklÄtu jaunu vadÄ«tÄju, ražotÄjs nepÄrtraukti sÅ«tÄ«ja ziÅojumus. Å Ä« konfigurÄcija nodroÅ”ina pieejamÄ«bu uz konsekvences (datu droŔības) rÄÄ·ina. Kafka pazaudÄja tÅ«kstoÅ”iem ziÅojumu, bet turpinÄja pieÅemt jaunus rakstus.
Acks=all un ISR
AtkÄrtosim Å”o scenÄriju vÄlreiz, bet ar acks=viss. Broker 3 vidÄjais latentums ir Äetras sekundes. RažotÄjs nosÅ«ta ziÅojumu ar acks=viss, un tagad nesaÅem Ätru atbildi. VadÄ«tÄjs gaida, lÄ«dz ziÅojums tiks saglabÄts visÄs ISR replikÄs.
RÄ«si. 13. ISR ar trim replikÄm. Viens ir lÄns, kÄ rezultÄtÄ ierakstÄ«Å”ana aizkavÄjas
PÄc Äetru sekunžu papildu kavÄÅ”anÄs brokeris 2 nosÅ«ta apstiprinÄjumu. Visas kopijas tagad ir pilnÄ«bÄ atjauninÄtas.
RÄ«si. 14. Visas kopijas saglabÄ ziÅas un nosÅ«ta apstiprinÄjumu
Brokeris 3 tagad atpaliek un tiek noÅemts no ISR. Latentums ir ievÄrojami samazinÄts, jo ISR nav palicis lÄnas kopijas. Brokeris 2 tagad gaida tikai brokeri 1, un viÅam ir vidÄjÄ nobÄ«de 500 ms.
RÄ«si. 15. Brokera 3 kopija tiek noÅemta no ISR
PÄc tam 2. brokeris krÄ«t un vadÄ«ba pÄriet 1. brokerim, nezaudÄjot ziÅojumus.
Rīsi. 16. Brokeris 2 krīt
RažotÄjs atrod jaunu vadÄ«tÄju un sÄk viÅam sÅ«tÄ«t ziÅojumus. Latentums ir vÄl vairÄk samazinÄts, jo ISR tagad sastÄv no vienas kopijas! TÄpÄc iespÄja acks=viss nepievieno atlaiÅ”anu.
RÄ«si. 17. Broker 1 replika uzÅemas vadÄ«bu, nezaudÄjot ziÅojumus
PÄc tam brokeris 1 avarÄ, un pÄrsvars nonÄk brokerim 3, zaudÄjot 14238 ziÅojumus!
RÄ«si. 18. Broker 1 nomirst, un vadÄ«bas maiÅa ar netÄ«riem iestatÄ«jumiem izraisa plaÅ”u datu zudumu
MÄs nevarÄjÄm instalÄt opciju netÄ«rs.vadÄ«tÄjs.vÄlÄÅ”anas.iespÄjot nozÄ«mÄ patiess. PÄc noklusÄjuma tas ir vienÄds nepatiess. IestatÄ«jumi acks=viss Ń unclean.leader.election.enable=true nodroÅ”ina pieejamÄ«bu ar papildu datu droŔību. Bet, kÄ redzat, mÄs joprojÄm varam zaudÄt ziÅojumus.
Bet ko darÄ«t, ja mÄs vÄlamies palielinÄt datu droŔību? Var likt unclean.leader.election.enable = false, taÄu tas mÅ«s ne vienmÄr pasargÄs no datu zuduma. Ja vadÄ«tÄjs smagi nokrita un paÅÄma datus lÄ«dzi, tad ziÅojumi joprojÄm tiek zaudÄti, kÄ arÄ« tiek zaudÄta pieejamÄ«ba, lÄ«dz administrators atjauno situÄciju.
LabÄk ir nodroÅ”inÄt, lai visi ziÅojumi bÅ«tu lieki, un citÄdi atmest ierakstu. Tad, vismaz no brokera viedokļa, datu zudums ir iespÄjams tikai divu vai vairÄku vienlaicÄ«gu kļūmju gadÄ«jumÄ.
Acks=all, min.insync.replicas un ISR
Ar tÄmas konfigurÄciju min.insync.replicas MÄs paaugstinÄm datu droŔības lÄ«meni. VÄlreiz iziesim cauri iepriekÅ”ÄjÄ scenÄrija pÄdÄjai daļai, bet Å”oreiz ar min.insync.replicas=2.
TÄtad 2. brokerim ir replikas lÄ«deris, un 3. brokera sekotÄjs tiek noÅemts no ISR.
RÄ«si. 19. ISR no divÄm replikÄm
Brokeris 2 krÄ«t, un vadÄ«ba pÄriet brokerim 1, nezaudÄjot ziÅojumus. Bet tagad ISR sastÄv tikai no vienas kopijas. Tas neatbilst minimÄlajam ierakstu saÅemÅ”anas skaitam, un tÄpÄc brokeris uz rakstÄ«Å”anas mÄÄ£inÄjumu reaÄ£Ä ar kļūdu NotEnoughReplicas.
RÄ«si. 20. ISR skaits ir par vienu mazÄks, nekÄ norÄdÄ«ts failÄ min.insync.replicas
Å Ä« konfigurÄcija upurÄ pieejamÄ«bu konsekvences dÄļ. Pirms ziÅojuma apstiprinÄÅ”anas mÄs nodroÅ”inÄm, ka tas ir ierakstÄ«ts vismaz divÄs replikÄs. Tas dod ražotÄjam daudz lielÄku pÄrliecÄ«bu. Å eit ziÅojuma zudums ir iespÄjams tikai tad, ja divas replikas vienlaikus neizdodas Ä«sÄ intervÄlÄ, lÄ«dz ziÅojums tiek replicÄts papildu sekotÄjam, kas ir maz ticams. Bet, ja esat ļoti paranoisks, varat iestatÄ«t replikÄcijas koeficientu uz 5 un min.insync.replicas ar 3. Å eit trÄ«s brokeriem ir jÄkrÄ«t vienlaikus, lai zaudÄtu rekordu! Protams, jÅ«s maksÄjat par Å”o uzticamÄ«bu papildu latentumÄ.
Kad pieejamība ir nepiecieŔama datu droŔībai
KÄ iekÅ”Ä
- Vai izdevÄjs var vienkÄrÅ”i atgriezt kļūdu un likt augÅ”Äjam pakalpojumam vai lietotÄjam vÄlÄk mÄÄ£inÄt vÄlreiz?
- Vai izdevÄjs var saglabÄt ziÅojumu lokÄli vai datu bÄzÄ, lai vÄlÄk mÄÄ£inÄtu vÄlreiz?
Ja atbilde ir nÄ, pieejamÄ«bas optimizÄÅ”ana uzlabo datu droŔību. JÅ«s zaudÄsiet mazÄk datu, ja izvÄlÄsieties pieejamÄ«bu, nevis neierakstÄ«sit. TÄdÄjÄdi viss ir lÄ«dzsvara atraÅ”ana, un lÄmums ir atkarÄ«gs no konkrÄtÄs situÄcijas.
ISR nozīme
ISR komplekts ļauj izvÄlÄties optimÄlo lÄ«dzsvaru starp datu droŔību un latentumu. PiemÄram, nodroÅ”iniet pieejamÄ«bu lielÄkÄs daļas kopiju atteices gadÄ«jumÄ, samazinot miruÅ”o vai lÄno kopiju ietekmi latentuma ziÅÄ.
MÄs paÅ”i izvÄlamies nozÄ«mi replica.lag.time.max.ms atbilstoÅ”i jÅ«su vajadzÄ«bÄm. BÅ«tÄ«bÄ Å”is parametrs nozÄ«mÄ, cik lielu kavÄÅ”anos mÄs esam gatavi pieÅemt, kad acks=viss. NoklusÄjuma vÄrtÄ«ba ir desmit sekundes. Ja tas jums ir pÄrÄk garÅ”, varat to samazinÄt. Tad ISR izmaiÅu biežums palielinÄsies, jo sekotÄji tiks noÅemti un pievienoti biežÄk.
RabbitMQ ir vienkÄrÅ”i spoguļu komplekts, kas ir jÄatkÄrto. LÄni spoguļi ievieÅ” papildu latentumu, un miruÅ”ie spoguļi var gaidÄ«t, lÄ«dz paketes, kas pÄrbauda katra mezgla pieejamÄ«bu (tÄ«kla atzÄ«me), atbild. ISR ir interesants veids, kÄ izvairÄ«ties no Ŕīm latentuma problÄmÄm. Bet mÄs riskÄjam zaudÄt atlaiÅ”anu, jo ISR var sarukt tikai lÄ«dz lÄ«derim. Lai izvairÄ«tos no Ŕī riska, izmantojiet iestatÄ«jumu min.insync.replicas.
Klienta savienojuma garantija
IestatÄ«jumos bootstrap.servers ražotÄjs un patÄrÄtÄjs var norÄdÄ«t vairÄkus brokerus klientu savienoÅ”anai. Ideja ir tÄda, ka, kad viens mezgls pazÅ«d, paliek vairÄki rezerves, ar kurÄm klients var atvÄrt savienojumu. Tie nav obligÄti sekciju lÄ«deri, bet vienkÄrÅ”i tramplÄ«ns sÄkotnÄjai iekrauÅ”anai. Klients var jautÄt, kurÅ” mezgls mitina lasÄ«Å”anas/rakstÄ«Å”anas nodalÄ«juma vadÄ«tÄju.
ProgrammÄ RabbitMQ klienti var izveidot savienojumu ar jebkuru mezglu, un iekÅ”ÄjÄ marÅ”rutÄÅ”ana nosÅ«ta pieprasÄ«jumu uz vietu, kur tam jÄnonÄk. Tas nozÄ«mÄ, ka RabbitMQ priekÅ”Ä varat uzstÄdÄ«t slodzes balansÄtÄju. Kafka pieprasa klientiem izveidot savienojumu ar mezglu, kurÄ atrodas atbilstoÅ”ais nodalÄ«juma vadÄ«tÄjs. Å ÄdÄ situÄcijÄ jÅ«s nevarat instalÄt slodzes balansÄtÄju. Saraksts bootstrap.servers Ir ļoti svarÄ«gi, lai klienti pÄc kļūmes varÄtu piekļūt un atrast pareizos mezglus.
Kafkas konsensa arhitektūra
LÄ«dz Å”im neesam apsvÄruÅ”i, kÄ klasteris uzzina par brokera kriÅ”anu un kÄ tiek ievÄlÄts jauns vadÄ«tÄjs. Lai saprastu, kÄ Kafka darbojas ar tÄ«kla nodalÄ«jumiem, vispirms ir jÄsaprot vienprÄtÄ«bas arhitektÅ«ra.
Katrs Kafka klasteris tiek izvietots kopÄ ar Zookeeper klasteru, kas ir izplatÄ«ts vienprÄtÄ«bas pakalpojums, kas ļauj sistÄmai panÄkt vienprÄtÄ«bu par noteiktu stÄvokli, prioritÄti izvirzot konsekvenci, nevis pieejamÄ«bu. Lai apstiprinÄtu lasÄ«Å”anas un rakstÄ«Å”anas darbÄ«bas, ir nepiecieÅ”ama vairuma Zookeeper mezglu piekriÅ”ana.
Zookeeper saglabÄ klastera stÄvokli:
- TÄmu saraksts, sadaļas, konfigurÄcija, paÅ”reizÄjÄs lÄ«deru kopijas, vÄlamÄs kopijas.
- Klastera dalÄ«bnieki. Katrs brokeris pings Zookeeper klasterim. Ja noteiktÄ laika periodÄ tas nesaÅem ping, Zookeeper reÄ£istrÄ brokeri kÄ nepieejamu.
- Kontroliera galveno un rezerves mezglu izvÄle.
Kontroliera mezgls ir viens no Kafka brokeriem, kas ir atbildÄ«gs par kopiju vadÄ«tÄju ievÄlÄÅ”anu. Zookeeper nosÅ«ta kontrolierim paziÅojumus par klastera dalÄ«bu un tÄmu izmaiÅÄm, un kontrolierim ir jÄrÄ«kojas, lai Ŕīs izmaiÅas tiktu ievÄrotas.
PiemÄram, Åemsim jaunu tÄmu ar desmit nodalÄ«jumiem un replikÄcijas koeficientu 3. Kontrolierim ir jÄievÄl vadÄ«tÄjs katram nodalÄ«jumam, cenÅ”oties optimÄli sadalÄ«t lÄ«derus starp brokeriem.
Katram sekcijas kontrollerim:
- atjaunina informÄciju Zookeeper par ISR un vadÄ«tÄju;
- NosÅ«ta LeaderAndISRCommand katram brokerim, kas mitina Ŕī nodalÄ«juma kopiju, informÄjot brokerus par ISR un vadÄ«tÄju.
Kad brokeris ar vadÄ«tÄju krÄ«t, Zookeeper nosÅ«ta paziÅojumu kontrolierim, un tas ievÄl jaunu vadÄ«tÄju. Atkal kontrolieris vispirms atjaunina Zookeeper un pÄc tam nosÅ«ta komandu katram brokerim, informÄjot par vadÄ«bas maiÅu.
Katrs vadÄ«tÄjs ir atbildÄ«gs par ISR pieÅemÅ”anu darbÄ. IestatÄ«jumi replica.lag.time.max.ms nosaka, kas tur ienÄks. Kad ISR mainÄs, vadÄ«tÄjs nosÅ«ta jaunu informÄciju Zookeeper.
Zookeeper vienmÄr tiek informÄts par jebkurÄm izmaiÅÄm, lai neveiksmes gadÄ«jumÄ vadÄ«ba vienmÄrÄ«gi pÄrietu uz jaunu vadÄ«tÄju.
RÄ«si. 21. Kafkas konsenss
ReplikÄcijas protokols
Izpratne par replikÄcijas detaļÄm palÄ«dz labÄk izprast iespÄjamos datu zuduma scenÄrijus.
Izlases vaicÄjumi, žurnÄla beigu nobÄ«de (LEO) un Highwater Mark (HW)
MÄs uzskatÄ«jÄm, ka sekotÄji periodiski nosÅ«ta vadÄ«tÄjam pieprasÄ«jumus nolasÄ«t. NoklusÄjuma intervÄls ir 500 ms. Tas atŔķiras no RabbitMQ ar to, ka RabbitMQ replikÄciju ierosina nevis rindas spogulis, bet gan galvenais. Meistars piespiež izmaiÅas uz spoguļiem.
VadÄ«tÄjs un visi sekotÄji saglabÄ Å¾urnÄla beigu nobÄ«di (LEO) un Highwater (HW) etiÄ·eti. LEO atzÄ«me saglabÄ pÄdÄjÄ ziÅojuma nobÄ«di vietÄjÄ replikÄ, un HW saglabÄ pÄdÄjÄs saistÄ«bas nobÄ«di. Atcerieties, ka, lai nodroÅ”inÄtu izpildes statusu, ziÅojumam ir jÄbÅ«t saglabÄtam visÄs ISR replikÄs. Tas nozÄ«mÄ, ka LEO parasti ir nedaudz priekÅ”Ä HW.
Kad vadÄ«tÄjs saÅem ziÅojumu, tas to saglabÄ lokÄli. SekotÄjs veic ieneÅ”anas pieprasÄ«jumu, nosÅ«tot savu LEO. PÄc tam vadÄ«tÄjs nosÅ«ta ziÅojumu sÄriju, sÄkot no Ŕī LEO, kÄ arÄ« pÄrsÅ«ta paÅ”reizÄjo HW. Kad vadÄ«tÄjs saÅem informÄciju, ka visas replikas ir saglabÄjuÅ”as ziÅojumu norÄdÄ«tajÄ nobÄ«dÄ, tas pÄrvieto HW atzÄ«mi. Tikai vadÄ«tÄjs var pÄrvietot HW, un tÄpÄc visi sekotÄji atbildÄs uz viÅu pieprasÄ«jumu zinÄs paÅ”reizÄjo vÄrtÄ«bu. Tas nozÄ«mÄ, ka sekotÄji var atpalikt no lÄ«dera gan vÄstÄ«jumÄ, gan HW zinÄÅ”anÄs. PatÄrÄtÄji saÅem ziÅas tikai lÄ«dz paÅ”reizÄjam HW.
Å emiet vÄrÄ, ka "pastÄvÄja" nozÄ«mÄ ierakstÄ«tu atmiÅÄ, nevis diskÄ. Lai nodroÅ”inÄtu veiktspÄju, Kafka noteiktÄ intervÄlÄ sinhronizÄjas ar disku. RabbitMQ arÄ« ir Å”Äds intervÄls, taÄu tas nosÅ«tÄ«s apstiprinÄjumu izdevÄjam tikai pÄc tam, kad meistars un visi spoguļi bÅ«s ierakstÄ«juÅ”i ziÅojumu diskÄ. Kafka izstrÄdÄtÄji veiktspÄjas apsvÄrumu dÄļ nolÄma nosÅ«tÄ«t apstiprinÄjumu, tiklÄ«dz ziÅojums ir ierakstÄ«ts atmiÅÄ. Kafka der, ka atlaiÅ”ana atsver risku Ä«slaicÄ«gi saglabÄt apstiprinÄtos ziÅojumus tikai atmiÅÄ.
LÄ«dera neveiksme
Kad lÄ«deris krÄ«t, Zookeeper par to informÄ kontrolieri, un tas izvÄlas jaunu lÄ«dera kopiju. Jaunais vadÄ«tÄjs nosaka jaunu HW atzÄ«mi saskaÅÄ ar savu LEO. PÄc tam sekotÄji saÅem informÄciju par jauno vadÄ«tÄju. AtkarÄ«bÄ no Kafkas versijas sekotÄjs izvÄlÄsies vienu no diviem scenÄrijiem:
- Tas saÄ«sinÄs vietÄjo žurnÄlu uz zinÄmu HW un nosÅ«tÄ«s jaunajam vadÄ«tÄjam pieprasÄ«jumu pÄc ziÅojumiem pÄc Ŕīs atzÄ«mes.
- NosÅ«tÄ«s vadÄ«tÄjam pieprasÄ«jumu noskaidrot HW brÄ«dÄ«, kad viÅÅ” tika ievÄlÄts par vadÄ«tÄju, un pÄc tam saÄ«sina žurnÄlu lÄ«dz Å”ai nobÄ«dei. PÄc tam tas sÄks veikt periodiskus ielÄdes pieprasÄ«jumus, sÄkot ar Å”o nobÄ«di.
SekotÄjam, iespÄjams, bÅ«s jÄsaÄ«sina žurnÄls Å”Ädu iemeslu dÄļ:
- Ja lÄ«derim neizdodas, pirmais sekotÄjs ISR komplektÄ, kas reÄ£istrÄts Zookeeper, uzvar vÄlÄÅ”anÄs un kļūst par lÄ«deri. Lai gan visi ISR āāsekotÄji tiek uzskatÄ«ti par āsinhronizÄtiemā, iespÄjams, nav saÅÄmuÅ”i visu ziÅojumu kopijas no bijuÅ”Ä vadÄ«tÄja. PilnÄ«gi iespÄjams, ka piedÄvÄtajam sekotÄjam nav visjaunÄkÄs kopijas. Kafka nodroÅ”ina, ka starp replikÄm nav atŔķirÄ«bu. TÄdÄjÄdi, lai izvairÄ«tos no neatbilstÄ«bÄm, katram sekotÄjam ir jÄsaÄ«sina savs žurnÄls lÄ«dz jaunÄ lÄ«dera HW vÄrtÄ«bai viÅa ievÄlÄÅ”anas brÄ«dÄ«. Tas ir vÄl viens iemesls, kÄpÄc iestatÄ«t acks=viss tik svarÄ«gi konsekvencei.
- ZiÅojumi periodiski tiek ierakstÄ«ti diskÄ. Ja visi klastera mezgli neizdodas vienlaikus, diskos tiks saglabÄtas kopijas ar dažÄdÄm nobÄ«dÄm. IespÄjams, ka tad, kad brokeri atgriezÄ«sies tieÅ”saistÄ, jaunais ievÄlÄtais lÄ«deris bÅ«s aiz saviem sekotÄjiem, jo āāviÅÅ” tika saglabÄts diskÄ pirms citiem.
AtkalapvienoÅ”anÄs ar klasteru
AtkÄrtoti pievienojoties klasterim, kopijas rÄ«kojas tÄpat kÄ tad, ja lÄ«derim neizdodas: tÄs pÄrbauda lÄ«dera kopiju un saÄ«sina savu žurnÄlu uz tÄ HW (ievÄlÄÅ”anas laikÄ). SalÄ«dzinÄjumam, RabbitMQ atkÄrtoti apvienotos mezglus uzskata par pilnÄ«gi jauniem. Abos gadÄ«jumos brokeris atmet jebkuru esoÅ”o stÄvokli. Ja tiek izmantota automÄtiskÄ sinhronizÄcija, kapteinim ir jÄreplicÄ pilnÄ«gi viss paÅ”reizÄjais saturs jaunajÄ spogulÄ«, izmantojot metodi āļaujiet visai pasaulei gaidÄ«tā. Å Ä«s darbÄ«bas laikÄ kapteinis nepieÅem nekÄdas lasÄ«Å”anas vai rakstÄ«Å”anas darbÄ«bas. Å Ä« pieeja rada problÄmas lielÄs rindÄs.
Kafka ir izplatÄ«ts žurnÄls, un kopumÄ tajÄ tiek saglabÄts vairÄk ziÅojumu nekÄ RabbitMQ rindÄ, kurÄ dati tiek noÅemti no rindas pÄc to nolasÄ«Å”anas. AktÄ«vajÄm rindÄm jÄpaliek salÄ«dzinoÅ”i mazÄm. Bet Kafka ir žurnÄls ar savu saglabÄÅ”anas politiku, kas var noteikt dienu vai nedÄļu periodu. Rindas bloÄ·ÄÅ”anas un pilnÄ«gas sinhronizÄcijas pieeja izplatÄ«tam žurnÄlam ir absolÅ«ti nepieÅemama. TÄ vietÄ Kafkas sekotÄji vienkÄrÅ”i saÄ«sina savu žurnÄlu lÄ«dz vadÄ«tÄja HW (viÅa ievÄlÄÅ”anas laikÄ), ja viÅu kopija ir priekÅ”Ä vadÄ«tÄjam. VisticamÄkajÄ gadÄ«jumÄ, kad sekotÄjs atpaliek, tas vienkÄrÅ”i sÄk veikt ieneÅ”anas pieprasÄ«jumus, sÄkot ar paÅ”reizÄjo LEO.
Jauni vai atkÄrtoti pievienotie sekotÄji sÄk darboties Ärpus ISR un nepiedalÄs saistÄ«bÄs. ViÅi vienkÄrÅ”i strÄdÄ kopÄ ar grupu, saÅemot ziÅas, cik Ätri vien iespÄjams, lÄ«dz panÄk vadÄ«tÄju un ieiet ISR. Nav bloÄ·ÄÅ”anas un nav jÄizmet visi jÅ«su dati.
Savienojuma zudums
Kafka ir vairÄk komponentu nekÄ RabbitMQ, tÄpÄc tai ir sarežģītÄks darbÄ«bu kopums, kad klasteris tiek atvienots. TaÄu Kafka sÄkotnÄji bija paredzÄta klasteriem, tÄpÄc risinÄjumi ir ļoti pÄrdomÄti.
TÄlÄk ir norÄdÄ«ti vairÄki savienojuma kļūmju scenÄriji.
- 1. scenÄrijs: sekotÄjs neredz vadÄ«tÄju, bet joprojÄm redz ZoodÄrza sargu.
- 2. scenÄrijs: lÄ«deris neredz nevienu sekotÄju, bet joprojÄm redz Zookeeper.
- 3. scenÄrijs: sekotÄjs redz vadÄ«tÄju, bet neredz zoodÄrza sargu.
- 4. scenÄrijs: vadÄ«tÄjs redz sekotÄjus, bet neredz ZoodÄrza sargu.
- 5. scenÄrijs: sekotÄjs ir pilnÄ«bÄ noŔķirts gan no citiem Kafka mezgliem, gan no Zookeeper.
- 6. scenÄrijs: vadÄ«tÄjs ir pilnÄ«bÄ noŔķirts no abiem Kafkas mezgliem un Zookeeper.
- 7. scenÄrijs: Kafka kontrollera mezgls nevar redzÄt citu Kafka mezglu.
- 8. scenÄrijs: Kafka kontrolieris neredz Zookeeper.
Katram scenÄrijam ir sava uzvedÄ«ba.
1. scenÄrijs: sekotÄjs neredz vadÄ«tÄju, bet joprojÄm redz Zookeeper
RÄ«si. 22. 1. scenÄrijs: trÄ«s kopiju ISR
Savienojuma kļūme atdala brokeri 3 no starpniekiem 1 un 2, bet ne no Zookeeper. Brokeris 3 vairs nevar nosÅ«tÄ«t izgÅ«Å”anas pieprasÄ«jumus. PÄc tam, kad pagÄjis laiks replica.lag.time.max.ms tas tiek noÅemts no ISR un nepiedalÄs ziÅojumu apÅemÅ”anÄ. Kad savienojums ir atjaunots, tas atsÄks pieprasÄ«jumu ienesÅ”anu un pievienosies ISR, kad tas sasniegs lÄ«deri. Zookeeper turpinÄs saÅemt ping un pieÅems, ka brokeris ir dzÄ«vs un vesels.
RÄ«si. 23. 1. scenÄrijs: starpnieks tiek noÅemts no ISR, ja intervÄlÄ replica.lag.time.max.ms no tÄ netiek saÅemts neviens izgÅ«Å”anas pieprasÄ«jums.
Nav dalÄ«tu smadzeÅu vai mezglu apturÄÅ”anas, piemÄram, RabbitMQ. TÄ vietÄ tiek samazinÄta atlaiÅ”ana.
2. scenÄrijs: Leader neredz nevienu sekotÄju, bet joprojÄm redz Zookeeper
RÄ«si. 24. ScenÄrijs 2. VadÄ«tÄjs un divi sekotÄji
TÄ«kla savienojamÄ«bas traucÄjumi atdala lÄ«deri no sekotÄjiem, taÄu brokeris joprojÄm var redzÄt Zookeeper. TÄpat kÄ pirmajÄ scenÄrijÄ, ISR samazinÄs, bet Å”oreiz tikai lÄ«dz lÄ«derim, jo āāvisi sekotÄji pÄrtrauc sÅ«tÄ«t ieneses pieprasÄ«jumus. Atkal nav loÄ£iska iedalÄ«juma. TÄ vietÄ jauniem ziÅojumiem tiek zaudÄta dublÄÅ”anÄs, lÄ«dz tiek atjaunots savienojums. Zookeeper turpina saÅemt pingus un uzskata, ka brokeris ir dzÄ«vs un vesels.
RÄ«si. 25. ScenÄrijs 2. ISR ir sarucis tikai lÄ«dz lÄ«derim
ScenÄrijs 3. SekotÄjs redz vadÄ«tÄju, bet neredz ZoodÄrza sargu
SekotÄjs ir atdalÄ«ts no Zookeeper, bet ne no brokera ar lÄ«deri. RezultÄtÄ sekotÄjs turpina iesniegt pieprasÄ«jumus un bÅ«t ISR dalÄ«bnieks. Zookeeper vairs nesaÅem pingus un reÄ£istrÄ brokera avÄriju, bet tÄ kÄ tas ir tikai sekotÄjs, tad pÄc atveseļoÅ”anÄs nekÄdu seku nav.
RÄ«si. 26. 3. scenÄrijs: sekotÄjs turpina sÅ«tÄ«t ieneses pieprasÄ«jumus vadÄ«tÄjam
ScenÄrijs 4. VadÄ«tÄjs redz sekotÄjus, bet neredz Zookeeper
RÄ«si. 27. ScenÄrijs 4. VadÄ«tÄjs un divi sekotÄji
LÄ«deris ir atdalÄ«ts no Zookeeper, bet ne no brokeriem ar sekotÄjiem.
RÄ«si. 28. 4. scenÄrijs: vadÄ«tÄjs izolÄts no Zookeeper
PÄc kÄda laika Zookeeper reÄ£istrÄs brokera kļūdu un paziÅos par to kontrolierim. ViÅÅ” no saviem sekotÄjiem izvÄlÄsies jaunu lÄ«deri. TomÄr sÄkotnÄjais vadÄ«tÄjs turpinÄs domÄt, ka tas ir vadÄ«tÄjs, un turpinÄs pieÅemt ierakstus no acks=1. SekotÄji viÅam vairs nesÅ«ta atneÅ”anas pieprasÄ«jumus, tÄpÄc viÅÅ” uzskatÄ«s tos par miruÅ”iem un mÄÄ£inÄs samazinÄt ISR. Bet, tÄ kÄ tam nav savienojuma ar Zookeeper, tas nevarÄs to izdarÄ«t un tajÄ brÄ«dÄ« atsakÄs pieÅemt citus ierakstus.
Š”Š¾Š¾Š±ŃŠµŠ½ŠøŃ acks=viss nesaÅems apstiprinÄjumu, jo ISR vispirms ieslÄdz visas kopijas un ziÅojumi tos nesasniedz. Kad sÄkotnÄjais vadÄ«tÄjs mÄÄ£inÄs tos noÅemt no ISR, tas to nevarÄs izdarÄ«t un vispÄr pÄrtrauks pieÅemt ziÅojumus.
Klienti drÄ«z pamana lÄ«dera izmaiÅas un sÄk sÅ«tÄ«t ierakstus uz jauno serveri. Kad tÄ«kls ir atjaunots, sÄkotnÄjais vadÄ«tÄjs redz, ka tas vairs nav lÄ«deris, un saÄ«sina savu žurnÄlu lÄ«dz HW vÄrtÄ«bai, kas jaunajam vadÄ«tÄjam bija neveiksmes brÄ«dÄ«, lai izvairÄ«tos no žurnÄla novirzÄm. PÄc tam tas sÄks sÅ«tÄ«t ielÄdes pieprasÄ«jumus jaunajam vadÄ«tÄjam. Tiek zaudÄti visi sÄkotnÄjÄ lÄ«dera ieraksti, kas nav replicÄti jaunajam lÄ«derim. Tas nozÄ«mÄ, ka tiks zaudÄti ziÅojumi, kurus sÄkotnÄjais vadÄ«tÄjs neatzina tajÄs dažÄs sekundÄs, kad strÄdÄja divi vadÄ«tÄji.
RÄ«si. 29. 4. scenÄrijs. 1. brokera lÄ«deris kļūst par sekotÄju pÄc tÄ«kla atjaunoÅ”anas
5. scenÄrijs: sekotÄjs ir pilnÄ«bÄ noŔķirts gan no citiem Kafka mezgliem, gan no Zookeeper
SekotÄjs ir pilnÄ«bÄ izolÄts gan no citiem Kafkas mezgliem, gan no Zookeeper. ViÅÅ” vienkÄrÅ”i noÅem sevi no ISR, lÄ«dz tÄ«kls tiek atjaunots, un pÄc tam panÄk pÄrÄjos.
RÄ«si. 30. 5. scenÄrijs: no ISR tiek noÅemts izolÄts sekotÄjs
6. scenÄrijs: vadÄ«tÄjs ir pilnÄ«bÄ noŔķirts no abiem Kafkas mezgliem un Zookeeper
RÄ«si. 31. ScenÄrijs 6. VadÄ«tÄjs un divi sekotÄji
VadÄ«tÄjs ir pilnÄ«bÄ izolÄts no saviem sekotÄjiem, kontroliera un zoodÄrza uzrauga. ÄŖsu laiku tas turpinÄs pieÅemt ierakstus no acks=1.
RÄ«si. 32. 6. scenÄrijs: lÄ«dera izolÄÅ”ana no citiem Kafka un Zookeeper mezgliem
Nav saÅemti pieprasÄ«jumi pÄc derÄ«guma termiÅa beigÄm replica.lag.time.max.ms, tas mÄÄ£inÄs samazinÄt ISR uz sevi, bet nevarÄs to izdarÄ«t, jo nav saziÅas ar Zookeeper, tad tas pÄrtrauks pieÅemt rakstus.
TikmÄr Zookeeper atzÄ«mÄs izolÄto brokeri kÄ miruÅ”u un kontrolieris ievÄlÄs jaunu vadÄ«tÄju.
RÄ«si. 33. 6. scenÄrijs. Divi lÄ«deri
SÄkotnÄjais vadÄ«tÄjs var pieÅemt ierakstus dažas sekundes, bet pÄc tam pÄrstÄj pieÅemt jebkÄdus ziÅojumus. Klienti tiek atjauninÄti ik pÄc 60 sekundÄm ar jaunÄkajiem metadatiem. ViÅi tiks informÄti par vadÄ«tÄja maiÅu un sÄks sÅ«tÄ«t ierakstus jaunajam vadÄ«tÄjam.
RÄ«si. 34. 6. scenÄrijs: ražotÄji pÄriet uz jaunu lÄ«deri
Visi apstiprinÄtie ieraksti, ko sÄkotnÄjais vadÄ«tÄjs veicis kopÅ” savienojuma zaudÄÅ”anas, tiks zaudÄti. Kad tÄ«kls ir atjaunots, sÄkotnÄjais vadÄ«tÄjs ar Zookeeper starpniecÄ«bu atklÄs, ka tas vairs nav vadÄ«tÄjs. PÄc tam tas saÄ«sinÄs savu žurnÄlu uz jaunÄ vadÄ«tÄja HW ievÄlÄÅ”anas laikÄ un sÄks sÅ«tÄ«t pieprasÄ«jumus kÄ sekotÄjs.
RÄ«si. 35. 6. scenÄrijs: sÄkotnÄjais lÄ«deris kļūst par sekotÄju pÄc tÄ«kla savienojuma atjaunoÅ”anas
Å ÄdÄ situÄcijÄ loÄ£iska atdalÄ«Å”ana var notikt uz Ä«su laiku, bet tikai tad, ja acks=1 Šø min.insync.replicas arÄ« 1. LoÄ£iskÄ atdalÄ«Å”ana automÄtiski beidzas vai nu pÄc tÄ«kla atjaunoÅ”anas, kad sÄkotnÄjais vadÄ«tÄjs saprot, ka viÅÅ” vairs nav vadÄ«tÄjs, vai arÄ« tad, kad visi klienti saprot, ka vadÄ«tÄjs ir mainÄ«jies un sÄk rakstÄ«t jaunajam vadÄ«tÄjam ā atkarÄ«bÄ no tÄ, kas notiek pirmais. JebkurÄ gadÄ«jumÄ daži ziÅojumi tiks zaudÄti, bet tikai ar acks=1.
Ir vÄl viens Ŕī scenÄrija variants, kad tieÅ”i pirms tÄ«kla sadalÄ«Å”anas sekotÄji atpalika un lÄ«deris saspieda ISR tikai sev. PÄc tam tas kļūst izolÄts savienojuma zuduma dÄļ. Tiek ievÄlÄts jauns vadÄ«tÄjs, bet sÄkotnÄjais vadÄ«tÄjs turpina pieÅemt ierakstus, pat acks=viss, jo ISR nav neviena cita, izÅemot viÅu. Å ie ieraksti tiks zaudÄti, tiklÄ«dz tÄ«kls tiks atjaunots. VienÄ«gais veids, kÄ izvairÄ«ties no Ŕīs iespÄjas, ir min.insync.replicas = 2.
7. scenÄrijs: Kafka kontrollera mezgls nevar redzÄt citu Kafka mezglu
Parasti, kad savienojums ar Kafka mezglu tiek zaudÄts, kontrolieris nevarÄs pÄrsÅ«tÄ«t tam informÄciju par lÄ«deru izmaiÅÄm. SliktÄkajÄ gadÄ«jumÄ tas novedÄ«s pie Ä«slaicÄ«gas loÄ£iskas atdalÄ«Å”anas, kÄ tas ir 6. scenÄrijÄ. BiežÄk brokeris vienkÄrÅ”i nekļūs par kandidÄtu lÄ«dera amatam, ja pÄdÄjais neizdosies.
8. scenÄrijs: Kafka kontrolieris neredz Zookeeper
Zookeeper nesaÅems ping no krituÅ”Ä kontroliera un kÄ kontrolieri izvÄlÄsies jaunu Kafka mezglu. SÄkotnÄjais kontrolieris var turpinÄt sevi parÄdÄ«t kÄ tÄdu, taÄu tas nesaÅem paziÅojumus no Zookeeper, tÄpÄc tam nebÅ«s jÄveic nekÄdi uzdevumi. Kad tÄ«kls bÅ«s atjaunots, viÅÅ” sapratÄ«s, ka vairs nav kontrolieris, bet kļuvis par parastu Kafkas mezglu.
SecinÄjumi no scenÄrijiem
MÄs redzam, ka sekotÄju savienojuma zudums neizraisa ziÅojumu zudumu, bet vienkÄrÅ”i Ä«slaicÄ«gi samazina dublÄÅ”anu, lÄ«dz tÄ«kls tiek atjaunots. Tas, protams, var izraisÄ«t datu zudumu, ja tiek zaudÄts viens vai vairÄki mezgli.
Ja vadÄ«tÄjs tiek atdalÄ«ts no Zookeeper savienojuma zuduma dÄļ, var tikt zaudÄti ziÅojumi acks=1. SaziÅas trÅ«kums ar Zookeeper izraisa Ä«su loÄ£isku ŔķelÅ”anos ar abiem vadÄ«tÄjiem. Å o problÄmu atrisina parametrs acks=viss.
Parametrs min.insync.replicas divÄs vai vairÄkÄs replikÄs nodroÅ”ina papildu pÄrliecÄ«bu, ka Å”Ädi Ä«stermiÅa scenÄriji neizraisÄ«s ziÅojumu nozaudÄÅ”anu, kÄ tas ir 6. scenÄrijÄ.
PazaudÄto ziÅojumu kopsavilkums
UzskaitÄ«sim visus veidus, kÄ varat zaudÄt datus programmÄ Kafka:
- Jebkura vadÄ«tÄja kļūme, ja ziÅojumi tika apstiprinÄti, izmantojot acks=1
- Jebkura netÄ«ra vadÄ«bas pÄreja, tas ir, uz sekotÄju Ärpus ISR, pat ar acks=viss
- VadÄ«tÄja izolÄÅ”ana no Zookeeper, ja ziÅojumi tika apstiprinÄti, izmantojot acks=1
- PilnÄ«ga lÄ«dera izolÄcija, kurÅ” jau ir samazinÄjis ISR grupu lÄ«dz paÅ”am sev. Visi ziÅojumi tiks zaudÄti, pat acks=viss. Tas ir taisnÄ«ba tikai tad, ja min.insync.replicas=1.
- Visu nodalÄ«jumu mezglu vienlaicÄ«gas atteices. TÄ kÄ ziÅojumi tiek apstiprinÄti no atmiÅas, daži, iespÄjams, vÄl nav ierakstÄ«ti diskÄ. PÄc serveru pÄrstartÄÅ”anas dažu ziÅojumu var nebÅ«t.
No netÄ«rÄm vadÄ«bas pÄrejÄm var izvairÄ«ties, tos aizliedzot vai nodroÅ”inot vismaz divas atlaiÅ”anas. VisizturÄ«gÄkÄ konfigurÄcija ir kombinÄcija acks=viss Šø min.insync.replicas virs 1.
TieÅ”s RabbitMQ un Kafka uzticamÄ«bas salÄ«dzinÄjums
Lai nodroÅ”inÄtu uzticamÄ«bu un augstu pieejamÄ«bu, abas platformas ievieÅ” primÄro un sekundÄro replikÄcijas sistÄmu. TomÄr RabbitMQ ir Ahileja papÄdis. AtkÄrtoti izveidojot savienojumu pÄc kļūmes, mezgli izmet savus datus un sinhronizÄcija tiek bloÄ·Äta. Å Ä« dubultÄ sadursme liek apÅ”aubÄ«t lielo rindu ilgmūžību RabbitMQ. Jums bÅ«s jÄsamierinÄs ar samazinÄtu atlaiÅ”anu vai ilgu bloÄ·ÄÅ”anas laiku. Redundances samazinÄÅ”ana palielina masveida datu zuduma risku. Bet, ja rindas ir mazas, tad atlaiÅ”anas nolÅ«kÄ var tikt galÄ ar Ä«siem nepieejamÄ«bas periodiem (dažas sekundes), izmantojot atkÄrtotus savienojuma mÄÄ£inÄjumus.
Kafkam Ŕīs problÄmas nav. Tas izmet datus tikai no lÄ«dera un sekotÄja atŔķirÄ«bas punkta. Visi koplietotie dati tiek saglabÄti. TurklÄt replikÄcija nebloÄ·Ä sistÄmu. VadÄ«tÄjs turpina pieÅemt amatus, kamÄr jaunais sekotÄjs panÄk, tÄpÄc devops gadÄ«jumÄ pievienoÅ”anÄs klasterim vai atkÄrtota pievienoÅ”anÄs klasterim kļūst par nenozÄ«mÄ«gu uzdevumu. Protams, joprojÄm pastÄv problÄmas, piemÄram, tÄ«kla joslas platums replikÄcijas laikÄ. Ja vienlaikus pievienosit vairÄkus sekotÄjus, var rasties joslas platuma ierobežojums.
RabbitMQ ir pÄrÄks par Kafka uzticamÄ«bas ziÅÄ, ja vairÄki serveri klasterÄ« vienlaikus neizdodas. KÄ jau teicÄm, RabbitMQ nosÅ«ta apstiprinÄjumu izdevÄjam tikai pÄc tam, kad galvenais un visi spoguļi ir ierakstÄ«juÅ”i ziÅojumu diskÄ. Bet tas palielina latentumu divu iemeslu dÄļ:
- fsync ik pÄc dažiem simtiem milisekundÄm
- Spoguļa kļūmi var pamanÄ«t tikai pÄc tam, kad ir beidzies to pakeÅ”u kalpoÅ”anas laiks, kas pÄrbauda katra mezgla pieejamÄ«bu (neto Ä·eksÄ«tis). Ja spogulis palÄninÄs vai nokrÄ«t, tas palielina kavÄÅ”anos.
Kafkas likme ir tÄda, ka, ja ziÅojums tiek saglabÄts vairÄkos mezglos, tas var apstiprinÄt ziÅojumus, tiklÄ«dz tie nonÄk atmiÅÄ. Å Ä« iemesla dÄļ pastÄv risks pazaudÄt jebkÄda veida ziÅojumus (pat acks=viss, min.insync.replicas=2) vienlaicÄ«gas atteices gadÄ«jumÄ.
KopumÄ Kafka uzrÄda labÄku programmatÅ«ras veiktspÄju, un tÄ jau no paÅ”a sÄkuma ir izstrÄdÄta klasteriem. SekotÄju skaitu var palielinÄt lÄ«dz 11, ja nepiecieÅ”ams uzticamÄ«bas labad. ReplicÄÅ”anas faktors 5 un minimÄlais repliku skaits sinhronizÄcijÄ min.insync.replicas=3 padarÄ«s ziÅojumu zaudÄÅ”anu par ļoti retu notikumu. Ja jÅ«su infrastruktÅ«ra var atbalstÄ«t Å”o replikÄcijas attiecÄ«bu un dublÄÅ”anas lÄ«meni, varat izvÄlÄties Å”o opciju.
RabbitMQ klasterizÄcija ir piemÄrota nelielÄm rindÄm. Bet pat nelielas rindas var Ätri augt, ja ir intensÄ«va satiksme. Kad rindas kļūs lielas, jums bÅ«s jÄizdara grÅ«ta izvÄle starp pieejamÄ«bu un uzticamÄ«bu. RabbitMQ klasterizÄcija ir vislabÄk piemÄrota netipiskÄm situÄcijÄm, kad RabbitMQ elastÄ«bas priekÅ”rocÄ«bas atsver visus klasterizÄcijas trÅ«kumus.
Viens pretlÄ«dzeklis RabbitMQ ievainojamÄ«bai pret lielÄm rindÄm ir to sadalÄ«Å”ana daudzÄs mazÄkÄs rindÄs. Ja neprasa pilnu visas rindas pasÅ«tÄ«Å”anu, bet tikai attiecÄ«gos ziÅojumus (piemÄram, ziÅas no konkrÄta klienta), vai arÄ« nepasÅ«tat vispÄr neko, tad ir pieÅemama Å”Äda iespÄja: paskaties uz manu projektu
Visbeidzot, neaizmirstiet par vairÄkÄm kļūdÄm gan RabbitMQ, gan Kafka klasterizÄcijas un replikÄcijas mehÄnismos. Laika gaitÄ sistÄmas ir kļuvuÅ”as nobrieduÅ”Äkas un stabilÄkas, taÄu neviens ziÅojums nekad nebÅ«s 100% pasargÄts no zuduma! TurklÄt datu centros notiek liela mÄroga avÄrijas!
Ja esmu kaut ko palaidis garÄm, kļūdÄ«jies vai jÅ«s nepiekrÄ«tat kÄdam no punktiem, droÅ”i rakstiet komentÄru vai sazinieties ar mani.
Man bieži jautÄ: āKo izvÄlÄties, Kafka vai RabbitMQ?ā, āKura platforma ir labÄka?ā. PatiesÄ«ba ir tÄda, ka tas tieÅ”Äm ir atkarÄ«gs no jÅ«su situÄcijas, paÅ”reizÄjÄs pieredzes utt. Es vilcinos sniegt savu viedokli, jo bÅ«tu pÄrÄk daudz vienkÄrÅ”ot ieteikt vienu platformu visiem lietoÅ”anas gadÄ«jumiem un iespÄjamiem ierobežojumiem. Es rakstÄ«ju Å”o rakstu sÄriju, lai jÅ«s varÄtu izveidot savu viedokli.
Es gribu teikt, ka abas sistÄmas ir lÄ«deres Å”ajÄ jomÄ. Es varu bÅ«t nedaudz neobjektÄ«vs, jo no savas pieredzes ar projektiem es mÄdzu novÄrtÄt tÄdas lietas kÄ garantÄta ziÅojumu secÄ«ba un uzticamÄ«ba.
Es redzu citas tehnoloÄ£ijas, kurÄm trÅ«kst Ŕīs uzticamÄ«bas un garantÄtas pasÅ«tÄ«Å”anas, tad skatos uz RabbitMQ un Kafka un saprotu abu Å”o sistÄmu neticamo vÄrtÄ«bu.
Avots: www.habr.com