VietnÄ Mail.ru Group mums ir Tarantool - tas ir lietojumprogrammu serveris Lua, kas darbojas arÄ« kÄ datu bÄze (vai otrÄdi?). Tas ir Ätrs un forÅ”s, taÄu viena servera iespÄjas joprojÄm nav neierobežotas. VertikÄlÄ mÄrogoÅ”ana arÄ« nav panaceja, tÄpÄc Tarantool ir rÄ«ki horizontÄlai mÄrogoÅ”ana - modulis vshard
Labas ziÅas: esam apkopojuÅ”i dažus lielus kadrus (piem
Kas tieÅ”i ir par problÄmu?
Mums ir tarantula, mums ir vshard - ko vÄl var vÄlÄties?
PirmkÄrt, tas ir ÄrtÄ«bas jautÄjums. Vshard konfigurÄcija tiek konfigurÄta, izmantojot Lua tabulas. Lai sadalÄ«ta sistÄma ar vairÄkiem Tarantool procesiem darbotos pareizi, konfigurÄcijai visur jÄbÅ«t vienÄdai. Neviens nevÄlas to darÄ«t manuÄli. TÄpÄc tiek izmantoti visu veidu skripti, Ansible un izvietoÅ”anas sistÄmas.
Kasetne pati pÄrvalda vshard konfigurÄciju, tÄ to dara, pamatojoties uz to paÅ”a izplatÄ«tÄ konfigurÄcija. Tas bÅ«tÄ«bÄ ir vienkÄrÅ”s YAML fails, kura kopija tiek glabÄta katrÄ Tarantool instancÄ. VienkÄrÅ”ojums ir tÄds, ka ietvars pats uzrauga tÄ konfigurÄciju un nodroÅ”ina, ka tas visur ir vienÄds.
OtrkÄrt, tas atkal ir ÄrtÄ«bas jautÄjums. Vshard konfigurÄcijai nav nekÄda sakara ar biznesa loÄ£ikas attÄ«stÄ«bu un tikai novÄrÅ” programmÄtÄja uzmanÄ«bu no viÅa darba. Apspriežot projekta arhitektÅ«ru, mÄs visbiežÄk runÄjam par atseviŔķiem komponentiem un to mijiedarbÄ«bu. Ir pÄragri domÄt par klastera ievieÅ”anu 3 datu centros.
MÄs Ŕīs problÄmas atrisinÄjÄm atkal un atkal, un kÄdÄ brÄ«dÄ« mums izdevÄs izstrÄdÄt pieeju, kas vienkÄrÅ”oja darbu ar lietojumprogrammu visÄ tÄs dzÄ«ves ciklÄ: izveide, izstrÄde, testÄÅ”ana, CI/CD, uzturÄÅ”ana.
KÄrtridžs iepazÄ«stina ar lomas jÄdzienu katram Tarantool procesam. Lomas ir jÄdziens, kas ļauj izstrÄdÄtÄjam koncentrÄties uz koda rakstÄ«Å”anu. Visas projektÄ pieejamÄs lomas var palaist vienÄ Tarantool instancÄ, un ar to pietiks testiem.
Tarantool kasetnes galvenÄs iezÄ«mes:
- automatizÄta klasteru orÄ·estrÄÅ”ana;
- aplikÄcijas funkcionalitÄtes paplaÅ”inÄÅ”ana, izmantojot jaunas lomas;
- lietojumprogrammas veidne izstrÄdei un izvietoÅ”anai;
- iebÅ«vÄta automÄtiskÄ sadalÄ«Å”ana;
- integrÄcija ar Luatest testÄÅ”anas ietvaru;
- klasteru pÄrvaldÄ«ba, izmantojot WebUI un API;
- iepakoŔanas un izvietoŔanas instrumenti.
Sveika pasaule!
Es nevaru sagaidÄ«t, kad parÄdÄ«Å”u paÅ”u ietvaru, tÄpÄc stÄstu par arhitektÅ«ru atstÄsim vÄlÄkam laikam un sÄksim ar kaut ko vienkÄrÅ”u. Ja pieÅemam, ka pats Tarantool jau ir instalÄts, tad atliek tikai darÄ«t
$ tarantoolctl rocks install cartridge-cli
$ export PATH=$PWD/.rocks/bin/:$PATH
Å Ä«s divas komandas instalÄs komandrindas utilÄ«tas un ļaus jums izveidot savu pirmo lietojumprogrammu no veidnes:
$ cartridge create --name myapp
Un tas ir tas, ko mÄs iegÅ«stam:
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/
Å Ä« ir git repozitorija ar gatavu tekstu āSveika, pasaule!ā pieteikumu. MÄÄ£inÄsim to palaist uzreiz, iepriekÅ” instalÄjot atkarÄ«bas (ieskaitot paÅ”u sistÄmu):
$ tarantoolctl rocks make
$ ./init.lua --http-port 8080
TÄtad, mums ir viens mezgls, kas darbojas nÄkotnes Ŕķeltajai lietojumprogrammai. ZinÄtkÄrs lajs var uzreiz atvÄrt tÄ«mekļa saskarni, ar peli konfigurÄt viena mezgla kopu un baudÄ«t rezultÄtu, taÄu vÄl ir pÄragri priecÄties. PagaidÄm lietojumprogramma nevar darÄ«t neko noderÄ«gu, tÄpÄc es jums pastÄstÄ«Å”u par izvietoÅ”anu vÄlÄk, bet tagad ir pienÄcis laiks rakstÄ«t kodu.
Lietojumprogrammu izstrÄde
IedomÄjieties, mÄs izstrÄdÄjam projektu, kuram reizi dienÄ jÄsaÅem dati, tie jÄsaglabÄ un jÄizveido atskaite.
MÄs sÄkam zÄ«mÄt diagrammu un ievietojam tajÄ trÄ«s komponentus: vÄrteju, krÄtuvi un plÄnotÄju. MÄs turpinÄm darbu pie arhitektÅ«ras. TÄ kÄ mÄs izmantojam vshard kÄ krÄtuvi, shÄmai pievienojam vshard-router un vshard-storage. Ne vÄrteja, ne plÄnotÄjs tieÅ”i nepiekļūs krÄtuvei; tieÅ”i tam ir paredzÄts marÅ”rutÄtÄjs, tam tas ir izveidots.
Å Ä« diagramma joprojÄm precÄ«zi neatspoguļo to, ko mÄs veidosim projektÄ, jo komponenti izskatÄs abstrakti. Mums joprojÄm ir jÄredz, kÄ tas tiks projicÄts reÄlajÄ Tarantool ā grupÄsim mÅ«su komponentus pÄc procesa.
Nav jÄgas saglabÄt vshard-router un vÄrteju atseviŔķos gadÄ«jumos. KÄpÄc mums vÄlreiz jÄsÄrfo tÄ«klÄ, ja tas jau ir marÅ”rutÄtÄja pienÄkums? Tie ir jÄpalaiž vienÄ un tajÄ paÅ”Ä procesÄ. Tas nozÄ«mÄ, ka gan vÄrteja, gan vshard.router.cfg tiek inicializÄti vienÄ procesÄ un ļauj tÄm mijiedarboties lokÄli.
ProjektÄÅ”anas stadijÄ bija Ärti strÄdÄt ar trim komponentiem, bet es kÄ izstrÄdÄtÄjs, rakstot kodu, nevÄlos domÄt par trÄ«s Tarnatool gadÄ«jumu palaiÅ”anu. Man ir jÄpalaiž testi un jÄpÄrbauda, āāvai vÄrteju uzrakstÄ«ju pareizi. Vai varbÅ«t es vÄlos parÄdÄ«t kÄdu funkciju saviem kolÄÄ£iem. KÄpÄc man bÅ«tu jÄrÄÄ·inÄs ar trÄ«s eksemplÄru izvietoÅ”anu? TÄ radÄs lomu koncepcija. Loma ir parasts luash modulis, kura dzÄ«ves ciklu pÄrvalda Cartridge. Å ajÄ piemÄrÄ ir Äetri no tiem - vÄrteja, marÅ”rutÄtÄjs, krÄtuve, plÄnotÄjs. CitÄ projektÄ var bÅ«t vairÄk. Visas lomas var izpildÄ«t vienÄ procesÄ, un ar to pietiks.
Un, kad runa ir par izvietoÅ”anu uz iestudÄÅ”anu vai ražoÅ”anu, mÄs katram Tarantool procesam pieŔķirsim savu lomu kopumu atkarÄ«bÄ no aparatÅ«ras iespÄjÄm:
TopoloÄ£ijas pÄrvaldÄ«ba
Kaut kur ir jÄglabÄ informÄcija par to, kur darbojas lomas. Un Ŕī ākaut kurā ir izplatÄ«tÄ konfigurÄcija, ko es jau minÄju iepriekÅ”. VissvarÄ«gÄkÄ lieta tajÄ ir klasteru topoloÄ£ija. Å eit ir 3 replikÄcijas grupas no 5 Tarantool procesiem:
MÄs nevÄlamies zaudÄt datus, tÄpÄc mÄs uzmanÄ«gi izturamies pret informÄciju par procesiem. KÄrtridžs seko lÄ«dzi konfigurÄcijai, izmantojot divfÄžu apstiprinÄjumu. Kad mÄs vÄlamies atjauninÄt konfigurÄciju, tÄ vispirms pÄrbauda, āāvai visi gadÄ«jumi ir pieejami un gatavi pieÅemt jauno konfigurÄciju. PÄc tam otrajÄ fÄzÄ tiek lietota konfigurÄcija. TÄdÄjÄdi, pat ja viens eksemplÄrs izrÄdÄ«sies Ä«slaicÄ«gi nepieejams, nekas slikts nenotiks. KonfigurÄcija vienkÄrÅ”i netiks piemÄrota, un jÅ«s jau iepriekÅ” redzÄsit kļūdu.
ArÄ« topoloÄ£ijas sadaÄ¼Ä ir norÄdÄ«ts tik svarÄ«gs parametrs kÄ katras replikÄcijas grupas lÄ«deris. Parasti Ŕī ir kopija, kas tiek ierakstÄ«ta. PÄrÄjie visbiežÄk ir tikai lasÄmi, lai gan var bÅ«t izÅÄmumi. DažkÄrt drosmÄ«gi izstrÄdÄtÄji nebaidÄs no konfliktiem un var rakstÄ«t datus uz vairÄkÄm replikÄm paralÄli, taÄu ir dažas darbÄ«bas, kuras, lai kÄ arÄ« bÅ«tu, nevajadzÄtu veikt divreiz. Par to ir lÄ«dera zÄ«me.
Lomu dzīve
Lai Å”ÄdÄ arhitektÅ«rÄ pastÄvÄtu abstrakta loma, ietvaram tÄs kaut kÄ jÄpÄrvalda. Protams, kontrole notiek bez Tarantool procesa restartÄÅ”anas. Ir 4 atzvani lomu pÄrvaldÄ«bai. Kasetne pati tos izsauks atkarÄ«bÄ no tÄ, kas ir rakstÄ«ts tÄs izplatÄ«tajÄ konfigurÄcijÄ, tÄdÄjÄdi piemÄrojot konfigurÄciju noteiktÄm lomÄm.
function init()
function validate_config()
function apply_config()
function stop()
Katrai lomai ir sava funkcija init
. Tas tiek izsaukts vienreiz, kad loma ir iespÄjota vai Tarantool tiek restartÄts. Tur ir Ärti, piemÄram, inicializÄt box.space.create, vai arÄ« plÄnotÄjs var palaist kÄdu fona Ŕķiedru, kas veiks darbu noteiktos laika intervÄlos.
Viena funkcija init
var nepietikt. Kasetne ļauj lomÄm izmantot izplatÄ«tÄs konfigurÄcijas priekÅ”rocÄ«bas, ko tÄ izmanto topoloÄ£ijas glabÄÅ”anai. MÄs varam deklarÄt jaunu sadaļu tajÄ paÅ”Ä konfigurÄcijÄ un saglabÄt tajÄ biznesa konfigurÄcijas fragmentu. ManÄ piemÄrÄ tÄ varÄtu bÅ«t datu shÄma vai plÄnotÄja lomas grafika iestatÄ«jumi.
Klasteru zvani validate_config
Šø apply_config
katru reizi, kad mainÄs izplatÄ«tÄ konfigurÄcija. Ja konfigurÄcija tiek lietota ar divfÄžu apstiprinÄÅ”anu, klasteris pÄrbauda, āāvai katra loma ir gatava pieÅemt Å”o jauno konfigurÄciju, un, ja nepiecieÅ”ams, ziÅo lietotÄjam par kļūdu. Kad visi piekrÄ«t, ka konfigurÄcija ir normÄla, tad apply_config
.
ArÄ« lomÄm ir sava metode stop
, kas nepiecieÅ”ama lomas izvades tÄ«rÄ«Å”anai. Ja mÄs sakÄm, ka plÄnotÄjs Å”ajÄ serverÄ« vairs nav vajadzÄ«gs, tas var apturÄt tÄs Ŕķiedras, ar kurÄm tas sÄkÄs init
.
Lomas var mijiedarboties viena ar otru. MÄs esam pieraduÅ”i rakstÄ«t funkciju izsaukumus Lua valodÄ, taÄu var gadÄ«ties, ka konkrÄtajam procesam nav vajadzÄ«gÄs lomas. Lai atvieglotu zvanu veikÅ”anu tÄ«klÄ, mÄs izmantojam rpc (remote procedure call) palÄ«gmoduli, kas ir veidots, pamatojoties uz Tarantool iebÅ«vÄto standarta tÄ«kla kastÄ«ti. Tas var bÅ«t noderÄ«gi, ja, piemÄram, jÅ«su vÄrteja vÄlas tieÅ”i lÅ«gt plÄnotÄjam veikt darbu tieÅ”i tagad, nevis gaidÄ«t dienu.
VÄl viens svarÄ«gs punkts ir kļūdu tolerances nodroÅ”inÄÅ”ana. KÄrtridžs izmanto SWIM protokolu, lai uzraudzÄ«tu veselÄ«bu
Pamatojoties uz Å”o protokolu, Kasetne organizÄ automÄtisku kļūdu apstrÄdi. Katrs process uzrauga savu vidi, un, ja vadÄ«tÄjs pÄkÅ”Åi pÄrstÄj reaÄ£Ät, replika var pÄrÅemt savu lomu, un kasetne attiecÄ«gi konfigurÄ darbÄ«bas lomas.
Å eit jums jÄbÅ«t uzmanÄ«giem, jo āābieža pÄrslÄgÅ”anÄs uz priekÅ”u un atpakaļ var izraisÄ«t datu konfliktus replikÄcijas laikÄ. Protams, jums nevajadzÄtu iespÄjot automÄtisku kļūmjpÄrlÄci nejauÅ”i. Mums ir skaidri jÄsaprot, kas notiek, un jÄbÅ«t pÄrliecinÄtiem, ka replikÄcija nepÄrkÄps pÄc tam, kad vadÄ«tÄjs tiks atjaunots un viÅam tiks atdots kronis.
No tÄ visa var rasties sajÅ«ta, ka lomas ir lÄ«dzÄ«gas mikropakalpojumiem. SavÄ ziÅÄ tie ir tieÅ”i tÄdi, tikai kÄ moduļi Tarantool procesos. TaÄu ir arÄ« vairÄkas bÅ«tiskas atŔķirÄ«bas. PirmkÄrt, visÄm projekta lomÄm ir jÄdzÄ«vo vienÄ kodu bÄzÄ. Un visi Tarantool procesi ir jÄuzsÄk no vienas koda bÄzes, lai nebÅ«tu tÄdu pÄrsteigumu kÄ tie, kad mÄs cenÅ”amies inicializÄt plÄnotÄju, bet tas vienkÄrÅ”i neeksistÄ. TÄpat nevajadzÄtu pieļaut atŔķirÄ«bas kodu versijÄs, jo sistÄmas uzvedÄ«bu Å”ÄdÄ situÄcijÄ ir ļoti grÅ«ti paredzÄt un atkļūdot.
AtŔķirÄ«bÄ no Docker, mÄs nevaram vienkÄrÅ”i paÅemt lomu "attÄlu", pÄrnest to uz citu maŔīnu un palaist to tur. MÅ«su lomas nav tik izolÄtas kÄ Docker konteineri. TurklÄt mÄs nevaram izpildÄ«t divas identiskas lomas vienÄ instancÄ. Loma vai nu pastÄv, vai nav; savÄ ziÅÄ tÄ ir viena vienÄ«ba. Un treÅ”kÄrt, lomÄm jÄbÅ«t vienÄdÄm visÄ replikÄcijas grupÄ, jo pretÄjÄ gadÄ«jumÄ tas bÅ«tu absurdi - dati ir vienÄdi, bet konfigurÄcija ir atŔķirÄ«ga.
IzvietoŔanas rīki
Es apsolÄ«ju parÄdÄ«t, kÄ Cartridge palÄ«dz izvietot lietojumprogrammas. Lai atvieglotu dzÄ«vi citiem, ietvars iepako RPM pakotnes:
$ cartridge pack rpm myapp -- ŃŠæŠ°ŠŗŃŠµŃ Š“Š»Ń Š½Š°Ń ./myapp-0.1.0-1.rpm
$ sudo yum install ./myapp-0.1.0-1.rpm
InstalÄtajÄ pakotnÄ ir gandrÄ«z viss nepiecieÅ”amais: gan lietojumprogramma, gan instalÄtÄs atkarÄ«bas. Tarantool arÄ« nonÄks serverÄ« kÄ RPM pakotnes atkarÄ«ba, un mÅ«su pakalpojums ir gatavs palaiÅ”anai. Tas tiek darÄ«ts, izmantojot systemd, taÄu vispirms ir jÄraksta neliela konfigurÄcija. NorÄdiet vismaz katra procesa URI. PiemÄram, pietiek ar trim.
$ 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
Å eit ir interesanta nianse. TÄ vietÄ, lai norÄdÄ«tu tikai binÄrÄ protokola portu, mÄs norÄdÄm visu procesa publisko adresi, tostarp resursdatora nosaukumu. Tas ir nepiecieÅ”ams, lai klastera mezgli zinÄtu, kÄ izveidot savienojumu viens ar otru. Ir slikta ideja izmantot 0.0.0.0 kÄ ads_uri adresi; tai ir jÄbÅ«t ÄrÄjai IP adresei, nevis ligzdas saitei. Bez tÄ nekas nedarbosies, tÄpÄc Kasetne vienkÄrÅ”i neļaus palaist mezglu ar nepareizu reklÄmu_uri.
Tagad, kad konfigurÄcija ir gatava, varat sÄkt procesus. TÄ kÄ parastais sistÄmas bloks neļauj sÄkt vairÄk nekÄ vienu procesu, lietojumprogrammas KasetnÄ tiek instalÄtas ar t.s. instantiÄtas vienÄ«bas, kas darbojas Å”Ädi:
$ sudo systemctl start myapp@router
$ sudo systemctl start myapp@storage_A
$ sudo systemctl start myapp@storage_B
KonfigurÄcijÄ norÄdÄ«jÄm HTTP portu, uz kura Cartridge apkalpo tÄ«mekļa saskarni - 8080. Dosimies uz to un apskatÄ«simies:
MÄs redzam, ka, lai gan procesi darbojas, tie vÄl nav konfigurÄti. KÄrtridžs vÄl nezina, kam ar kuru bÅ«tu jÄatkÄrto un nevar pieÅemt lÄmumu pati, tÄpÄc gaida mÅ«su rÄ«cÄ«bu. Bet mums nav lielas izvÄles: jauna klastera dzÄ«ve sÄkas ar pirmÄ mezgla konfigurÄciju. PÄc tam mÄs pievienosim citus klasterim, pieŔķirsim tiem lomas, un Å”ajÄ brÄ«dÄ« izvietoÅ”anu var uzskatÄ«t par veiksmÄ«gi pabeigtu.
Ielejiet glÄzi jÅ«su iecienÄ«tÄkÄ dzÄriena un atpÅ«tÄ«simies pÄc garÄs darba nedÄļas. Lietojumprogrammu var izmantot.
RezultÄti
KÄdi ir rezultÄti? IzmÄÄ£iniet to, izmantojiet to, atstÄjiet atsauksmes, izveidojiet biļetes vietnÄ Github.
atsauces
[1]
Avots: www.habr.com