Tarantool kasetne: Lua aizmugursistēmas sadalÄ«Å”ana trÄ«s rindās

Tarantool kasetne: Lua aizmugursistēmas sadalÄ«Å”ana trÄ«s rindās

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 [1]. Tas ļauj sadalÄ«t datus vairākos serveros, taču, lai tos iestatÄ«tu un pievienotu biznesa loÄ£iku, jums ir jāpielāgojas.

Labas ziņas: esam apkopojuÅ”i dažus lielus kadrus (piem [2], [3]) un izveidoja citu sistēmu, kas ievērojami vienkārÅ”os Ŕīs problēmas risinājumu.

Tarantool kārtridžs ir jauna sistēma sarežģītu sadalÄ«tu sistēmu izstrādei. Tas ļauj koncentrēties uz biznesa loÄ£ikas rakstÄ«Å”anu, nevis infrastruktÅ«ras problēmu risināŔanu. Zem griezuma es jums pastāstÄ«Å”u, kā darbojas Å”is ietvars un kā rakstÄ«t izplatÄ«tos pakalpojumus, izmantojot to.

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.

Tarantool kasetne: Lua aizmugursistēmas sadalÄ«Å”ana trÄ«s rindās

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.

Tarantool kasetne: Lua aizmugursistēmas sadalÄ«Å”ana trÄ«s rindās

Å Ä« 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.

Tarantool kasetne: Lua aizmugursistēmas sadalÄ«Å”ana trÄ«s rindās

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.

Tarantool kasetne: Lua aizmugursistēmas sadalÄ«Å”ana trÄ«s rindās

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:

Tarantool kasetne: Lua aizmugursistēmas sadalÄ«Å”ana trÄ«s rindās

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:

Tarantool kasetne: Lua aizmugursistēmas sadalÄ«Å”ana trÄ«s rindās

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.

Tarantool kasetne: Lua aizmugursistēmas sadalÄ«Å”ana trÄ«s rindās

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 [4]. ÄŖsāk sakot, procesi savā starpā apmainās ar ā€œbaumāmā€ par UDP ā€” katrs process saviem kaimiņiem paziņo jaunākās ziņas, un viņi reaģē. Ja pēkŔņi atbilde nenāk, Tarantool sāk aizdomāties, ka kaut kas nav kārtÄ«bā, un pēc kāda laika deklamē nāvi un sāk stāstÄ«t visiem apkārtējiem Ŕīs ziņas.

Tarantool kasetne: Lua aizmugursistēmas sadalÄ«Å”ana trÄ«s rindās

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.

Tarantool kasetne: Lua aizmugursistēmas sadalÄ«Å”ana trÄ«s rindās

Å 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:

Tarantool kasetne: Lua aizmugursistēmas sadalÄ«Å”ana trÄ«s rindās

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.

Tarantool kasetne: Lua aizmugursistēmas sadalÄ«Å”ana trÄ«s rindās

Rezultāti

Kādi ir rezultāti? Izmēģiniet to, izmantojiet to, atstājiet atsauksmes, izveidojiet biļetes vietnē Github.

atsauces

[1] Tarantool Ā» 2.2 Ā» Atsauce Ā» Rocks reference Ā» Module vshard

[2] Kā mēs īstenojām Alfa-Bank investīciju biznesa pamatu, pamatojoties uz Tarantool

[3] Jaunās paaudzes norēķinu arhitektūra: transformācija ar pāreju uz Tarantool

[4] SWIM - klasteru būvniecības protokols

[5] GitHub ā€” tarantool/cartridge-cli

[6] GitHub - tarantool/kārtridžs

Avots: www.habr.com

Pievieno komentāru