
Mail.ru Groupis on Tarantool â see on Lua-l pĂ”hinev rakenduste server, mis on samal ajal ka andmebaas (vĂ”i vastupidi?). See on kiire ja suurepĂ€rane, kuid ĂŒhe serveri vĂ”imalused pole siiski piiramatud. Vertikaalne skaleerimine ei ole siiski imerohi, seega on Tarantoolis tööriistad horisontaalseks skaleerimiseks â moodul vshard. . See vĂ”imaldab andmeid jagada mitme serveri vahel, kuid selle seadistamine ja Ă€riloogika juurde ĂŒhendamine vĂ”ib olla paras peavalu.
Head uudised: me oleme saanud eksimustest Ôppida (nÀiteks , ) ja oleme loonud uue raamistik, mis lihtsustab selle probleemi lahendamist.
â see on uus raamistik keerukate jaotatud sĂŒsteemide arendamiseks. See vĂ”imaldab keskenduda Ă€riloogika kirjutamisele, mitte infrastruktuuri probleemide lahendamisele. Allpool rÀÀgin, kuidas see raamistik töötab ja kuidas kasutada seda jaotatud teenuste kirjutamiseks.
Mis on probleem?
Meil on Tarantool, meil on vshard â mida veel soovida?
Esiteks on asi mugavuses. vshard'i konfiguratsioon seadistatakse lĂ€bi Lua-tabelite. Et jaotatud sĂŒsteem koosseisus mitmest Tarantooli protsessist töötaks Ă”igesti, peab konfiguratsioon olema kĂ”ikjal ĂŒhesugune. Keegi ei taha seda manu kĂŒĂŒritada. Seega kasutame erinevaid skripte, Ansible'i ja juurutussĂŒsteeme.
Cartridge haldab vshard'i konfiguratsiooni automaatselt, tuginedes oma oma jaotatud konfiguratsioonile.Sisuliselt on see lihtne YAML-fail, mille koopia on igas Tarantooli instantsis. Lihtsustamine seisneb selles, et raamistik jÀlgib ise oma konfiguratsiooni ja tagab selle jÀrjepidevuse.
Teiseks on see taas mugavuses. vshard'i konfiguratsioon ei ole seotud Ă€riloogika arendamisega ning hoopis hĂ€irib arendajat. Kui arutame projekti arhitektuuri, rÀÀgime enamasti ĂŒksikutest komponentidest ja nende omavahelisest suhtlemisest. Klastri kĂ€itamise kohta kolmes andmekeskuses mĂ”tlemiseks on veel vara.
Oleme nende probleemidega silmitsi seisnud korduvalt ja mĂ”nes hetkes oleme suutelised vĂ€lja töötama lĂ€henemise, mis lihtsustab rakenduse tööd kogu selle elutsĂŒkli vĂ€ltel: loomine, arendamine, testimine, CI/CD, hooldus.
Cartridge tutvustab igale Tarantooli protsessile rollide mĂ”istet. Roli on see kontseptsioon, mis vĂ”imaldab arendajal keskenduda koodi kirjutamisele. KĂ”iki projektis olevaid rolle saab kĂ€ivitada ĂŒhe Tarantooli instantsi peal ja testimiseks on see piisav.
Tarantool Cartridge peamised omadused:
- automaatne klastrite orkestreerimine;
- rakenduse funktsionaalsuse laiendamine uute rollide abil;
- rakenduse mall arendamiseks ja juurutamiseks;
- sisseehitatud automaatne jaotamine;
- integratsioon testimisraamistiku Luatestiga;
- klastri haldamine WebUI ja API abil;
- pakendamise ja juurutamise tööriistad.
Tere, maailm!
Ma ei suuda oodata, et nÀidata ise raamistikku, seega arhitektuuri arutamine jÀÀb hilisemaks ja alustame lihtsast. Kui eeldada, et Tarantool on juba installitud, siis jÀÀb vaid teha
$ tarantoolctl rocks install cartridge-cli
$ export PATH=$PWD/.rocks/bin/:$PATHNeed kaks kÀsku installivad kÀsurida utiliidid ja vÔimaldavad luua oma esimese rakenduse mallist:
$ cartridge create --name myappJa 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-repositoorium valmis «Hello, World!» rakendusega. Proovime seda kohe kÀivitada, eelnevalt paigaldades sÔltuvused (sealhulgas raamistik):
$ tarantoolctl rocks make
$ ./init.lua --http-port 8080Nii et meil on kĂ€ivitatud ĂŒks sĂ”lm tulevasest jaotatud rakendusest. Uudishimu ĂŒllatus vĂ”ib kohe avada veebiliidese, konfigureerida ĂŒhe sĂ”lmest klastrit ja nautida tulemust, kuid rÔÔmu valmistamiseks on veel vara. Praegu ei oska rakendus mitte midagi kasulikku teha, seega rÀÀgin edasise juurutamise kohta hiljem, aga nĂŒĂŒd on aeg kirjutada kood.
Rakenduste arendamine
Kujutage ette, et kujundame projekti, mis peab andmeid vastu vÔtma, neid salvestama ja iga pÀev aruandeid koostama.

KĂ€ivitanud disainis skeemi, paneme sinna kolm komponenti: gateway, storage ja scheduler. Arhitektuuri arendame edasi. Kuna kasutame salvestuseks vshard'i, lisame skeemile vshard-routeri ja vshard-storage'i. Ei gateway ega scheduler ei suhtle salvestusega otse, selleks on seal router, mille jaoks see on loodud.

See skeem ei peegelda tĂ€pselt seda, mida me projektis loome, kuna komponendid nĂ€evad vĂ€lja abstraktsed. Peame veel vaatama, kuidas see projitseerub reaalsele Tarantoolile â rĂŒhmitame meie komponendid protsesside jĂ€rgi.

Vshard-routeri ja gateway hoidmine eraldi eksemplarides pole mĂ”ttekas. Miks peaksime kordama vĂ”rku minemist, kui see kuulub juba ruuteri ĂŒlesannete hulka? Need peaksid kĂ€ima ĂŒhes protsessis. See tĂ€hendab, et ĂŒhes protsessis algatatakse nii gateway kui vshard.router.cfg ning las nad suhtlevad kohapeal.
Projekteerimise etapis oli kolme komponendiga töötamine mugav, kuid mina kui arendaja ei taha koodi kirjutades mĂ”elda kolme Tarnatooli eksemplari kĂ€ivitamisele. Mul on vaja kĂ€ivitada testid ja kontrollida, kas olen gateway kirjutamisega Ă”igesti toiminud. VĂ”ib-olla soovin nĂ€idata omadust kolleegidele. Miks ma peaksin vaeva nĂ€gema kolme eksemplari juurutamisega? Just seetĂ”ttu sĂŒndis rollide kontseptsioon. Rull â see on tavaline Lua moodul, mille elutsĂŒklit haldab Cartridge. Selles nĂ€ites on neid neli â gateway, router, storage, scheduler. Muus projektis vĂ”ib neid olla rohkem. KĂ”iki rolle saab kĂ€ivitada ĂŒhes protsessis ja sellest piisab.

Ja kui tuleb juttu juurutamisest staging'sse vÔi tootmisse, siis mÀÀrame igale Tarantooli protsessile oma rollide kogumi vastavalt riistvaralistele vÔimalustele:

Topoloogia haldamine
Teavet selle kohta, kus millised rollid on kÀivitatud, tuleb kusagil salvestada. Ja see "kusagil" on jaotatud konfigureerimine, millest olen juba eespool rÀÀkinud. KÔige olulisem selles on klastrite topoloogia. Siin on kujutatud kolme replikatsioonigruppi viiest Tarantooli protsessist:

Me ei soovi andmeid kaotada, seetÔttu kohtleme ettevaatlikult teavet kÀivitatud protsesside kohta. Cartridge jÀlgib konfiguratsiooni kahefaasilise komiti abil. Korraldades konfiguratsiooni uuendamist, kontrollib ta esmalt, kas kÔik eksemplarid on saadaval ja valmis uut konfiguratsiooni vastu vÔtma. SeejÀrel rakendatakse teine faas konfig.
Samuti on topoloogia jaotises mÀÀratud oluline parameeter, nagu iga replikatsioonigrupi liider. Tavaliselt on see eksemplar, kuhu kirjutatakse. ĂlejÀÀnud on tavaliselt ainult lugemiseks, kuigi siin vĂ”ivad olla erandid. MĂ”nikord ei karda julgemaid arendajad konflikte ja vĂ”ivad andmeid paralleelselt kirjutada mitmele koopiale, kuid on olemas teatud toimingud, mida ei tohiks mingil juhul kaks korda teostada. Selleks on olemas liidri tunnus.

Rollide elu
Kuna abstraktse rolli eksisteerimiseks sellises arhitektuuris peab raamistik nendega kuidagi juhtima. Loomulikult toimub juhtimine ilma Tarantooli protsessi taaskÀivitamiseta. Rollide juhtimiseks on olemas neli tagasisidet. Cartridge kutsub neid ise vÀlja vastavalt sellele, mis tal on kirjutatud jaotatud konfiguratsioonis, rakendades seega konfiguratsiooni konkreetsetele rollidele.
function init()
function validate_config()
function apply_config()
function stop()
Igal rollil on ĂŒlesanne init. Seda kutsutakse vĂ€lja kas kord, kui roll kĂ€ivitatakse, vĂ”i Tarantooli taaskĂ€ivitamisel. Seal on mugav nĂ€iteks initsialiseerida box.space.create vĂ”i scheduler vĂ”ib kĂ€ivitada mĂ”ne taustafiberi, mis tĂ€idab tööd teatud ajavahemike jĂ€rel.
Ăks funktsioon init vĂ”ib olla ebapiisav. Cartridge vĂ”imaldab rollidel kasutada jaotatud konfiguratsiooni, mida ta kasutab topoloogia salvestamiseks. Saame selles samas konfiguratsioonis kuulutada uue jaotise ja hoida seal Ă€ri konfiguratsiooni fragmenti. Minu nĂ€ites vĂ”ib see olla andmemudel vĂ”i ajakava seadistused scheduler'i rolli jaoks.
Klastri kutsub ĂŒles validate_config ja apply_config iga kord, kui jaotatud konfiguratsioonis toimub muudatus. Kui konfiguratsioon rakendatakse kahefaasilise komiti abil, kontrollib klaster, et iga roll on valmis seda uut konfiguratsiooni vastu vĂ”tma ja vajadusel teavitab kasutajat veast. Kui kĂ”ik nĂ”ustuvad, et konfiguratsioon on normaalne, siis tĂ€idetakse apply_config.
Samuti on rollidel meetod stop, mis on vajalik rolli tegevuse tulemuste puhastamiseks. Kui me ĂŒtlem, et scheduler ei ole enam selles serveris vajalik, vĂ”ib ta peatada need fiberid, mida ta kĂ€ivitas abiga. init.
Rollid saavad omavahel suhelda. Oleme harjunud kirjutama funktsioonikÔnesid Lua-s, kuid vÔib juhtuda, et just selle protsessi jooksul pole meil vajalikku rolli. Suhete lihtsustamiseks vÔrgus kasutame abimoodulit rpc (remote procedure call), mis on loodud Tarantooli standardse netbox'i baasil. See vÔib olla kasulik, kui nÀiteks teie gateway soovib otse scheduler'ilt paluda, et ta töö Àra teeks kohe, mitte ei ootaks 24 tundi.
Veel ĂŒks oluline aspekt on tĂ”rketaluvuse tagamine. Cartridge'is kasutatakse tervise jĂ€lgimiseks protokolli SWIM. . Ăldiselt vahetavad protsessid omavahel 'kuuldusi' UDP kaudu â iga protsess rÀÀgib oma naabritele viimased uudised ja nad vastavad. Kui vastust ei tule, hakkab Tarantool kahtlustama, et midagi on valesti, ja mĂ”ne aja pĂ€rast kuulutab vĂ€lja surma ning rÀÀgib kĂ”ikidele ĂŒmberkaudsetele sellest uudisest.

Selle protokolli pĂ”hjal korraldab Cartridge automaatse tĂ”rke töötlemise. Iga protsess jĂ€lgib oma ĂŒmbrust ja kui juht lĂ”petab Ă€kki vastamise, vĂ”ib replika vĂ”tta tema rolli enda peale, ning Cartridge konfigureerib vastavalt kĂ€imasolevad rollid.

Siin tuleb olla ettevaatlik, kuna sage vahetamine vÔib andmete konfliktidele viia replikatsiooni kÀigus. Automaatse failover'i lubamine suvaliselt ei ole kindlasti soovitatav. Tuleb selgelt mÔista, mis toimub, ja olla kindel, et replikatsioon ei purune pÀrast seda, kui juht taastub ja talle kroon tagastatakse.
KokkuvĂ”ttes vĂ”ib tekkida tunne, et rollid on sarnased mikroteenustele. MĂ”nes mĂ”ttes on nad tĂ”epoolest sellised, kuid moodulitena Tarantooli protsesside sees. Siiski on ka mitmeid pĂ”himĂ”ttelisi erinevusi. Esiteks peavad kĂ”ik projekti rollid elama ĂŒhes koodibaasis. Ja kĂ”ik Tarantooli protsessid peavad kĂ€ivitama ĂŒhes koodibaasis, et vĂ€ltida ĂŒllatusi, nagu nĂ€iteks juhul, kui proovime algatada scheduler'i, mille pole lihtsalt olemas. Samuti ei tohi lubada koodiversioonide erinevusi, kuna sĂŒsteemi kĂ€itumist on sellises olukorras vĂ€ga keeruline ette ette nĂ€ha ja siluda.
Erinevalt Dockerist ei saa me lihtsalt vĂ”tta rolli 'pilti', viia selle teisele masinale ja seal kĂ€ivitada. Meie rollid ei ole nii isoleeritud kui Docker konteinerid. Samuti ei saa me ĂŒhel eksemplaril kĂ€ivitada kaht identset rolli. Roll on kas olemas vĂ”i seda pole, teatud mĂ”ttes on see singleton. Ja kolmandaks, kogu replikatsiooni grupi sees peavad rollid olema ĂŒhesugused, kuna muidu oleks see absurdne â andmed on samad, kuid konfiguratsioon on erinev.
KÀivitustööriistad
Lubasin nĂ€idata, kuidas Cartridge aitab rakenduste kĂ€ivitamisel. Ămbruse elu lihtsustamiseks pakib raamistik RPM-pakette:
$ cartridge pack rpm myapp -- pakib meie jaoks ./myapp-0.1.0-1.rpm
$ sudo yum install ./myapp-0.1.0-1.rpmInstallitud paketis on peaaegu kÔik vajalik: nii rakendus kui ka installitud lua sÔltuvused. Tarantool jÔuab serverisse ka RPM-paketi sÔltuvusena ja meie teenus on kÀivitamiseks valmis. See toimub lÀbi systemd, kuid enne tuleb kirjutada veidi konfi. Peamine on iga protsessi URI mÀÀramine. Kolm nÀitena 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}
CONFIGSiin on huvitav nĂŒanss. Selle asemel, et nĂ€idata vaid binaarse protokolli porti, nĂ€itame protsessi tĂ€ielikku avalikku aadressi, sealhulgas hostname'i. See on vajalik, et klastrisĂ”lmed teaksid, kuidas omavahel ĂŒhendust luua. Kehv idee on kasutada advertise_uri aadressina 0.0.0.0, see peaks olema vĂ€line IP-aadress, mitte socketi seondamine. Ilma selleta ei tööta mitte midagi, seega Cartridge ei lase lihtsalt vale advertise_uri'ga sĂ”lme kĂ€ivitada.
NĂŒĂŒd, kui konfigureerimine on valmis, saame protsessid kĂ€ivitada. Kuna tavaline systemd-ĂŒksus ei luba rohkem kui ĂŒhe protsessi kĂ€ivitamist, loob Cartridge rakendustes nn instantsi-ĂŒksusi, mis töötavad jĂ€rgmiselt:
$ sudo systemctl start myapp@router
$ sudo systemctl start myapp@storage_A
$ sudo systemctl start myapp@storage_BKonfiguratsioonis mÀÀrasime HTTP-pordi, millel Cartridge teenindab veebiliidest â 8080. KĂŒlastame seda ja vaatame:

NĂ€eme, et protsessid on kĂ€ivitatud, kuid praegu ei ole nad konfigureeritud. Cartridge ei tea veel, kes kellega peaks replikatsiooni tegema ja ei saa ise otsust teha, seega ootab meie tegevust. Meie vĂ€ljundvalik ei ole suur: uue klastritegu algab esimese sĂ”lme seadistamisest. Siis lisame klastrisse ĂŒlejÀÀnud, mÀÀrame neile rollid ja siis vĂ”ib kĂ€itusprotsessi edukaks lugeda.
Valame tassike oma lemmikjooki ja lÔÔgastuge pÀrast pikka töönÀdalat. Rakendust saab kasutada.

KokkuvÔte
Aga kuidas kokkuvÔtteks? Proovige, kasutage, jagage tagasisidet, avage probleeme GitHubis.
Lingid
[1]
[2]
[3]
[4]
[5]
[6]
Allikas: habr.com
