Në Sitimobil përdorim bazën e të dhënave MySQL si depozitat kryesore të të dhënave të qëndrueshme. Kemi disa klastera të bazës së të dhënave për shërbime dhe qëllime të ndryshme.
Disponueshmëria e vazhdueshme e masterit është një tregues kritik i funksionimit të sistemit të tërësishëm dhe pjesëve të tij. Rindërtimi automatik i klasterit në rast të dështimit të masterit zvogëlon ndjeshëm kohën e reagimit ndaj incidenteve dhe kohën e pushimit të sistemit. Në këtë artikull do të shqyrtoj skemën e sigurisë së disponueshmërisë së lartë (HA) të klasterit MySQL mbi dhe adresat IP virtuale (VIP).

Zgjidhja HA mbi VIP
Fillimisht do të flas shkurtimisht mbi atë që përfaqëson sistemi ynë i ruajtjes së të dhënave.
Ne pĂ«rdorim njĂ« skemĂ« klasike replikimi me njĂ« master tĂ« vetĂ«m, i cili Ă«shtĂ« nĂ« dispozicion pĂ«r shk writing dhe shumĂ« replika qĂ« pĂ«rdoren vetĂ«m pĂ«r lexim. Klasteri mund tĂ« pĂ«rmbajĂ« njĂ« master ndĂ«rmjetĂ«s â njĂ« nyjĂ« qĂ« Ă«shtĂ« njĂ«kohĂ«sisht replikĂ« dhe master pĂ«r tĂ« tjerĂ«t. KlientĂ«t qasen nĂ« replikat pĂ«rmes HAProxy, qĂ« lejon shpĂ«rndarjen e barabartĂ« tĂ« ngarkesĂ«s dhe lehtĂ«sinĂ« nĂ« shkallĂ«zim. PĂ«rdorimi i HAProxy ka shkak historik dhe tani jemi nĂ« procesin e migrimit nĂ« ProxySQL.
Replikimi realizohet në mënyrë gjysmë-sinkrone në bazë të GTID. Do të thotë, së paku një replikë duhet të regjistrojë transaksionin në log, përpara se të pranohet si e suksesshme. Ky mod i replikimit siguron një balancim optimal midis performancës dhe ruajtjes së të dhënave në rast dështimi të nyjës kryesore. Në përgjithësi, të gjitha ndryshimet dërgohen nga masteri te replikat përmes Row Based Replication (RBR), por disa nyje mund të kenë mixed binlog format.
Orkestratori përditëson periodikisht gjendjen e topologjisë së klasterit, analizon informacionin e marrë dhe në rast problemeve mund të fillojë procedurën e rindërtimit automatik. Vetë procedura është përgjegjësi e zhvilluesit, pasi mund të realizohet në shumë mënyra: mbi VIP, DNS, duke përdorur shërbime zbulimi (service discovery) ose mekanizma të shkruar vetë.
Një nga mënyrat e thjeshta për të rindërtuar masterin në rast të dështimit të tij është përdorimi i adresave VIP lundruese.
ĂfarĂ« duhet tĂ« dini mbi kĂ«tĂ« zgjidhje para se tĂ« vazhdoni mĂ« tutje:
- VIP â Ă«shtĂ« njĂ« adresĂ« IP qĂ« nuk Ă«shtĂ« e lidhur me njĂ« ndĂ«rfaqe fizike tĂ« caktuar rrjeti. Kur njĂ« nyje dĂ«shton ose gjatĂ« punimeve tĂ« planifikuara, ne mund ta kalojmĂ« VIP nĂ« njĂ« burim tjetĂ«r me njĂ« kohĂ« tĂ« minimizuar ndalimi.
- Largimi dhe dhënia e një adrese IP virtuale janë operacione të lira dhe të shpejta.
- Për të punuar me VIP, kërkohet akses në server përmes SSH, ose përdorimi i utilitareve speciale, për shembull,
keepalived.
Të shqyrtojmë problemet e mundshme me masterin tonë dhe të paraqesim se si duhet të funksionojë mekanizmi i rikuperimit automatik.
Lidhja rrjetë është humbur me masterin, ose ka ndodhur një problem në nivelin e "harduerit", dhe serveri nuk është i aksesueshëm.
- Orkestratori përditëson topologjinë e klasterit, çdo riprodhim raporton për mungesën e masterit. Orkestratori nis procesin e zgjedhjes së një riprodhimi të përshtatshëm për rolin e masterit të ri dhe fillon rikuperimin.
- PĂ«rpiqemi tĂ« heqim VIP nga masteri i vjetĂ«r â pa sukses.
- Riprodhimi kalon në rolin e masterit. Topologjia ristrukturohet.
- Shtojmë një ndërfaqe të re rrjeti me VIP. Duke qenë se nuk arritëm ta heqim VIP, në sfond nisemi me dërgimin e periudhshëm të kërkesës gratuitous ARP. Ky lloj kërkese/ndjelljeje lejon përditësimin në switch-ët e lidhur të tabelës së përputhjes së adresave IP dhe MAC, duke njoftuar kështu për lëvizjen e VIP tonë. Kjo minimizon probabilitetin e
split brainnë rastin e rikthimit të masterit të vjetër. - Të gjitha lidhjet e reja menjëherë drejtohen në masterin e ri. Lidhjet e vjetra përfundojnë pa sukses, duke bërë apel të përsëritur në DB në nivelin e aplikacionit.
Serveri punon në mënyrë normale, ka ndodhur një dështim në nivelin e DBMS.
Algoritmi është i ngjashëm me rastin e mëparshëm: përditësimi i topologjisë dhe nisja e procesit të rikuperimit. Duke qenë se serveri është i aksesueshëm, ne me sukses lirojmë VIP-në nga masteri i vjetër, e transferojmë në të riun dhe dërgojmë disa kërkesa ARP. Rikthimi i mundshëm i masterit të vjetër nuk duhet të ndikoje në klasterin e ristrukturuar dhe punën e aplikacionit.
Probleme të tjera
Dështimi i riprodhimeve ose i masterëve të përkohshëm nuk sjell veprime automatike dhe kërkon ndërhyrje manuale.
Interfejsi virtual rrjetit gjithmonĂ« shtohet pĂ«rkohĂ«sisht, qĂ« do tĂ« thotĂ« se pas rinisjes sĂ« serverit, VIP nuk shenjohet automatikisht. Ădo instancĂ« e DB fillon nĂ« mĂ«nyrĂ« standarde nĂ« modalitetin vetĂ«m pĂ«r lexim, orkestratori automatikisht kalon master-in e ri nĂ« tĂ« shkruajtur dhe pĂ«rpiqet tĂ« vendosĂ« vetĂ«m pĂ«r lexim nĂ« master-in e vjetĂ«r. KĂ«to veprime janĂ« tĂ« orientuara pĂ«r tĂ« reduktuar probabilitetin split brain.
Gjatë procesit të rikuperimit mund të ndodhin probleme, për të cilat gjithashtu duhet të njoftoni përmes UI të orkestratorit, përveç mjeteve standarde të monitorimit. Ne kemi zgjeruar REST API duke shtuar këtë mundësi ( aktualisht është në shqyrtim).
Schema e përgjithshme e zgjidhjes HA është e paraqitur më poshtë.

Zgjedhja e master-it të ri
Orkestratori është mjaft i mençur dhe përpiqet të zgjedhë si master të ri sipas këtyre kritereve:
- mungesa e repikës nga master-i;
- versioni i MySQL i master-it dhe repikës;
- tipi i repikimit (RBR, SBR ose miks);
- vlerësimi në një ose më shumë qendra të të dhënave;
- praninë
GTID i gabuarâ transaksionet qĂ« janĂ« kryer nĂ« repikĂ« dhe mungojnĂ« nĂ« master; - po ashtu merren parasysh rregullat e pĂ«rdoruesve pĂ«r zgjedhjen.
Jo çdo repikë është kandidati ideal për rolin e master-it. Për shembull, repika mund të përdoret për kopjimin e të dhënave, ose serveri ka një konfigurim më të dobët të "harduerit". Orkestratori rregulla manuale, me ndihmën e të cilave mund të rregulloni preferencat tuaja për zgjedhjen e kandidatëve nga më të preferuarit deri te ata të injoruar.
Koha e reagimit dhe rikuperimit
Në rastin e një incidenti, është e rëndësishme të minimizohet koha e ndalimit të sistemit, prandaj do të shqyrtojmë parametrat e MySQL që ndikojnë në ndërtimin dhe përditësimin e topologjisë së klasit nga orkestratori:
- â numri i sekondave, pĂ«r tĂ« cilat repika pret ardhjen e tĂ« dhĂ«nave tĂ« reja ose sinjalit heartbeat nga master-i, para se lidhja tĂ« njihet si e humbur dhe tĂ« kryhet ripĂ«rcaktimi. Sa mĂ« i vogĂ«l tĂ« jetĂ« ky vlerĂ«, aq mĂ« shpejt repika do tĂ« jetĂ« nĂ« gjendje tĂ« pĂ«rcaktojĂ« se lidhja me master-in Ă«shtĂ« shkeputur. Ne e vendosim kĂ«tĂ« vlerĂ« tĂ« jetĂ« 5 sekonda.
- â numri i sekondave midis pĂ«rpjekjeve pĂ«r rikthim. NĂ« rast tĂ« problemeve nĂ« rrjet, njĂ« vlerĂ« e ulĂ«t e kĂ«tij parametri do tĂ« lejojĂ« rikthim tĂ« shpejtĂ« dhe do tĂ« parandalojĂ« nisjen e procesit tĂ« rimĂ«kĂ«mbjes sĂ« klasterit. Vlera e rekomanduar Ă«shtĂ« 1 sekondĂ«.
MASTER_RETRY_COUNTâ numri maximal i pĂ«rpjekjeve pĂ«r rikthim.MASTER_HEARTBEAT_PERIODâ intervali nĂ« sekonda, pas tĂ« cilit master-i dĂ«rgon njĂ« sinjal heartbeat. NĂ« parazgjedhje, Ă«shtĂ« e barabartĂ« me gjysmĂ«n e vlerĂ«sslave_net_timeout.
Parametrat e orkestratorit:
DelayMasterPromotionIfSQLThreadNotUpToDateâ nĂ«se Ă«shtĂ« i barabartĂ« metrue, atĂ«herĂ« roli i master-it nuk do tĂ« zbatohet nĂ« replikĂ«n-kandidate derisa rrjedha SQL e replikĂ«s tĂ« pĂ«rfundojĂ« tĂ« gjitha transaksionet e papĂ«rfunduara nga Relay Log. Ne e pĂ«rdorim kĂ«tĂ« opsion pĂ«r tĂ« mos humbur transaksionet nĂ« kushte vonese tĂ« tĂ« gjitha replikave-kandidate.InstancePollSecondsâ frekuenca e ndĂ«rtimit dhe azhurnimit tĂ« topologjisĂ«.RecoveryPollSecondsâ frekuenca e analizĂ«s sĂ« topologjisĂ«. NĂ« rast se zbulohet njĂ« problem, niset rikthimi i topologjisĂ«. Kjo Ă«shtĂ«, e barabartĂ« me 1 sekondĂ«.
Ădo nod nĂ« klasteri pyetet nga orkestratori njĂ« herĂ« nĂ« InstancePollSeconds sekonda. NĂ« rast se zbulohet ndonjĂ« problem, gjendja e klasterit detyrohet, dhe mĂ« pas merret njĂ« vendim pĂ«rfundimtar pĂ«r tĂ« realizuar rikthimin. Duke eksperimentuar me parametra tĂ« ndryshĂ«m tĂ« DB dhe orkestratorit, kemi arritur tĂ« ulemi kohĂ«n e reagimit dhe rikthimit nĂ« 30 sekonda.
Standi i testimit
Testimi i skemës HA e filluam me zhvillimin e një dhe më pas implementimin në mjedise testimi dhe prodhimi. Stenda lokale është plotësisht e automatizuar mbi bazën e Docker-it dhe lejon të eksperimentojmë me konfigurimin e orkestratorit dhe rrjetit, të shkallëzojmë klasterin nga 2-3 servera në disa dhjetëra dhe të zhvillojmë ushtrime në një mjedis të sigurt.
Gjatë ushtrimeve ne zgjedhim një nga metodat e imitim të problemeve: të qetësojmë menjëherë master-in me kill -9, të përfundojmë butë procesin dhe të ndalojmë serverin (docker-compose stop), të imitojmë probleme me rrjetin me iptables -j REJECT ose iptables -j DROP. Ne presim këto rezultate:
- orkestratori do të zbulojë probleme me master-in dhe do të azhurnojë topologjinë për më pak se 10 sekonda;
- procedura e rikthimit do të nisë automatikisht: do të ndryshojë konfigurimi i rrjetit, roli i master-it do të kalojë në replikë, topologjia do të rinovohet;
- masteri i ri do të jetë i disponueshëm për regjistrim, replikat e drejtpërdrejta nuk do të humbasin gjatë procesit të rindërtimit;
- të dhënat do të fillojnë të regjistrohen në masterin e ri dhe të replikohen;
- koha totale e rikuperimit do të jetë jo më shumë se 30 sekonda.
Siç e dini, sistemi mund tĂ« sillej ndryshe nĂ« mjediset e testimit dhe nĂ« ato tĂ« prodhimit pĂ«r shkak tĂ« konfigurimeve tĂ« ndryshme tĂ« âhardueritâ dhe rrjetit, dallimeve nĂ« ngarkesat sintetike dhe reale, etj. Prandaj, herĂ« pas here ne kryejmĂ« ushtrime nĂ« kushte reale, duke kontrolluar se si sillej sistemi nĂ« rast tĂ« humbjes sĂ« lidhjes rrjet dhe degradimit tĂ« disa pjesĂ«ve tĂ« tij. NĂ« tĂ« ardhmen dĂ«shirojmĂ« tĂ« ndĂ«rtuam njĂ« infrastrukturĂ« krejtĂ«sisht identike pĂ«r tĂ« dy mjediset dhe ta automatizojmĂ« testimin e saj.
Përfundimet
Funksionaliteti i nodës kryesore të sistemit të ruajtjes së të dhënave është një nga detyrat kryesore të ekipit SRE dhe të operacioneve. Zbatimi i orkestratorit dhe zgjidhjes HA të bazuar në VIP ka sjellë rezultatet e mëposhtme:
- zbulesa e besueshme e problemeve me topologjinë e klasterit të DB;
- reaksion automatik dhe të shpejtë në incidentet e lidhura me masterin, duke reduktuar kohën e papunësisë së sistemit.
Megjithatë, zgjidhja ka kufizimet dhe disavantazhet e saj:
- zhvillimi i skemës HA në disa Qendra të Dhënash do të kërkojë një rrjet L2 të përbashkët ndërmjet tyre;
- para se të emërojmë VIP në masterin e ri, na nevojitet të lirohet ai në të vjetrin. Procesi është sekuencial, gjë që rrit kohën e rikuperimit;
- lirimi i VIP kërkon qasje SSH në serverin, ose çdo mënyrë tjetër për thirrjen e procedurave të distancuara. Duke qenë se serveri ose DB është duke përjetuar probleme që shkaktuan procesin e rikuperimit, nuk mund të jemi të sigurt se lirimi i VIP do të përfundojë me sukses. Dhe kjo mund të çojë në dy servera me të njëjtin adresë IP virtuale dhe një problem
split brain.
Për të shmangur split brain, mund të përdoret metoda ('Qëlloni Nodën Tjetër Në Kokë'), e cila izolon plotësisht ose fik nodën problematike. Ka edhe mënyra të tjera për realizimin e disponueshmërisë së lartë të klasterit: kombinimi i VIP dhe DNS, zbulimi i shërbimeve dhe shërbimet proxy, replikimi sinkron dhe metoda të tjera, të cilat kanë disavantazhet dhe avantazhet e tyre.
Kam tregova për qasjen tonë në krijimin e një klasteri MySQL me tolerancë për dështime. Ai është i lehtë për t'u zbatuar dhe ofron një nivel të pranueshëm besueshmërie në kushtet aktuale. Ndërsa sistemi zhvillohet si një e tërë dhe infrastruktura në veçanti, ky qasje do të evoluojë pa dyshim.
Burimi: habr.com
