Tarantool Cartridge: Lua-taustal oleva shardimine kolmes reas

Tarantool Cartridge: Lua-taustal oleva shardimine kolmes reas

Mail.ru Grupil on meil Tarantool – see on Lua-skripti server, mis on ĂŒhtlasi ka andmebaas (vĂ”i vastupidi?). See on kiire ja suurepĂ€rane, kuid ĂŒhe serveri vĂ”imalused pole ikkagi piiramatud. Vertikaalne skaleerimine pole ka imerohi, seega on Tarantoolis tööriistad horisontaalseks skaleerimiseks – moodul vshard. [1]See vĂ”imaldab andmeid jagada mitme serveri vahel, kuid selle seadistamine ja Ă€riloogika lisamine nĂ”uab siiski vaeva.

Hea uudis: me Ôppisime oma vigadest (nÀiteks [2], [3]) ja lÔime uue raamistiku, mis lihtsustab selle probleemi lahendamist oluliselt.

Tarantool Cartridge on uus raamistiku komplekt keerukate jaotatud sĂŒsteemide arendamiseks. See vĂ”imaldab keskenduda Ă€riloogika kirjutamisele, mitte infrastruktuuri probleemide lahendamisele. Allpool rÀÀgin, kuidas see raamistiku struktuur töötab ja kuidas selle abil kirjutada jaotatud teenuseid.

Mis siis tÀpselt probleem on?

Meil on tainanul, meil on vshard – mida veel soovida?

Esiteks, asi on mugavuses. Vshardi konfiguratsioon seadistatakse Lua-tabelite kaudu. Et jaotatud sĂŒsteem mitme Tarantooli protsessiga Ă”igesti töötaks, peab konfiguratsioon olema igal pool sama. Keegi ei taha seda kĂ€sitsi teha. SeetĂ”ttu tuleb mĂ€ngu erinevad skriptid, Ansible, juurutussĂŒsteemid.

Cartridge haldab ise vshardi konfiguratsiooni, tehes seda oma enda jaotatud konfiguratsiooni. Sisuliselt on see lihtne YAML-fail, mille koopia on iga Tarantooli eksemplari juures. Lihtsustamine seisneb selles, et raamistiku enda ĂŒlesanne on jĂ€lgida oma konfiguratsiooni ja tagada, et see kĂ”ikjal ĂŒhesugune oleks.

Teiseks, asi on taas mugavuses. Vshardi konfiguratsioonil pole mingit seost Àriloogika arendamisega ja see hÀirib arendajat tööst. Kui arutame, kuidas projektide arhitektuur vÀlja nÀeb, rÀÀgime enamasti eraldi komponentidest ja nende omavahelisest suhtlemisest. Kolme andmeregioni kasti viimisele mÔtlemine on veel liiga vara.

Oleme neid probleeme korduvalt lahendanud ja mingil hetkel oleme suutnud vĂ€lja töötada lĂ€henemise, mis lihtsustab igasuguseid ĂŒlesandeid kogu rakenduse elutsĂŒkli jooksul: loomine, arendamine, testimine, CI/CD, hooldus.

Cartridge toob introduktsiooni kontseptsiooni rollist iga Tarantooli protsessi jaoks. Rollid on see kontseptsioon, mis vĂ”imaldab arendajal keskenduda koodi kirjutamisele. KĂ”iki projekti rolle saab kĂ€ivitada ĂŒhes Tarantooli kopeerimises, ja testimiseks on sellest piisavalt.

Tarantool Cartridge peamised funktsioonid:

  • automaatne klastrite orkestreerimine;
  • rakenduse funktsionaalsuse laiendamine uute rollide abil;
  • rakenduse malli arendamiseks ja juurutamiseks;
  • sisseehitatud automaatne shardimine;
  • integratsioon testimisraamistiku Luatestiga;
  • klastri haldamine WebUI ja API kaudu;
  • pakendamise ja juurutamise tööriistad.

Tere, maailm!

Ma ei suuda oodata, et nÀidata raamistiku enda, seega jÀtame arhitektuuri jutu hiljem ja alustame lihtsast. Kui eeldada, et Tarantool on juba paigaldatud, siis tuleb teha ainult

$ tarantoolctl rocks install cartridge-cli
$ export PATH=$PWD/.rocks/bin/:$PATH

Need kaks kÀsku installivad kÀsurealiidesed ja vÔimaldavad luua oma esimese rakenduse mallist:

$ cartridge create --name myapp

Ja siin on, mida me saame:

myapp/
├── .git/
├── .gitignore
├── app/roles/custom.lua
├── deps.sh
├── init.lua
├── myapp-scm-1.rockspec
├── test
│   ├── helper
│   │   ├── integration.lua
│   │   └── unit.lua
│   ├── helper.lua
│   ├── integration/api_test.lua
│   └── unit/sample_test.lua
└── tmp/

See on git-repositorium valmis "Tere, maailm!" rakendusega. Proovime seda kohe kÀivitada, enne kui paigaldame sÔltuvused (sh raamistik):

$ tarantoolctl rocks make
$ ./init.lua --http-port 8080

Seega on meil kĂ€ivitunud ĂŒks sĂ”lm tulevase shardimise rakenduse jaoks. Uudishimu tĂ”ttu vĂ”ib tavaline kasutaja kohe avada veebiliidese, konfigureerida ĂŒhe sĂ”lme klusti hiire abil ja nautida tulemust, kuid veel on vara rÔÔmustada. Praegu ei oska rakendus teha midagi kasulikku, seega rÀÀgin juurutamisest hiljem, ja nĂŒĂŒd on aeg kirjutada koodi.

Rakenduste arendamine

Kujutage ette, et kujundame projekti, mis peab andmeid vastu vÔtma, neid salvestama ja korra pÀevas aruannet koostama.

Tarantool Cartridge: Lua-taustal oleva shardimine kolmes reas

Alustame skeemi joonistamist ja paigutame sinna kolm komponenti: gateway, storage ja scheduler. Töötame arhitektuuri edasi. Kuna kasutame salvestusena vshard, siis lisame skeemile vshard-routeri ja vshard-storage'i. Ei gateway ega scheduler ei vĂ”ta salvestusega otseselt ĂŒhendust, selleks on olemas ruuter, mis on selle jaoks loodud.

Tarantool Cartridge: Lua-taustal oleva shardimine kolmes reas

See skeem ei kajasta veel tĂ€pselt, mida me projektis loome, sest komponendid nĂ€evad vĂ€lja abstraktsed. Peame veel vaatama, kuidas see tĂ”elisele Tarantoolile projitseerub — grupeerime komponendid protsesside kaupa.

Tarantool Cartridge: Lua-taustal oleva shardimine kolmes reas

Hoida vshard-routerit ja gateway'd eraldi instantsides pole mĂ”tet. Miks me peaksime nĂ€tukene rohkem vĂ”rgus liikuma, kui see on juba routeri ĂŒlesanne? Need peaksid olema kĂ€ivitatud ĂŒhes protsessis. See tĂ€hendab, et ĂŒhes protsessis initsialiseeritakse nii gateway kui vshard.router.cfg, ja las nad suhtlevad kohapeal.

Projekteerimise etapis oli mugav töötada kolme komponendiga, kuid mina, kui arendaja, ei taha koodi kirjutades mĂ”elda kolme Tarnatooli instantsi kĂ€ivitamisele. Mul on vaja kĂ€ivitada testid ja kontrollida, et olen Ă”igesti gateway'd kirjutanud. VĂ”i vĂ”ib-olla tahan, et mu kolleegid nĂ€eksid funktsiooni. Miks ma peaksin hĂ€daldama kolme instantsi kĂ€ivitamise ĂŒle? Sellest sĂŒndis rollide kontseptsioon. Rool on tavaline Lua moodul, mille elu tsĂŒklit haldab Cartridge. Antud nĂ€ites on neid neli — gateway, router, storage ja scheduler. Teises projektis vĂ”ib neid olla rohkem. KĂ”iki rolle saab kĂ€ivitada ĂŒhes protsessis, ja sellest piisab.

Tarantool Cartridge: Lua-taustal oleva shardimine kolmes reas

Ja kui tuleb rÀÀkida juurutamisest stagingus vÔi toodangus, siis mÀÀrame igale Tarantooli protsessile vastavalt riistvarale oma rollide komplekti:

Tarantool Cartridge: Lua-taustal oleva shardimine kolmes reas

Topoloogia haldamine

Teavet selle kohta, kus missugused rollid on kÀivitatud, tuleb kuskil hoida. Ja see 'kuskil' on jaotatud konfiguratsioon, millest ma juba varem mainisin. KÔige tÀhtsam selles on klastrite topoloogia. Siin on kujutatud 3 replikaatide gruppi, kus on 5 Tarantooli protsessi:

Tarantool Cartridge: Lua-taustal oleva shardimine kolmes reas

Me ei taha andmeid kaotada, seega kohtleme hoolikalt teavet kĂ€imasolevate protsesside kohta. Cartridge jĂ€lgib konfiguratsiooni kahefaasilise commitiga. Kui soovime konfiguratsiooni vĂ€rskendada, kontrollib ta esmalt, kas kĂ”ik instantsid on saadaval ja valmis uut konfiguratsiooni vastu vĂ”tma. SeejĂ€rel rakendatakse teine faas konfiguratsioon. Seega, isegi kui ĂŒks instants peaks ajutiselt kĂ€ttesaamatuks osutuma, ei juhtu midagi halba. Konfiguratsioon lihtsalt ei rakendu ja te nĂ€ete ette viga.

Samuti on topoloogia jaotises mĂ€rgitud oluline parameeter, nagu iga replikatsioonigruppi juht. Tavaline on, et see on see eksemplar, kuhu kirjutatakse. ÜlejÀÀnud on enamasti ainult lugemiseks, kuigi siin vĂ”ivad olla erandeid. MĂ”nikord ei karda julged arendajad konflikte ja vĂ”ivad kirjutada andmeid mitmele replikale samaaegselt, kuid on teatud toimingud, mida hoolimata kĂ”igest ei tohiks kaks korda tĂ€ita. Selleks on olemas liidri tunnus.

Tarantool Cartridge: Lua-taustal oleva shardimine kolmes reas

Rollide elu

Et abstraktne roll vÔiks sellises arhitektuuris eksisteerida, peab raamistik neid kuidagi haldama. Loomulikult toimub juhtimine ilma Tarantooli protsessi taaskÀivitamiseta. Rollide haldamiseks on olemas 4 tagasisidet. Cartridge kutsub need automaatselt esile vastavalt sellele, mida on mÀÀratud jaotatud konfiguratsioonis, rakendades seelÀbi konfiguratsiooni konkreetsetele rollidele.

function init()
function validate_config()
function apply_config()
function stop()

Igal rollil on funktsioon — algne ettevalmistus enne juurutamist, siin vĂ”ib olla kĂ”ike: sĂ”ltuvuste allalaadimist, saladuste lahtipakkimist ja muud.. See kutsutakse esile ainult ĂŒks kord kas rolli sisselĂŒlitamisel vĂ”i Tarantooli taaskĂ€ivitamisel. Seal on mugav nĂ€iteks initsialiseerida box.space.create vĂ”i vĂ”ib ajakava kĂ€ivitada mĂ”ne taustafunktsiooni, mis tĂ€idab tööd teatud ajavahemike jĂ€rel.

Üks funktsioon — algne ettevalmistus enne juurutamist, siin vĂ”ib olla kĂ”ike: sĂ”ltuvuste allalaadimist, saladuste lahtipakkimist ja muud. vĂ”ib olla ebapiisav. Cartridge vĂ”imaldab rollidel kasutada jaotatud konfiguratsiooni, mida ta topoloogia salvestamiseks kasutab. Saame samas konfiguratsioonis kuulutada uue sektsiooni ja salvestada sinna osa Ă€rikonfiguratsioonist. Minu nĂ€ites vĂ”ib see olla andmeedastus vĂ”i ajakava seaded rolli ajakava jaoks.

Klastri kutsub esile validate_config ja apply_config iga kord, kui jaotatud konfiguratsioonis toimub muudatus. Kui konfiguratsioon rakendatakse kahefosaalse pĂŒhendamisega, kontrollib klass, et iga roll on valmis selle uue konfiguratsiooniga nĂ”ustuma ja vajadusel teavitab kasutajat veast. Kui kĂ”ik on nĂ”us, et konfiguratsioon on korras, siis tĂ€idetakse apply_config.

Samuti on rollidel meetod stop, mis on vajalik rolli tegevuse tulemuste puhastamiseks. Kui me ĂŒtleme, et ajakava ei ole enam sellel serveril vajalik, vĂ”ib ta peatada need funktsioonid, mille ta oli kĂ€ivitanud. — algne ettevalmistus enne juurutamist, siin vĂ”ib olla kĂ”ike: sĂ”ltuvuste allalaadimist, saladuste lahtipakkimist ja muud..

Rolle vĂ”ivad omavahel suhelda. Oleme harjunud kirjutama funktsioonikĂ”nesid Lua keeles, kuid vĂ”ib juhtuda, et selle protsessi kĂ€igus ei ole meil vajalikku rolli. Selleks, et hĂ”lbustada vĂ”rguĂŒlekandeid, kasutame abimoodulit rpc (remote procedure call), mis on ĂŒles ehitatud standardsele netboxile, mis on integreeritud Tarantooli. See vĂ”ib olla kasulik, kui nĂ€iteks teie gateway soovib otse schedulerilt kĂŒsida, et teha töö praegu, mitte oodata terve pĂ€ev.

Teine oluline punkt on tĂ”rketaluvuse tagamine. Cartridge'is kasutatakse tervisekontrolliks SWIM-protokolli. [4]. Kui öelda lĂŒhidalt, siis protsessid jagavad ĂŒksteisega "kuuldusi" UDP kaudu — iga protsess rÀÀgib oma naabritele viimased uudised ning nad vastavad. Kui vastust ei tule, hakkab Tarantool midagi kahtlustama ja mĂ”ne aja pĂ€rast kuulutab vĂ€lja surma ja hakkab seda uudist kĂ”igile ĂŒmbritsevatele rÀÀkima.

Tarantool Cartridge: Lua-taustal oleva shardimine kolmes reas

Selle protokolli pÔhjal korraldab Cartridge automaatse tÔrke kÀitlemise. Iga protsess jÀlgib oma keskkonda, ja kui liider Àkki enam ei vasta, vÔib replikatsioon vÔtta tema rolli enda kanda ning Cartridge konfigureerib vastavalt kÀivitatud rolle.

Tarantool Cartridge: Lua-taustal oleva shardimine kolmes reas

Siin peab olema ettevaatlik, sest sage edasi-tagasi lĂŒlitamine vĂ”ib pĂ”hjustada andmete konflikte replikatsioonis. Automaatse failoveri lubamine ilma kaalutlemata ei ole kindlasti mĂ”istlik. Tuleb selgelt mĂ”ista, mis toimub, ja olla kindel, et replikatsioon ei riku end pĂ€rast seda, kui liider on taastunud ja tema troon on talle tagasi antud.

KĂ”igest eelnevast vĂ”ib jÀÀda mulje, et rollid sarnanevad mikroteenustele. MĂ”nes mĂ”ttes nad ongi seda, vaid kui moodulid Tarantooli protsesside sees. Kuid on ka mitmeid pĂ”himĂ”ttelisi erinevusi. Esiteks peavad kĂ”ik projekti rollid olema ĂŒhes koodibaasis. Ja kĂ”ik Tarantooli protsessid peaksid kĂ€ivituma ĂŒhest koodibaasist, et vĂ€ltida ĂŒllatusi, nagu need, kui pĂŒĂŒame algatada schedulerit, aga see ei ole lihtsalt olemas. Samuti ei tohiks lubada koodiversioonide erinevusi, kuna sellises olukorras on sĂŒsteemi kĂ€itumine vĂ€ga keeruline ennustada ja tĂ”rkeid lahendada.

Erinevalt Dockerist ei saa me lihtsalt vĂ”tta rolli „kuvandi“, viia see teisele masinale ja seal kĂ€ivitada. Meie rollid ei ole sama suletud kui Docker-konteinerid. Samuti ei saa me ĂŒhel eksemplaril kĂ€ivitada kaht identset rolli. Rull on kas olemas vĂ”i mitte, mingis mĂ”ttes on see ainus (singleton). Ja kolmandaks, kogu replikatsioonigrupi sees peavad rollid olema ĂŒhesugused, sest muidu oleks see absurdne — andmed on ĂŒhesugused, aga konfigureerimine erinev.

Paigaldustooted

Lubasin nÀidata, kuidas Cartridge aitab rakendusi paigaldada. Kolleegide elu lihtsustamiseks pakib raamistik RPM-pakette:

$ cartridge pack rpm myapp -- pakib meile .\/myapp-0.1.0-1.rpm
$ sudo yum install .\/myapp-0.1.0-1.rpm

Installitud pakett sisaldab peaaegu kÔike vajalikku: nii rakendust kui ka installitud luu-nÔudeid. Tarantool tuleb serverisse ka RPM-paketi sÔltuvusena, ja meie teenus on valmis kÀivitamiseks. See toimub lÀbi systemd, kuid enne tuleb kirjutada veidi konfigureerimist. VÀhemalt tuleb nÀidata iga protsessi URI. Kolm nÀidet on piisavad.

$ sudo tee \/etc\/tarantool\/conf.d\/demo.yml <<CONFIG
myapp.router: {"advertise_uri": "localhost:3301", "http_port": 8080}
myapp.storage_A: {"advertise_uri": "localhost:3302", "http_enabled": False}
myapp.storage_B: {"advertise_uri": "localhost:3303", "http_enabled": False}
CONFIG

Siin on huvitav nĂŒanss. Selle asemel, et nĂ€idata ainult binaarprotokolli porti, nĂ€itame me protsessi avalikku aadressi koos hostinimega. See on vajalik, et klastrite sĂ”lmed teaksid, kuidas omavahel ĂŒhendust luua. Halb idee on kasutada advertise_uri aadressina 0.0.0.0, see peaks olema vĂ€line IP-aadress, mitte soketi bindi aadress. Ilma selleta ei toimi mitte miski, seega Cartridge ei luba lihtsalt vale advertise_uri'ga sĂ”lme kĂ€ivitada.

NĂŒĂŒd, kui konfigureerimine on valmis, saame protsessid kĂ€ivitada. Kuna tavaline systemd-ĂŒhik ei luba kĂ€ivitada rohkem kui ĂŒhte protsessi, paigaldab Cartridge rakendused nn instantsi-ĂŒhikud, mis töötavad jĂ€rgmiselt:

$ sudo systemctl start myapp@router
$ sudo systemctl start myapp@storage_A
$ sudo systemctl start myapp@storage_B

Konfigureerimises oleme mÀÀranud HTTP-pordi, millel Cartridge teenindab veebiliidest — 8080. KĂ€ime seal ja vaatame:

Tarantool Cartridge: Lua-taustal oleva shardimine kolmes reas

NĂ€eme, et protsessid on kĂ€ivitatud, kuid pole veel konfigureeritud. Kassett ei tea veel, kes kellega replitseerima peab, ja ei saa otsuseid iseseisvalt teha, seetĂ”ttu ootab ta meie samme. Meie valik on piiratud: uue klastriga alustamine toimub esimese sĂ”lme konfigureerimisega. Hiljem lisame ĂŒlejÀÀnud klastrisse, mÀÀrame neile rollid ja seelĂ€bi vĂ”ib juurutust pidada edukalt lĂ”pule viidud.

Valame oma lemmikjooki ja lÔÔgastume pika töö nÀdala jÀrel. Rakendust saab kasutada.

Tarantool Cartridge: Lua-taustal oleva shardimine kolmes reas

Summary

Aga kuidas on tulemused? Proovige, kasutage, jÀtke tagasisidet, avage tikette GitHubis.

Viidatud lingid

[1] Tarantool » 2.2 » Viidatud » Rocks viide » Moodul vshard

[2] Kuidas me rakendasime Alfa-Panga investeerimistoodet Tarantooli baasil

[3] Uue pĂ”lvkonna arveldusarkitektuur: transformatsioon ĂŒleminekul Tarantoolile

[4] SWIM — klastrite loomise protokoll

[5] GitHub — tarantool/cartridge-cli

[6] GitHub — tarantool/cartridge

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster