RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros

Kļūdu tolerance un augsta pieejamÄ«ba ir lielas tēmas, tāpēc RabbitMQ un Kafka veltÄ«sim atseviŔķus rakstus. Å is raksts ir par RabbitMQ, bet nākamais ir par Kafku salÄ«dzinājumā ar RabbitMQ. Å is ir garÅ” raksts, tāpēc jÅ«tieties ērti.

Apskatīsim kļūdu tolerances, konsekvences un augstas pieejamības (HA) stratēģijas un katras stratēģijas radītos kompromisus. RabbitMQ var darboties mezglu klasterī, un pēc tam tiek klasificēta kā izplatīta sistēma. Runājot par izplatītajām sistēmām, mēs bieži runājam par konsekvenci un pieejamību.

Å ie jēdzieni apraksta, kā sistēma darbojas, ja tā neizdodas. TÄ«kla savienojuma kļūme, servera kļūme, cietā diska kļūme, servera Ä«slaicÄ«ga nepieejamÄ«ba atkritumu savākÅ”anas, pakeÅ”u zuduma vai tÄ«kla savienojuma palēninājuma dēļ. Tas viss var izraisÄ«t datu zudumu vai konfliktus. Izrādās, ka praktiski nav iespējams izveidot sistēmu, kas bÅ«tu gan pilnÄ«gi konsekventa (nav datu zuduma, ne datu novirzes), gan pieejama (pieņems lasÄ«Å”anu un rakstÄ«Å”anu) visiem kļūmju scenārijiem.

Mēs redzēsim, ka konsekvence un pieejamÄ«ba atrodas pretējā spektra galos, un jums ir jāizvēlas optimizÄ“Å”anas veids. Labā ziņa ir tā, ka ar RabbitMQ Ŕī izvēle ir iespējama. Jums ir Ŕādas ā€œnervuā€ sviras, lai novirzÄ«tu lÄ«dzsvaru uz lielāku konsekvenci vai lielāku pieejamÄ«bu.

ÄŖpaÅ”u uzmanÄ«bu pievērsÄ«sim tam, kuras konfigurācijas izraisa datu zudumu apstiprināto ierakstu dēļ. Starp izdevējiem, brokeriem un patērētājiem pastāv atbildÄ«bas ķēde. Kad ziņojums ir nosÅ«tÄ«ts brokerim, viņa uzdevums ir nepazaudēt ziņojumu. Kad starpnieks apstiprina, ka izdevējs ir saņēmis ziņojumu, mēs negaidām, ka tas tiks pazaudēts. Taču mēs redzēsim, ka tas faktiski var notikt atkarÄ«bā no jÅ«su starpnieka un izdevēja konfigurācijas.

Viena mezgla elastīguma primitīvas

Elastīga rinda/marŔrutēŔana

RabbitMQ ir divu veidu rindas: izturÄ«gas un neizturÄ«gas. Visas rindas tiek saglabātas Mnesia datubāzē. NoturÄ«gas rindas tiek atkārtoti reklamētas mezgla palaiÅ”anas laikā, un tādējādi tās izdzÄ«vo restartÄ“Å”anas, sistēmas avārijas vai servera avārijas (ja vien tiek saglabāti dati). Tas nozÄ«mē, ka tik ilgi, kamēr jÅ«s paziņosiet, ka marÅ”rutÄ“Å”ana (apmaiņa) un rinda ir elastÄ«ga, rindas/marÅ”rutÄ“Å”anas infrastruktÅ«ra atkal bÅ«s tieÅ”saistē.

NepastāvÄ«gās rindas un marÅ”rutÄ“Å”ana tiek noņemta, kad mezgls tiek restartēts.

Pastāvīgi ziņojumi

Tas, ka rinda ir izturÄ«ga, nenozÄ«mē, ka visi tās ziņojumi izdzÄ«vos pēc mezgla restartÄ“Å”anas. Tikai ziņojumi, kurus izdevējs iestatÄ«jis kā elastÄ«ga (noturÄ«gs). PastāvÄ«gi ziņojumi rada papildu slodzi brokerim, taču, ja ziņojumu zudums ir nepieņemams, tad nav citas iespējas.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 1. Ilgtspējas matrica

Klasterizācija ar rindu spoguļoŔanu

Lai pārdzÄ«votu brokera zaudējumu, mums ir nepiecieÅ”ama atlaiÅ”ana. Mēs varam apvienot vairākus RabbitMQ mezglus klasterÄ« un pēc tam pievienot papildu dublÄ“Å”anu, atkārtojot rindas starp vairākiem mezgliem. Tādā veidā, ja viens mezgls neizdodas, mēs nezaudējam datus un paliekam pieejami.

Rindas spoguļoŔana:

  • viena galvenā rinda (master), kas saņem visas rakstÄ«Å”anas un lasÄ«Å”anas komandas
  • viens vai vairāki spoguļi, kas saņem visus ziņojumus un metadatus no galvenās rindas. Å ie spoguļi nav paredzēti mērogoÅ”anai, bet gan tikai atlaiÅ”anai.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 2. Rindas spoguļoŔana

SpoguļoÅ”anu nosaka atbilstoŔā politika. Tajā varat atlasÄ«t replikācijas koeficientu un pat mezglus, uz kuriem jāatrodas rindai. Piemēri:

  • ha-mode: all
  • ha-mode: exactly, ha-params: 2 (viens meistars un viens spogulis)
  • ha-mode: nodes, ha-params: rabbit@node1, rabbit@node2

Izdevēja apstiprinājums

Lai nodroÅ”inātu konsekventu ierakstÄ«Å”anu, ir nepiecieÅ”ami izdevēja apstiprinājumi. Bez tiem pastāv risks, ka ziņojumi tiks pazaudēti. Pēc ziņojuma ierakstÄ«Å”anas diskā izdevējam tiek nosÅ«tÄ«ts apstiprinājums. RabbitMQ ieraksta ziņojumus diskā nevis pēc saņemÅ”anas, bet periodiski, vairāku simtu milisekundu apgabalā. Kad rinda tiek atspoguļota, apstiprinājums tiek nosÅ«tÄ«ts tikai pēc tam, kad visi spoguļi ir arÄ« ierakstÄ«juÅ”i savu ziņojuma kopiju diskā. Tas nozÄ«mē, ka apstiprinājumu izmantoÅ”ana palielina latentumu, bet, ja datu droŔība ir svarÄ«ga, tad tie ir nepiecieÅ”ami.

Kļūmjpārlēces rinda

Kad brokeris pārtrauc darbu vai avarē, visi Ŕī mezgla rindu vadÄ«tāji (galvenie) kopā ar to avarē. Pēc tam klasteris atlasa katra meistara vecāko spoguli un reklamē to kā jauno meistaru.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 3. Vairākas spoguļattēlu rindas un to politikas

Brokeris 3 nokrīt. Ņemiet vērā, ka Broker 2 rindas C spogulis tiek paaugstināts par galveno. Ņemiet vērā arī to, ka ir izveidots jauns spogulis rindai C pakalpojumā Broker 1. RabbitMQ vienmēr mēģina uzturēt jūsu politikās norādīto replikācijas faktoru.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 4. Broker 3 neizdodas, izraisot rindas C kļūmi

Nākamais Broker 1 krīt! Mums ir palicis tikai viens brokeris. Rindas B spogulis tiek paaugstināts par galveno.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Att. 5

Mēs esam atgriezuÅ”i Broker 1. NeatkarÄ«gi no tā, cik labi dati saglabājas pēc starpnieka zaudÄ“Å”anas un atkopÅ”anas, restartējot tiek atmesti visi spoguļattēlu rindas ziņojumi. Tas ir svarÄ«gi atzÄ«mēt, jo tam bÅ«s sekas. DrÄ«zumā aplÅ«kosim Ŕīs sekas. Tātad Broker 1 tagad atkal ir klastera dalÄ«bnieks, un klasteris mēģina ievērot politikas un tāpēc izveido spoguļus Broker 1.

Å ajā gadÄ«jumā Broker 1 zaudÄ“Å”ana bija pilnÄ«ga, tāpat kā dati, tāpēc neatspoguļotā rinda B tika pilnÄ«bā zaudēta.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 6. Brokeris 1 atgriežas darbā

Broker 3 atkal ir tieÅ”saistē, tāpēc rindas A un B saņem atpakaļ tajā izveidotos spoguļus, lai izpildÄ«tu viņu HA politikas. Bet tagad visas galvenās rindas ir vienā mezglā! Tas nav ideāli, vienmērÄ«gs sadalÄ«jums starp mezgliem ir labāks. Diemžēl Å”eit nav daudz iespēju, kā lÄ«dzsvarot meistarus. Mēs atgriezÄ«simies pie Ŕīs problēmas vēlāk, jo mums vispirms ir jāaplÅ«ko rindu sinhronizācija.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 7. Brokeris 3 atgriežas darbā. Visas galvenās rindas vienā mezglā!

Tāpēc tagad jums vajadzētu bÅ«t priekÅ”statam par to, kā spoguļi nodroÅ”ina atlaiÅ”anu un kļūdu toleranci. Tas nodroÅ”ina pieejamÄ«bu viena mezgla atteices gadÄ«jumā un aizsargā pret datu zudumu. Bet mēs vēl neesam pabeiguÅ”i, jo patiesÄ«bā tas ir daudz sarežģītāk.

Sinhronizācija

Veidojot jaunu spoguli, visi jaunie ziņojumi vienmēr tiks replicēti Å”ajā spogulÄ« un citos. Kas attiecas uz esoÅ”ajiem datiem galvenajā rindā, mēs varam tos replicēt uz jaunu spoguli, kas kļūst par pilnÄ«gu galvenā kopiju. Mēs varam arÄ« izvēlēties nedublēt esoÅ”os ziņojumus un ļaut galvenajai rindai un jaunajam spoguļam saplÅ«st laikā, jaunajiem ziņojumiem nonākot beigās un esoÅ”ajiem ziņojumiem atstājot galvenās rindas galvgali.

Šī sinhronizācija tiek veikta automātiski vai manuāli, un tā tiek pārvaldīta, izmantojot rindas politiku. Apskatīsim piemēru.

Mums ir divas spoguļrindas. Rinda A tiek sinhronizēta automātiski, un rinda B tiek sinhronizēta manuāli. Abās rindās ir desmit ziņojumi.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 8. Divas rindas ar dažādiem sinhronizācijas režīmiem

Tagad mēs zaudējam Broker 3.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
RÄ«si. 9. Brokeris 3 krita

Brokeris 3 atgriežas darbā. Klasteris izveido spoguli katrai rindai jaunajā mezglā un automātiski sinhronizē jauno rindu A ar galveno. Tomēr jaunās rindas B spogulis paliek tukÅ”s. Tādā veidā mums ir pilnÄ«ga dublÄ“Å”ana A rindā un tikai viens spogulis esoÅ”ajiem rindas B ziņojumiem.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
RÄ«si. 10. Jaunais rindas A spogulis saņem visus esoÅ”os ziņojumus, bet jaunais rindas B spogulis nesaņem.

Abās rindās tiek saņemti vēl desmit ziņojumi. Pēc tam brokeris 2 avarē, un rinda A atgriežas pie vecākā spoguļa, kas atrodas Broker 1. Ja tas neizdodas, dati netiek zaudēti. Rindā B ir divdesmit ziņojumi galvenajā un tikai desmit ziņojumi spogulÄ«, jo Ŕī rinda nekad nedublē sākotnējos desmit ziņojumus.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 11. Rinda A atgriežas pie Broker 1, nezaudējot ziņojumus

Abās rindās tiek saņemti vēl desmit ziņojumi. Tagad Broker 1 avarē. Rinda A viegli pārslēdzas uz spoguli, nezaudējot ziņojumus. Tomēr rindai B ir problēmas. Šajā brīdī mēs varam optimizēt pieejamību vai konsekvenci.

Ja vēlamies optimizēt pieejamÄ«bu, tad politika ha-promote-on-failure jāiestata iekŔā vienmēr. Å Ä« ir noklusējuma vērtÄ«ba, tāpēc jÅ«s varat vienkārÅ”i nenorādÄ«t politiku vispār. Å ajā gadÄ«jumā mēs bÅ«tÄ«bā pieļaujam kļūmes nesinhronizētos spoguļos. Tādējādi ziņojumi tiks zaudēti, bet rinda paliks lasāma un rakstāma.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 12. Rinda A tiek atgriezta atpakaļ uz Broker 3, nezaudējot ziņojumus. Rinda B atgriežas pie Broker 3 ar desmit zaudētiem ziņojumiem

Varam arÄ« uzstādÄ«t ha-promote-on-failure nozÄ«mē when-synced. Å ajā gadÄ«jumā tā vietā, lai atgrieztos pie spoguļa, rinda gaidÄ«s, lÄ«dz Broker 1 ar saviem datiem atgriezÄ«sies tieÅ”saistes režīmā. Pēc atgrieÅ”anās galvenā rinda atkal ir pieejama Broker 1 bez datu zudumiem. PieejamÄ«ba tiek upurēta datu droŔībai. Bet tas ir riskants režīms, kas var pat izraisÄ«t pilnÄ«gu datu zudumu, ko mēs tuvākajā laikā apskatÄ«sim.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
RÄ«si. 13. Rinda B paliek nepieejama pēc 1. brokera zaudÄ“Å”anas

JÅ«s varat jautāt: "Vai labāk nekad neizmantot automātisko sinhronizāciju?" Atbilde ir tāda, ka sinhronizācija ir bloÄ·Ä“Å”anas darbÄ«ba. Sinhronizācijas laikā galvenā rinda nevar veikt nekādas lasÄ«Å”anas vai rakstÄ«Å”anas darbÄ«bas!

Apskatīsim piemēru. Tagad mums ir ļoti garas rindas. Kā viņi var izaugt līdz tādam izmēram? Vairāku iemeslu dēļ:

  • Rindas netiek aktÄ«vi izmantotas
  • Tās ir ātrgaitas rindas, un Å”obrÄ«d patērētāji ir lēni
  • Tās ir ātrgaitas rindas, ir radusies kļūme, un patērētāji to panāk

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 14. Divas lielas rindas ar dažādiem sinhronizācijas režīmiem

Tagad Broker 3 krīt.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 15. Brokeris 3 krīt, atstājot katrā rindā vienu meistaru un spoguli

Broker 3 atgriežas tieÅ”saistē un tiek izveidoti jauni spoguļi. Galvenā rinda A sāk replicēt esoÅ”os ziņojumus jaunajā spogulÄ«, un Å”ajā laikā rinda nav pieejama. Datu pavairoÅ”ana aizņem divas stundas, kā rezultātā Å”ai rindai ir divas stundas dÄ«kstāves!

Tomēr rinda B ir pieejama visu periodu. Viņa upurēja dažas atlaiÅ”anas pieejamÄ«bas dēļ.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 16. Sinhronizācijas laikā rinda paliek nepieejama

Pēc divām stundām kļūst pieejama arÄ« rinda A, un tā var atkal sākt lasÄ«t un rakstÄ«t.

Atjauninājumi

Å Ä« bloķējoŔā darbÄ«ba sinhronizācijas laikā apgrÅ«tina klasteru atjaunināŔanu ar ļoti lielām rindām. Kādā brÄ«dÄ« galvenais mezgls ir jārestartē, kas nozÄ«mē vai nu pārslēgÅ”anos uz spoguli, vai rindas atspējoÅ”anu, kamēr serveris tiek jaunināts. Ja izvēlēsimies pāreju, mēs zaudēsim ziņojumus, ja spoguļi netiks sinhronizēti. Pēc noklusējuma brokera darbÄ«bas pārtraukuma laikā kļūmjpārlēce uz nesinhronizētu spoguli netiek veikta. Tas nozÄ«mē, ka tiklÄ«dz brokeris atgriežas, mēs nezaudējam nevienu ziņojumu, vienÄ«gais kaitējums bija vienkārÅ”a rinda. UzvedÄ«bas noteikumus, kad brokeris ir atvienots, nosaka politika ha-promote-on-shutdown. Varat iestatÄ«t vienu no divām vērtÄ«bām:

  • always= ir iespējota pāreja uz nesinhronizētiem spoguļiem
  • when-synced= pāreja tikai uz sinhronizētu spoguli, pretējā gadÄ«jumā rinda kļūst nelasāma un neierakstāma. Rinda atgriežas apkalpoÅ”anā, tiklÄ«dz atgriežas brokeris

Tā vai citādi, ar lielām rindām ir jāizvēlas starp datu zudumu vai nepieejamību.

Kad pieejamība uzlabo datu droŔību

Pirms lēmuma pieņemÅ”anas jāņem vērā vēl viens sarežģījums. Lai gan automātiskā sinhronizācija ir labāka atlaiÅ”anai, kā tā ietekmē datu droŔību? Protams, ar labāku dublÄ“Å”anu RabbitMQ ir mazāka iespēja zaudēt esoÅ”os ziņojumus, bet kā ir ar jaunajiem ziņojumiem no izdevējiem?

Å eit jums jāņem vērā sekojoÅ”ais:

  • Vai izdevējs varētu 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 izdevējs var tikai atmest ziņojumu, tad faktiski pieejamÄ«bas uzlaboÅ”ana uzlabo arÄ« datu droŔību.

Tādējādi ir jāmeklē līdzsvars, un risinājums ir atkarīgs no konkrētās situācijas.

Problēmas ar ha-promote-on-failure=when-synced

Ideja ha-promote-on-failure= kad-sinhronizēts ir tas, ka mēs novērÅ”am pāreju uz nesinhronizētu spoguli un tādējādi izvairāmies no datu zuduma. Rinda paliek nelasāma vai rakstāma. Tā vietā mēs cenÅ”amies atgÅ«t avarējuÅ”o brokeri ar neskartiem datiem, lai tas varētu atsākt darboties kā galvenais, nezaudējot datus.

Bet (un tas ir liels, bet), ja brokeris ir pazaudējis savus datus, tad mums ir liela problēma: rinda ir zaudēta! Visi dati ir pazuduÅ”i! Pat ja jums ir spoguļi, kas pārsvarā sasniedz galveno rindu, arÄ« Å”ie spoguļi tiek izmesti.

Lai atkārtoti pievienotu mezglu ar tādu paÅ”u nosaukumu, mēs sakām klasterim aizmirst pazaudēto mezglu (ar komandu rabbitmqctl aizmirst_kopas_node) un sāciet jaunu brokeri ar tādu paÅ”u saimniekdatora nosaukumu. Kamēr klasteris atceras zaudēto mezglu, tas atceras veco rindu un nesinhronizētos spoguļus. Kad klasterim tiek likts aizmirst bāreņu mezglu, tiek aizmirsta arÄ« Ŕī rinda. Tagad mums tas ir atkārtoti jādeklarē. Mēs zaudējām visus datus, lai gan mums bija spoguļi ar daļēju datu kopu. Labāk bÅ«tu pāriet uz nesinhronizētu spoguli!

Tāpēc manuāla sinhronizācija (un neveiksme sinhronizācijā) kombinācijā ar ha-promote-on-failure=when-synced, manuprāt, diezgan riskanti. Dokumenti saka, ka Ŕī opcija pastāv datu droŔībai, taču tā ir abpusēji griezÄ«gs nazis.

Galvenā līdzsvara atjaunoŔana

Kā solÄ«ts, mēs atgriežamies pie problēmas, kas saistÄ«ta ar visu meistaru uzkrāŔanos vienā vai vairākos mezglos. Tas var notikt pat mainÄ«ga klastera atjaunināŔanas rezultātā. TrÄ«s mezglu klasterÄ« visas galvenās rindas tiks uzkrātas vienā vai divos mezglos.

Meistaru lÄ«dzsvara atjaunoÅ”ana var bÅ«t problemātiska divu iemeslu dēļ:

  • Nav labu instrumentu, lai veiktu lÄ«dzsvaroÅ”anu
  • Rindas sinhronizācija

LÄ«dzsvara atjaunoÅ”anai ir treŔā puse iespraust, kas oficiāli netiek atbalstÄ«ts. Par treÅ”o puÅ”u spraudņiem RabbitMQ rokasgrāmatā teica: ā€œSpraudnis nodroÅ”ina dažus papildu konfigurācijas un ziņoÅ”anas rÄ«kus, taču RabbitMQ komanda to neatbalsta vai nepārbauda. Izmantojiet uz savu risku."

Ir vēl viens triks, kā pārvietot galveno rindu, izmantojot HA politikas. Rokasgrāmatā minēts skripts priekÅ” Ŕī. Tas darbojas Ŕādi:

  • Noņem visus spoguļus, izmantojot pagaidu politiku, kurai ir augstāka prioritāte nekā esoÅ”ajai HA politikai.
  • Maina HA pagaidu politiku, lai izmantotu mezgla režīmu, norādot mezglu, uz kuru jāpārsÅ«ta galvenā rinda.
  • Sinhronizē push migrācijas rindu.
  • Kad migrÄ“Å”ana ir pabeigta, pagaidu politika tiek dzēsta. Sākotnējā HA politika stājas spēkā un tiek izveidots nepiecieÅ”amais spoguļu skaits.

Negatīvā puse ir tāda, ka Ŕī pieeja var nedarboties, ja jums ir lielas rindas vai stingras atlaiŔanas prasības.

Tagad redzēsim, kā RabbitMQ klasteri darbojas ar tīkla nodalījumiem.

Savienojuma zudums

SadalÄ«tās sistēmas mezgli ir savienoti ar tÄ«kla saitēm, un tÄ«kla saites var un tiks atvienotas. Pārtraukumu biežums ir atkarÄ«gs no vietējās infrastruktÅ«ras vai izvēlētā mākoņa uzticamÄ«bas. Jebkurā gadÄ«jumā sadalÄ«tajām sistēmām ir jāspēj ar tām tikt galā. Atkal mums ir izvēle starp pieejamÄ«bu un konsekvenci, un atkal labā ziņa ir tā, ka RabbitMQ nodroÅ”ina abas iespējas (tikai ne vienlaikus).

Izmantojot RabbitMQ, mums ir divas galvenās iespējas:

  • Atļaut loÄ£isko dalÄ«jumu (smadzeņu sadalÄ«Å”ana). Tas nodroÅ”ina pieejamÄ«bu, bet var izraisÄ«t datu zudumu.
  • Atspējot loÄ£isko atdalÄ«Å”anu. Var izraisÄ«t Ä«slaicÄ«gu pieejamÄ«bas zudumu atkarÄ«bā no tā, kā klienti savienojas ar kopu. Var izraisÄ«t arÄ« pilnÄ«gu nepieejamÄ«bu divu mezglu klasterÄ«.

Bet kas ir loÄ£iskā atdalÄ«Å”ana? Tas notiek, kad klasteris sadalās divās daļās tÄ«kla savienojumu zuduma dēļ. Katrā pusē spoguļi tiek paaugstināti par meistaru, lai galu galā vienā rindā bÅ«tu vairāki meistari.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
RÄ«si. 17. Galvenā rinda un divi spoguļi, katrs atseviŔķā mezglā. Tad notiek tÄ«kla kļūme un viens spogulis tiek atvienots. AtdalÄ«tais mezgls redz, ka pārējie divi ir nokrituÅ”i, un reklamē savus spoguļus kapteinim. Tagad mums ir divas galvenās rindas, gan rakstāmās, gan lasāmās.

Ja izdevēji nosÅ«ta datus abiem galvenajiem, mēs iegÅ«stam divas atŔķirÄ«gas rindas kopijas.

RabbitMQ dažādie režīmi nodroŔina pieejamību vai konsekvenci.

IgnorÄ“Å”anas režīms (noklusējums)

Å is režīms nodroÅ”ina pieejamÄ«bu. Pēc savienojuma zaudÄ“Å”anas notiek loÄ£iska atdalÄ«Å”ana. Pēc savienojuma atjaunoÅ”anas administratoram ir jāizlemj, kuram nodalÄ«jumam pieŔķirt prioritāti. Zaudētāja puse tiks restartēta, un visi tajā pusē uzkrātie dati tiks zaudēti.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
RÄ«si. 18. TrÄ«s izdevēji ir saistÄ«ti ar trim brokeriem. IekŔēji klasteris visus pieprasÄ«jumus novirza uz galveno rindu pakalpojumā Broker 2.

Tagad mēs zaudējam Brokeri 3. ViņŔ redz, ka citi brokeri ir atkrituÅ”i un paaugstina savu spoguli par meistaru. Tādā veidā notiek loÄ£iska atdalÄ«Å”ana.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 19.Loģiskais dalījums (split-brain). Ieraksti atrodas divās galvenajās rindās, un abas kopijas atŔķiras.

SavienojamÄ«ba tiek atjaunota, bet loÄ£iskā atdalÄ«Å”ana paliek. Administratoram manuāli jāizvēlas zaudētāja puse. Tālāk norādÄ«tajā gadÄ«jumā administrators atsāknē Broker 3. Visi ziņojumi, kurus viņam neizdevās pārsÅ«tÄ«t, tiek zaudēti.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 20. Administrators atspējo Broker 3.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 21. Administrators palaiž brokeri 3 un tas pievienojas klasterim, zaudējot visus tur atstātos ziņojumus.

Savienojuma zuduma laikā un pēc tā atjaunoÅ”anas klasteris un Ŕī rinda bija pieejama lasÄ«Å”anai un rakstÄ«Å”anai.

Automātiskās dziedināŔanas režīms

Darbojas lÄ«dzÄ«gi kā Ignorēt režīms, izņemot to, ka pats klasteris pēc savienojuma sadalÄ«Å”anas un atjaunoÅ”anas automātiski izvēlas zaudēto pusi. Zaudētāja puse atgriežas klasterÄ« tukÅ”a, un rinda zaudē visus ziņojumus, kas tika nosÅ«tÄ«ti tikai uz Å”o pusi.

Pauzējiet mazākuma režīmu

Ja mēs nevēlamies atļaut loÄ£isko sadalÄ«Å”anu, mÅ«su vienÄ«gā iespēja ir atmest lasÄ«Å”anu un rakstÄ«Å”anu mazākajā pusē pēc klastera nodalÄ«juma. Kad brokeris redz, ka tas atrodas mazākajā pusē, tas aptur darbu, tas ir, slēdz visus esoÅ”os savienojumus un atsakās no jauniem. Reizi sekundē tas pārbauda savienojuma atjaunoÅ”anu. Kad savienojums ir atjaunots, tas atsāk darbÄ«bu un pievienojas klasterim.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
RÄ«si. 22. TrÄ«s izdevēji ir saistÄ«ti ar trim brokeriem. IekŔēji klasteris visus pieprasÄ«jumus novirza uz galveno rindu pakalpojumā Broker 2.

Pēc tam 1. un 2. brokeris atdalās no brokera 3. Tā vietā, lai reklamētu savu spoguli par galveno, brokeris 3 aptur darbību un kļūst nepieejams.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 23. Broker 3 aptur, atvieno visus klientus un noraida savienojuma pieprasījumus.

Kad savienojums ir atjaunots, tas atgriežas klasterī.

Apskatīsim citu piemēru, kur galvenā rinda atrodas brokerī 3.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 24. Galvenā rinda brokerā 3.

Tad notiek tāds pats savienojuma zudums. Broker 3 pauzes, jo tas atrodas mazākajā pusē. No otras puses mezgli redz, ka Broker 3 ir nokritis, tāpēc vecākais spogulis no Brokers 1 un 2 tiek paaugstināts par meistaru.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 25. Pāreja uz Broker 2, ja Broker 3 nav pieejams.

Kad savienojums ir atjaunots, brokeris 3 pievienosies klasterim.

RabbitMQ vs Kafka: kļūdu tolerance un augsta pieejamība klasteros
Rīsi. 26. Klasteris ir atgriezies normālā režīmā.

Å eit ir svarÄ«gi saprast, ka mēs iegÅ«stam konsekvenci, taču varam arÄ« nodroÅ”ināt pieejamÄ«bu, ja Mēs veiksmÄ«gi pārvedÄ«sim klientus uz lielāko daļu sadaļas. Lielākajai daļai situāciju es personÄ«gi izvēlētos Pause Minority režīmu, taču tas tieŔām ir atkarÄ«gs no konkrētā gadÄ«juma.

Lai nodroÅ”inātu pieejamÄ«bu, ir svarÄ«gi nodroÅ”ināt, lai klienti veiksmÄ«gi izveidotu savienojumu ar resursdatoru. ApskatÄ«sim mÅ«su iespējas.

Klientu savienojamības nodroŔināŔana

Mums ir vairākas iespējas, kā novirzÄ«t klientus uz galveno klastera daļu vai darba mezgliem (pēc viena mezgla kļūmes) pēc savienojuma zaudÄ“Å”anas. Pirmkārt, atcerēsimies, ka noteikta rinda ir mitināta noteiktā mezglā, bet marÅ”rutÄ“Å”ana un politikas tiek replicētas visos mezglos. Klienti var izveidot savienojumu ar jebkuru mezglu, un iekŔējā marÅ”rutÄ“Å”ana viņus novirzÄ«s tur, kur viņiem ir jāiet. Bet, kad mezgls ir apturēts, tas noraida savienojumus, tāpēc klientiem ir jāpievienojas citam mezglam. Ja mezgls nokrÄ«t, viņŔ vispār maz var darÄ«t.

Mūsu iespējas:

  • Klasterim var piekļūt, izmantojot slodzes lÄ«dzsvarotāju, kas vienkārÅ”i pāriet cauri mezgliem, un klienti mēģina atkārtoti izveidot savienojumu, lÄ«dz tas ir izdevies. Ja mezgls nedarbojas vai ir apturēts, mēģinājumi izveidot savienojumu ar Å”o mezglu neizdosies, bet nākamie mēģinājumi tiks novirzÄ«ti uz citiem serveriem (apkārtējā veidā). Tas ir piemērots Ä«stermiņa savienojuma zuduma vai nolaistu servera gadÄ«jumā, kas tiks ātri atjaunots.
  • Piekļūstiet klasterim, izmantojot slodzes lÄ«dzsvarotāju, un noņemiet apturētos/neizdevuÅ”os mezglus no saraksta, tiklÄ«dz tie tiek atklāti. Ja mēs to darÄ«sim ātri un klienti varēs atkārtoti mēģināt izveidot savienojumu, mēs sasniegsim pastāvÄ«gu pieejamÄ«bu.
  • Sniedziet katram klientam visu mezglu sarakstu, un klients nejauÅ”i izvēlas vienu no tiem savienojuma laikā. Ja, mēģinot izveidot savienojumu, tiek parādÄ«ts kļūdas ziņojums, tas pāriet uz nākamo mezglu sarakstā, lÄ«dz tiek izveidots savienojums.
  • Noņemiet trafiku no neveiksmÄ«ga/apturēta mezgla, izmantojot DNS. Tas tiek darÄ«ts, izmantojot nelielu TTL.

Atzinumi

RabbitMQ klasterÄ“Å”anai ir savas priekÅ”rocÄ«bas un trÅ«kumi. Nopietnākie trÅ«kumi ir Ŕādi:

  • pievienojoties klasterim, mezgli izmet savus datus;
  • bloķējot sinhronizāciju, rinda kļūst nepieejama.

Visi sarežģītie lēmumi izriet no Ŕīm divām arhitektÅ«ras iezÄ«mēm. Ja RabbitMQ varētu saglabāt datus, kad klasteris tiek atkārtoti pievienots, sinhronizācija bÅ«tu ātrāka. Ja tas varētu nebloķēt sinhronizāciju, tas labāk atbalstÄ«tu lielas rindas. Å o divu problēmu novērÅ”ana ievērojami uzlabotu RabbitMQ kā kļūmju izturÄ«gas un ļoti pieejamas ziņojumapmaiņas tehnoloÄ£ijas veiktspēju. Es vilcināŔos ieteikt RabbitMQ ar klasterizāciju Ŕādās situācijās:

  • Neuzticams tÄ«kls.
  • Neuzticama krātuve.
  • Ä»oti garas rindas.

Runājot par augstas pieejamības iestatījumiem, ņemiet vērā tālāk minēto.

  • ha-promote-on-failure=always
  • ha-sync-mode=manual
  • cluster_partition_handling=ignore (Vai autoheal)
  • pastāvÄ«gas ziņas
  • nodroÅ”ināt klientu savienojumu ar aktÄ«vo mezglu, ja kāds mezgls neizdodas

Lai nodroÅ”inātu konsekvenci (datu droŔību), ņemiet vērā Ŕādus iestatÄ«jumus:

  • Izdevējs apstiprina un manuāli apstiprina patērētāju puses
  • ha-promote-on-failure=when-synced, ja izdevēji vēlāk var mēģināt vēlreiz un ja jums ir ļoti uzticama krātuve! Citādi likt =always.
  • ha-sync-mode=automatic (bet lielām neaktÄ«vām rindām var bÅ«t nepiecieÅ”ams manuālais režīms; arÄ« apsveriet, vai nepieejamÄ«bas dēļ ziņojumi netiks pazaudēti)
  • Apturēt mazākuma režīmu
  • pastāvÄ«gas ziņas

Mēs vēl neesam aptvēruÅ”i visus defektu tolerances un augstas pieejamÄ«bas jautājumus; piemēram, kā droÅ”i veikt administratÄ«vās procedÅ«ras (piemēram, slÄ«doÅ”os atjauninājumus). Mums ir arÄ« jārunā par federāciju un Shovel spraudni.

Ja esmu vēl kaut ko palaidis garām, lūdzu, dariet man zināmu.

SkatÄ«t arÄ« manu post, kur es veicu haosu RabbitMQ klasterÄ«, izmantojot Docker un Blockade, lai pārbaudÄ«tu dažus Å”ajā rakstā aprakstÄ«tos ziņojumu zaudÄ“Å”anas scenārijus.

IepriekŔējie raksti sērijā:
Nr. 1 - habr.com/ru/company/itsumma/blog/416629
Nr. 2 - habr.com/ru/company/itsumma/blog/418389
Nr. 3 - habr.com/ru/company/itsumma/blog/437446

Avots: www.habr.com

Pievieno komentāru