Në Sitimobil, ne përdorim bazën e të dhënave MySQL si magazinën kryesore të të dhënave të përhershme. Kemi disa grupe të të dhënave për shërbime dhe objektiva të ndryshme.
Disponueshmëria e vazhdueshme e masterit është një tregues kritik i funksionimit të gjithë sistemit dhe pjesëve të tij. Rindërtimi automatik i grupit në rastin e dështimit të masterit zvogëlon ndjeshëm kohën e përgjigjes ndaj incidenteve dhe kohën e papunësisë së sistemit. Në këtë artikull do të shqyrtoj skemën e sigurimit të disponueshmërisë së lartë (HA) të grupit MySQL të bazuar në dhe adresave IP virtuale (VIP).

Zgjidhje HA e bazuar në VIP
Më parë do të shpjegoj shkurtimisht se çfarë ka sistemi ynë i ruajtjes së të dhënave.
Ne pĂ«rdorim njĂ« skemĂ« klasike replikimi me njĂ« master tĂ« vetĂ«m, i cili Ă«shtĂ« i disponueshĂ«m pĂ«r shkrim, dhe shumĂ« replika, tĂ« cilat pĂ«rdoren vetĂ«m pĂ«r lexim. Klienti mund tĂ« pĂ«rmbajĂ« njĂ« master tĂ« mesĂ«m â njĂ« nyje qĂ« Ă«shtĂ« njĂ«kohĂ«sisht dhe njĂ« replikĂ«, dhe master pĂ«r tĂ« tjerĂ«t. KlientĂ«t i drejtohen kopjeve pĂ«rmes HAProxy, qĂ« lejon shpĂ«rndarjen e barabartĂ« tĂ« ngarkesĂ«s dhe lehtĂ«si nĂ« shkallĂ«zim. PĂ«rdorimi i HAProxy Ă«shtĂ« pĂ«r shkak tĂ« arsyeve historike, dhe tani jemi nĂ« procesin e migrimit nĂ« ProxySQL.
Replikimi kryhet në një mod të gjysmë sinkronizuar bazuar në GTID. Kjo do të thotë se të paktën një replikë duhet të regjistrojë transaksionin në regjistër, përpara se të njihet si e suksesshme. Ky mod replikimi ofron balancimin optimal midis performancës dhe ruajtjes së të dhënave në rast se ndodhi dështimi i nyjës kryesore. Kryesisht, të gjitha ndryshimet transmetohen nga masteri në replikë përmes Replikimit të Bazeve të Rreshtit (RBR), por disa nyje mund të kenë formati mixed binlog.
Orkestratori përditëson periodikisht gjendjen e topologjisë së klasterit, analizon informacionin e marrë dhe në rast problemi mund të nisë procedurën e rikuperimit automatik. Për vetë procedurën përgjigjet zhvilluesi, pasi ajo mund të realizohet në mënyra të ndryshme: në bazë të VIP, DNS, duke përdorur shërbime zbulimi të shërbimeve (service discovery) ose mekanizma të shkruar vetë.
Një nga mënyrat e thjeshta për të rikuperuar master-in në rast dështimi është përdorimi i adresave VIP lëvizëse.
ĂfarĂ« duhet tĂ« dimĂ« rreth kĂ«tij zgjidhjeje para se tĂ« vazhdojmĂ«:
- VIP është një adresë IP që nuk është e lidhur me një ndërfaqe fizike të caktuar të rrjetit. Kur një nyje dështon ose gjatë punimeve të planifikuara, mund të ndërrojmë VIP në një burim tjetër me minimumin e kohës së papunësisë.
- Ălirimi dhe lĂ«shimi i njĂ« adrese IP virtuale janĂ« operacione tĂ« lira dhe tĂ« shpejta.
- Për të punuar me VIP, kërkohet qasje në serverin përmes SSH, ose përdorimi i utilitareve speciale, për shembull,
keepalived.
Le të shqyrtojmë problemet e mundshme me master-in tonë dhe të paraqesim se si duhet të funksionojë mekanizmi i rikuperimit automatik.
Ka humbur lidhja rrjet me masterin, ose ka ndodhur një problem në nivelin e "harduerit", dhe serveri nuk është i aksesueshëm.
- Orkestratori po përditëson topologjinë e klasterit, çdo replikë raporton për mospërfshirjen e masterit. Orkestratori nis procesin e zgjedhjes së një replice të përshtatshme për rolin e masterit të ri dhe fillon rikuperimin.
- Po pĂ«rpiqemi tĂ« heqim VIP nga masteri i vjetĂ«r â pa sukses.
- Repika kalon në rolin e masterit. Topologjia rindërtohet.
- Po shtojmë një ndërfaqe të re rrjeti me VIP. Duke qenë se nuk arritëm ta heqim VIP-in, në sfond nisnim një dërgim të rregullt të kërkesës. gratuitous ARP. Ky lloj kërkese/faqe lejon përditësimin në switch-at e lidhur të tabelës së përputhjes së IP- dhe MAC-adresave, duke njoftuar kështu për zhvendosjen e VIP-it tonë. Kjo minimizon probabilitetin e
split brainnë kthimin e masterit të vjetër. - Të gjitha lidhjet e reja menjëherë redirektohen në masterin e ri. Lidhjet e vjetra përfundojnë me dështim, duke kryer kërkesa të përsëritura në DB në nivelin e aplikacionit.
Serveri punon në modalitet normal, është shfaqur një dështim në nivelin e DBMS.
Algoritmi është i ngjashëm me rastin e mëparshëm: përmirësimi i topologjisë dhe nisja e procesit të rikuperimit. Duke qenë se serveri është në dispozicion, ne me sukses lirojmë VIP-in në master-in e vjetër, e transferojmë atë tek ai i ri dhe dërgojmë disa kërkesa ARP. Rikthimi i mundshëm i master-it të vjetër nuk duhet të ndikojë në klasterin e ndërtuar dhe funksionimin e aplikacionit.
Problemet e tjera
Dështimi i kopjeve ose masterëve të ndërmjetëm nuk çon në veprime automatike dhe kërkon ndërhyrje manuale.
Interface-i virtual i rrjetit gjithmonĂ« shtohet pĂ«rkohĂ«sisht, domethĂ«nĂ« pas rindizjes sĂ« serverit VIP nuk i caktohet automatikisht. Ădo instancĂ« e DB fillon pĂ«r default nĂ« modin e leximit vetĂ«m, orkestratori automatikisht ndĂ«rron master-in e ri nĂ« shkrim dhe provon tĂ« vendosĂ« lexim vetĂ«m nĂ« master-in e vjetĂ«r. KĂ«to veprime synojnĂ« tĂ« zvogĂ«lojnĂ« probabilitetin split brain.
Gjatë procesit të rikuperimit mund të ndodhin probleme, për të cilat gjithashtu duhet të njoftohet përmes UI të orkestratorit përveç mjeteve standarde të monitorimit. Ne kemi zgjeruar REST API-në, duke shtuar këtë mundësi ( aktualisht është në shqyrtim).
Diagrami i përgjithshëm i zgjidhjes HA paraqitet më poshtë.

Zgjedhja e masterit të ri
Orkestratori është mjaft i mençur dhe përpiqet të zgjedhë si master të ri sipas kritereve të mëposhtme:
- distanca e replikës nga masteri;
- versioni i MySQL të masterit dhe replikës;
- tipo i replikimit (RBR, SBR ose mixed);
- pozita në të njëjtin ose në qendra të ndryshme të të dhënave;
- praninë
GTID i gabuarâ transaksionet qĂ« janĂ« kryer nĂ« replikĂ« dhe mungojnĂ« nĂ« master; - rregullat e zgjedhjes tĂ« pĂ«rdoruesve gjithashtu merren parasysh.
Jo çdo replikë është një kandidatë ideal për rolin e masterit. Për shembull, një replikë mund të përdoret për backup të të dhënave, ose serveri ka një konfigurim të dobët të 'harduerit'. Orkestratori rregulla manuale, me ndihmën e të cilave mund të përcaktoni preferencat tuaja për zgjedhjen e kandidatit nga më të preferuarit deri tek ata që injorohen.
Koha e reagimit dhe rikuperimit
Në rast incidenti, është e rëndësishme të minimizohet koha e pezullimit të sistemit, prandaj do të shqyrtojmë parametrat e MySQL që ndikojnë në ndërtimin dhe përditësimin e topologjisë së klasterit nga orkestratori:
- â numri i sekondave gjatĂ« tĂ« cilĂ«ve njĂ« replikĂ« pret pĂ«r tĂ« marrĂ« tĂ« dhĂ«na tĂ« reja ose sinjalin heartbeat nga masteri, para se lidhja tĂ« njihet si e humbur dhe tĂ« kryhet ri-lidhja. Sa mĂ« e vogĂ«l tĂ« jetĂ« vlera, aq mĂ« shpejt do tĂ« jetĂ« nĂ« gjendje replikimi tĂ« pĂ«rcaktojĂ« se lidhja me masterin Ă«shtĂ« prishur. Ne e vendosim kĂ«tĂ« vlerĂ« nĂ« 5 sekonda.
- â numri i sekondave midis pĂ«rpjekjeve pĂ«r ri-lidhje. NĂ« rast tĂ« problemeve tĂ« rrjetit, njĂ« vlerĂ« e ulĂ«t e kĂ«tij parametri do tĂ« lejojĂ« ri-lidhjen e shpejtĂ« dhe do tĂ« parandalojĂ« nisjen e procesit tĂ« rikuperimit tĂ« klasterit. Vlera e rekomanduar Ă«shtĂ« 1 sekond.
MASTER_RETRY_COUNTâ numri maksimal i pĂ«rpjekjeve pĂ«r ri-lidhje.MASTER_HEARTBEAT_PERIODâ intervali nĂ« sekonda, pas tĂ« cilit masteri dĂ«rgon sinjalin heartbeat. Me default Ă«shtĂ« gjysma e vlerĂ«sslave_net_timeout.
Parametrat e orkestratorit:
DelayMasterPromotionIfSQLThreadNotUpToDateâ nĂ«se Ă«shtĂ« i barabartĂ« mee vĂ«rtetĂ«, roli i masterit nuk do tĂ« aplikohet nĂ« replikĂ«n-kandidate derisa rrjeta SQL e replikĂ«s tĂ« ketĂ« pĂ«rfunduar tĂ« gjitha transaksionet e papĂ«rfunduara nga Relay Log. Ne e pĂ«rdorim kĂ«tĂ« opsion pĂ«r tĂ« mos humbur transaksionet nĂ« kushte tĂ« prapambetjes sĂ« tĂ« gjithĂ« 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, e barabartĂ« me 1 sekondĂ«.
Ădo nyje e klasterit kontrollohet nga orkestratori njĂ« herĂ« nĂ« InstancePollSeconds sekondĂ«. NĂ« rast zbulimi tĂ« njĂ« problemi, gjendja e klasterit pĂ«rditĂ«sohet me forcĂ«, dhe pastaj merret njĂ« vendim pĂ«rfundimtar mbi kryerjen e rikthimit. Duke eksperimentuar me parametra tĂ« ndryshĂ«m tĂ« DB dhe orkestratorit, arritĂ«m tĂ« ulni kohĂ«n e pĂ«rgjigjes dhe rikthimit nĂ« 30 sekonda.
Njësia e testimit
Testimin e skemës HA e nisim me zhvillimin e një dhe implementimin e mëtejshëm në mjediset testuese dhe të prodhimit. Stenda lokale është plotësisht e automatizuar mbi bazën e Docker dhe lejon eksperimentimin me konfigurimin e orkestratorit dhe rrjetit, duke shkallëzuar klasterin nga 2-3 serverë në disa dhjetëra dhe duke realizuar stërvitje në një ambient të sigurt.
Gjatë stërvitjeve, ne zgjedhim një nga metodat e simulimit të problemit: të qëllojmë menjëherë master-in me kill -9, të përfundojmë butësisht procesin dhe të ndalojmë serverin (docker-compose stop), imituar probleme me rrjetin duke përdorur iptables -j REJECT ose iptables -j DROP. Ne presim rezultate të tilla:
- orkestratori do të zbulojë problemet me masterin dhe do të azhurnojë topologjinë brenda 10 sekondave;
- procedura e rikuperimit do tĂ« niset automatikisht: konfigurimi i rrjetit do tĂ« ndryshojĂ«, roli i masterit do tâi kalojĂ« njĂ« replikimi, topologjia do tĂ« ristrukturohet;
- masteri i ri do të bëhet i accesueshëm për të shkruar, dhe replikat aktive nuk do të humbasin gjatë procesit të ristrukturimit;
- 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Ă« sillet ndryshe nĂ« ambientet testuese dhe production pĂ«r shkak tĂ« konfigurimeve tĂ« ndryshme tĂ« âhardueritâ dhe rrjetit, dallimeve midis ngarkesĂ«s sintetike dhe reale etj. Prandaj, periodicisht ne zhvillojmĂ« ushtrime nĂ« kushte reale, duke testuar se si sillet sistemi gjatĂ« humbjes sĂ« lidhjes rrjetore ose degradimit tĂ« pjesĂ«ve tĂ« saj. NĂ« tĂ« ardhmen, duam tĂ« ndĂ«rtojmĂ« njĂ« infrastrukturĂ« plotĂ«sisht identike pĂ«r tĂ« dy ambientet dhe ta automatizojmĂ« testimin e saj.
Përfundimet
Funksionaliteti i nyjes kryesore të sistemit të ruajtjes të dhënash është një nga detyrat kryesore të ekipit SRE dhe të operacioneve. Implementimi i orkestruesit dhe zgjidhjes HA të bazuar në VIP ka mundësuar arritjen e rezultateve të mëposhtme:
- zbulim të besueshëm të problemeve me topologjinë e klasterit të DB;
- reagim automatike dhe të shpejtë ndaj incidenteve që lidhen me masterin, gjë që ul kohën e papunësisë së sistemit.
Megjithatë, zgjidhja ka kufizime dhe disavantazhe:
- shkallëzimi i skemës HA në disa QENDRA të DAD-it do të kërkojë një rrjet L2 të përbashkët midis tyre;
- përpara se të caktojmë VIP në masterin e ri, na nevojitet të lironim atë në të vjetrin. Procesi është sekuencial, gjë që rrit kohën e rikthimit;
- lirimi i VIP kërkon akses SSH në server, ose ndonjë mundësi tjetër për thirrjen e procedurave të largëta. Nëse serveri ose DB ka probleme që shkaktojnë procesin e rikthimit, nuk mund të jemi të sigurt se heqja e VIP do të përfundojë me sukses. Kjo mund të çojë në dy serverë me të njëjtin adresë IP virtuale dhe të krijojë një problem
split brain.
Për të shmangur split brain, mund të përdorim metodën («Shoot The Other Node In The Head»), i cili izolon plotësisht ose çaktivizon nyjën problematike. Ekzistojnë edhe mënyra të tjera për të realizuar disponueshmërinë e lartë të grupit: kombinimi i VIP dhe DNS, zbulimi i shërbimeve dhe shërbimet proxy, replikimi sinkron dhe mënyra të tjera që kanë avantazhe dhe disavantazhe të veta.
Kam folur për qasjen tonë në krijimin e një grupi MySQL të papërshkueshëm nga dështimet. Ai është i lehtë për t'u zbatuar dhe siguron një nivel të pranueshëm të besueshmërisë në kushtet aktuale. Ndërsa sistemi i tërë dhe infrastruktura veç e veç do të zhvillohen, kjo qasje padyshim do të evoluojë.
Burimi: habr.com
