Tarantool Cartridge: paşîna Lua di sê rêzan de parçe dike

Tarantool Cartridge: paşîna Lua di sê rêzan de parçe dike

Di Koma Mail.ru de me Tarantool heye - ev serverek serîlêdanê ye li Lua, ku di heman demê de databasek jî dubare dike (an berevajî?). Ew zû û xweş e, lê kapasîteyên yek serverê hîn jî bêsînor nîn in. Pîvana vertîkal jî ne panacea ye, ji ber vê yekê Tarantool amûrên ji bo pîvandina horizontal hene - modula vshard [1]. Ew dihêle hûn daneyan li ser çend serveran parve bikin, lê hûn neçar in ku bi wê re bişopînin da ku wê saz bikin û mantiqa karsaziyê pêve bikin.

Nûçeyên baş: me hin fîşekên mezin berhev kirine (mînak [2], [3]) û çarçoveyek din afirand ku dê çareseriya vê pirsgirêkê bi girîngî hêsan bike.

Tarantool Cartridge çarçoveyek nû ye ji bo pêşxistina pergalên belavbûyî yên tevlihev. Ew dihêle hûn li şûna çareserkirina pirsgirêkên binesaziyê li ser nivîsandina mantiqa karsaziyê bisekinin. Li jêr birîn ez ê ji we re vebêjim ka ev çarçove çawa dixebite û meriv çawa karûbarên belavkirî bi karanîna wê dinivîse.

Bi rastî pirsgirêk çi ye?

Me tarantula heye, me vshard heye - hûn dikarin bêtir çi bixwazin?

Ya yekem, ew pirsgirêkek hêsan e. Veavakirina vshard bi tabloyên Lua ve hatî mîheng kirin. Ji bo ku pergalek belavkirî ya pir pêvajoyên Tarantool rast bixebite, pêdivî ye ku veavakirin li her deverê yek be. Kes naxwaze vê yekê bi destan bike. Ji ber vê yekê, her cûre nivîsar, Ansible, û pergalên bicîhkirinê têne bikar anîn.

Cartridge bi xwe veavakirina vshard-ê birêve dibe, ew li ser bingeha wê vê yekê dike veavakirina belavkirî xwe. Ew bi bingehîn pelek YAML-ya hêsan e, ku kopiyek wê di her mînakek Tarantool de tê hilanîn. Hêsankirin ev e ku çarçove bi xwe veavakirina wê dişopîne û piştrast dike ku ew li her deverê yek e.

Ya duyemîn, ew dîsa pirsgirêkek hêsan e. Veavakirina vshard bi pêşkeftina mantiqa karsaziyê re tiştek tune û tenê bernameçêker ji karê wî dûr dixe. Dema ku em mîmariya projeyekê nîqaş dikin, em pir caran li ser pêkhateyên takekesî û têkiliya wan diaxivin. Hê zû ye ku meriv bifikire ku meriv komek ji 3 navendên daneyê rabike.

Me van pirsgirêkan careke din û ji nû ve çareser kir, û di hin xalan de me karî rêgezek pêş bixe ku xebata bi serîlêdanê re di tevahiya çerxa jiyana wê de hêsan dike: afirandin, pêşkeftin, ceribandin, CI/CD, parastin.

Cartridge ji bo her pêvajoyek Tarantool têgeha rolê destnîşan dike. Rol têgehek e ku dihêle pêşdebirek li ser nivîsandina kodê hûr bibe. Hemî rolên ku di projeyê de hene dikarin li ser yek mînakek Tarantool werin xebitandin, û ev ê ji bo ceribandinan bes be.

Taybetmendiyên sereke yên Tarantool Cartridge:

  • orkestrasyona komê ya otomatîkî;
  • berfirehkirina fonksiyona serîlêdanê bi karanîna rolên nû;
  • şablonê serîlêdanê ji bo pêşkeftin û bicîhkirinê;
  • parvekirina otomatîkî ya çêkirî;
  • entegrasyonê bi çarçoveya ceribandina Luatest re;
  • rêveberiya komê bi karanîna WebUI û API;
  • Amûrên pakkirin û belavkirinê.

Silav, cîhan!

Ez nikarim li bendê bim ku çarçovê bixwe nîşan bidim, ji ber vê yekê em ê çîroka li ser mîmariyê ji bo paşê bihêlin û bi tiştek hêsan dest pê bikin. Ger em texmîn bikin ku Tarantool bixwe jixwe hatî saz kirin, wê hingê ya ku dimîne ev e ku were kirin

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

Van her du fermanan dê karûbarên rêza fermanê saz bikin û bihêlin hûn serlêdana xweya yekem ji şablonê biafirînin:

$ cartridge create --name myapp

Û ev e ya ku em distînin:

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/

Ev depoyek git e ku bi "Hello, Cîhan!" bikaranînî. Werin em hewl bidin ku wê tavilê bimeşînin, ku berê pêwendiyan saz kirine (tevî çarçoveyek bixwe):

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

Ji ber vê yekê, me yek girêk heye ku ji bo serîlêdana şikestî ya pêşerojê dixebite. Kesek lêkolîner dikare tavilê pêwendiya tevneyê veke, bi mişkê re komek yek girêk mîheng bike û ji encamê kêfê bike, lê ji bo şabûnê pir zû ye. Heya nuha, serîlêdan nikare tiştek kêrhatî bike, ji ber vê yekê ez ê paşê ji we re li ser bicîhkirinê bibêjim, lê naha dema nivîsandina kodê ye.

Pêşveçûna Serlêdanê

Tenê bifikirin, em projeyek dîzayn dikin ku divê daneyan werbigire, hilîne û rojê carekê raporek çêbike.

Tarantool Cartridge: paşîna Lua di sê rêzan de parçe dike

Em dest bi xêzkirina diagramekê dikin û sê hêmanan li ser bi cîh dikin: dergeh, hilanîn û plansaz. Em li ser mîmariyê bêtir dixebitin. Ji ber ku em vshard-ê wekî hilanînê bikar tînin, em vshard-router û vshard-storage li nexşeyê zêde dikin. Ne dergeh û ne jî plansaz dê rasterast xwe bigihînin hilanînê; ji bo vê yekê router ji bo wê ye, ji bo wê hatî afirandin.

Tarantool Cartridge: paşîna Lua di sê rêzan de parçe dike

Ev diagram hîn jî bi rastî tiştê ku em ê di projeyê de ava bikin temsîl nake ji ber ku pêkhate razber xuya dikin. Em hîn jî hewce ne ku bibînin ka ev ê çawa li ser Tarantool-a rastîn were pêşandan - werin em pêkhateyên xwe li gorî pêvajoyê kom bikin.

Tarantool Cartridge: paşîna Lua di sê rêzan de parçe dike

Di girtina vshard-router û dergehê de li ser mînakên cihêreng xalek hindik heye. Ma çima pêdivî ye ku em careke din li ser torê bigerin ger ev jixwe berpirsiyariya routerê ye? Divê di heman pêvajoyê de bêne meşandin. Ango hem dergeh û hem jî vshard.router.cfg di yek pêvajoyê de têne destpêkirin, û bihêlin ku ew bi herêmî têkilî bikin.

Di qonaxa sêwiranê de, hêsan bû ku bi sê beşan re bixebite, lê ez, wekî pêşdebirker, dema ku kodê dinivîsim, naxwazim li ser destpêkirina sê nimûneyên Tarnatool bifikirim. Pêdivî ye ku ez ceribandinan bikim û kontrol bikim ka min dergehek rast nivîsandiye. An jî dibe ku ez dixwazim taybetmendiyek ji hevkarên xwe re nîşan bidim. Çima divê ez di nav tengasiya belavkirina sê kopiyan de derbas bibim? Têgeha rolan bi vî awayî çêbû. Rolek modulek luash ya birêkûpêk e ku çerxa jiyanê ji hêla Cartridge ve tê rêvebirin. Di vê nimûneyê de çar ji wan hene - dergeh, router, hilanînê, plansazker. Dibe ku di projeyek din de zêdetir hebe. Hemî rol dikarin di yek pêvajoyê de werin meşandin, û ev ê bes be.

Tarantool Cartridge: paşîna Lua di sê rêzan de parçe dike

Û gava ku dor tê ser danîna qonax an hilberînê, wê hingê em ê her pêvajoyek Tarantool-ê li gorî kapasîteyên hardware-ê rola xwe diyar bikin:

Tarantool Cartridge: paşîna Lua di sê rêzan de parçe dike

Rêveberiya topolojiyê

Agahdariya li ser cihê ku kîjan rol dimeşîne divê li cîhek were hilanîn. Û ev "cihek" veavakirina belavkirî ye, ku min berê li jor behs kir. Tişta herî girîng di derbarê wê de topolojiya komê ye. Li vir 3 komên dubarekirinê yên 5 pêvajoyên Tarantool hene:

Tarantool Cartridge: paşîna Lua di sê rêzan de parçe dike

Em naxwazin daneyan winda bikin, ji ber vê yekê em agahdariya di derbarê pêvajoyên xebitandinê de bi baldarî derman dikin. Cartridge bi karanîna du-qonaxê vesazkirinê bişopîne. Gava ku em dixwazin veavakirinê nûve bikin, ew pêşî kontrol dike ku hemî nimûne berdest in û amade ne ku veavakirina nû qebûl bikin. Piştî vê yekê, qonaxa duyemîn konfigurasyonê dike. Ji ber vê yekê, her çend kopîyek bi demkî ne berdest be jî, dê tiştek xirab nebe. Veavakirin dê bi tenê neyê sepandin û hûn ê di pêş de xeletiyek bibînin.

Di heman demê de di beşa topolojiyê de, pîvanek wusa girîng wekî serokê her koma repplication tête destnîşan kirin. Bi gelemperî ev kopiya ku tê tomar kirin e. Yên mayî pir caran tenê-xwendewar in, her çend dibe ku îstîsna hebin. Carinan pêşdebirên wêrek ji pevçûnan natirsin û dikarin daneyan li çend kopiyan paralel binivîsin, lê hin operasyon hene ku, çi dibe bila bibe, divê du caran neyê kirin. Ji bo vê yekê nîşanek rêberek heye.

Tarantool Cartridge: paşîna Lua di sê rêzan de parçe dike

Jiyana rolan

Ji bo ku di mîmariyek weha de rolek razber hebe, divê çarçove bi rengekî wan îdare bike. Bi xwezayî, kontrol bêyî destpêkirina pêvajoya Tarantool pêk tê. Ji bo birêvebirina rolan 4 gazî hene. Cartridge bixwe dê li gorî tiştê ku di veavakirina wê ya belavkirî de hatî nivîsandin gazî wan bike, bi vî rengî veavakirinê li ser rolên taybetî bicîh tîne.

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

Her rol xwedî fonksiyonek e init. Dema ku rol were çalak kirin an jî dema ku Tarantool ji nû ve were destpêkirin carekê tê gotin. Mînakî, li wir hêsan e ku meriv box.space.create dest pê bike, an jî plansazkar dikare hin fîbera paşîn bide destpêkirin ku dê di hin navberên demê de kar bike.

Yek fonksiyon init dibe ku ne bes be. Cartridge destûrê dide rolan ku sûd ji veavakirina belavkirî ya ku ew ji bo hilanîna topolojiyê bikar tîne sûd werbigirin. Em dikarin di heman veavakirinê de beşek nû ragihînin û perçeyek ji veavakirina karsaziyê tê de hilînin. Di mînaka min de, ev dibe ku ji bo rola plansazker şema daneyê an mîhengên bernameyê be.

Cluster bang dike validate_config и apply_config her carê ku veavakirina belavkirî diguhere. Dema ku veavakirinek ji hêla peywirek du qonax ve tê sepandin, kom kontrol dike ku her rol amade ye ku vê veavakirina nû qebûl bike û, ger hewce bike, xeletiyek ji bikarhênerê re rapor dike. Gava ku her kes qebûl dike ku veavakirin normal e, wê hingê apply_config.

Rêbazek jî heye stop, ku ji bo paqijkirina hilberîna rola pêdivî ye. Ger em bibêjin ku plansazker êdî li ser vê serverê ne hewce ye, ew dikare wan fîberên ku bi wan dest pê kiriye rawestîne init.

Rol dikarin bi hev re têkilî bikin. Em bi nivîsandina bangên fonksiyonê li Lua-yê hatine bikar anîn, lê dibe ku biqewime ku pêvajoyek diyar rola ku em hewce ne tune. Ji bo hêsankirina bangên li ser torê, em modula alîkar a rpc (banga prosedûra dûr) bikar tînin, ku li ser bingeha tora standard a ku di Tarantool de hatî çêkirin hatî çêkirin. Ev dikare bikêr be heke, mînakî, dergehê we bixwaze rasterast ji plansazker bixwaze ku ew karî di cih de bike, li şûna ku rojek li bendê bimîne.

Xaleke din a girîng misogerkirina tolerasyona xeletiyê ye. Cartridge protokola SWIM bikar tîne da ku tenduristiyê bişopîne [4]. Bi kurtasî, pêvajo li ser UDP-ê bi hev re "gotûbêjan" diguhezin - her pêvajo nûçeyên herî dawî ji cîranên xwe re vedibêje, û ew bersiv didin. Ger ji nişka ve bersiv neyê, Tarantool dest pê dike ku guman bike ku tiştek xelet e, û piştî demekê ew mirinê dixwîne û dest pê dike ji her kesê ku li dora vê nûçeyê vedibêje.

Tarantool Cartridge: paşîna Lua di sê rêzan de parçe dike

Li ser bingeha vê protokolê, Cartridge pêvajoya têkçûna otomatîkî organîze dike. Her pêvajo hawîrdora xwe dişopîne, û heke serok ji nişka ve bersivê bide, kopya dikare rola xwe bigire, û Cartridge li gorî wê rolên xebitandinê mîheng dike.

Tarantool Cartridge: paşîna Lua di sê rêzan de parçe dike

Pêdivî ye ku hûn li vir baldar bin, ji ber ku guheztina pir caran paş û paş dikare di dema dubarekirinê de bibe sedema nakokiyên daneyê. Bê guman, hûn neçar in ku têkçûna otomatîkî bi rasthatinî çalak nekin. Divê em bi zelalî fêm bikin ka çi diqewime û piştrast bin ku piştî ku rêber were vegerandin û tac jê re were vegerandin, dubarekirin dê neşike.

Ji van hemîyan, hûn dikarin hestê bistînin ku rolên mîna mîkroservisan in. Di wateyekê de, ew tenê ew in, tenê wekî modulên di hundurê pêvajoyên Tarantool de. Lê çend cudahiyên bingehîn jî hene. Pêşîn, hemî rolên projeyê divê di heman bingeha kodê de bijîn. Û divê hemî pêvajoyên Tarantool ji heman bingehê kodê bêne destpêkirin, da ku gava ku em hewl didin ku plansazker dest pê bikin, surprîzên mîna wan tune ne, lê ew bi hêsanî tune. Di heman demê de, divê hûn nehêlin cûdahiyên di guhertoyên kodê de, ji ber ku tevgera pergalê di rewşek weha de pêşbînîkirin û debugkirin pir dijwar e.

Berevajî Docker, em nekarin tenê rolek "wêneyek" bigirin, wê bibin makîneyek din û li wir bimeşînin. Rolên me bi qasî konteynerên Docker veqetandî ne. Di heman demê de, em nikarin du rolên wekhev li ser yek nimûne bimeşînin. Rolek an heye an tune; di wateyekê de, ew yek yek e. Ya sêyemîn jî, pêdivî ye ku rol di nav tevahiya koma dubarekirinê de yek bin, ji ber ku wekî din ew ê bêaqil be - dane heman e, lê veavakirin cûda ye.

Amûrên belavkirinê

Min soz da ku ez nîşan bidim ka Cartridge çawa alîkariyê dide sepanan. Ji bo ku jiyanê ji yên din re hêsantir bike, çarçove pakêtên RPM paket dike:

$ cartridge pack rpm myapp -- упакует для нас ./myapp-0.1.0-1.rpm
$ sudo yum install ./myapp-0.1.0-1.rpm

Pakêta sazkirî hema hema her tiştê ku hûn hewce ne dihewîne: hem serîlêdan û hem jî girêdanên sazkirî. Tarantool dê di heman demê de wekî pêwendiya pakêta RPM-ê bigihîje serverê, û karûbarê me ji bo destpêkirinê amade ye. Ev bi saya systemd tê kirin, lê pêşî hûn hewce ne ku mîhengek piçûk binivîsin. Bi kêmanî, URI-ya her pêvajoyê diyar bikin. Ji bo nimûne sê bes e.

$ 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

Li vir nuwazek balkêş heye. Li şûna ku em tenê porta protokola binary diyar bikin, em navnîşana giştî ya pêvajoyê tevî navê mêvandar diyar dikin. Ev pêdivî ye ku girêkên komê zanibin ka meriv çawa bi hevûdu ve girêdayî ye. Ramanek xirab e ku meriv 0.0.0.0 wekî navnîşana advertise_uri bikar bîne; divê ew navnîşek IP-ya derveyî be, ne girêdanek soketê. Bêyî wê, dê tu tişt nexebite, ji ber vê yekê Cartridge bi hêsanî dê nehêle ku hûn bi reklama_uriya çewt ve girêkek bidin destpêkirin.

Naha ku veavakirin amade ye, hûn dikarin pêvajoyan dest pê bikin. Ji ber ku yekîneyek pergalê ya birêkûpêk rê nade ku ji yek pêvajoyek zêdetir dest pê bike, serîlêdanên li ser Cartridge ji hêla tê gotin ve têne saz kirin. yekîneyên destnîşankirî yên ku bi vî rengî dixebitin:

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

Di veavakirinê de, me porta HTTP-ê ya ku Cartridge pêwendiya tevneyê jê re xizmet dike diyar kir - 8080. Ka em biçin wê û lê binêre:

Tarantool Cartridge: paşîna Lua di sê rêzan de parçe dike

Em dibînin ku her çend pêvajo dimeşin jî, ew hêj nehatine mîheng kirin. Kartûk hîn nizane kî divê bi kê re dubare bike û nikare bi serê xwe biryarekê bide, ji ber vê yekê li benda kiryarên me ye. Lê zêde bijartina me tune: jiyana komek nû bi veavakirina girêka yekem dest pê dike. Dûv re em ê yên din li komê zêde bikin, wan rolan destnîşan bikin, û di vê nuqteyê de belavkirin dikare bi serfirazî qediya were hesibandin.

Werin em qedehek vexwarina xweya bijare birijînin û piştî hefteyek xebata dirêj rehet bibin. Serlêdan dikare were bikar anîn.

Tarantool Cartridge: paşîna Lua di sê rêzan de parçe dike

Encam

Encam çi ne? Wê biceribînin, wê bikar bînin, bertekên xwe bihêlin, li ser Github bilêtan biafirînin.

references

[1] Tarantool » 2.2 » Çavkanî » Referansa keviran » Module vshard

[2] Me çawa bingeha karsaziya veberhênanê ya Alfa-Bank li ser bingeha Tarantool bicîh kir

[3] Mîmariya fatûreya nifşê nû: veguherîna bi derbasbûna Tarantool

[4] SWIM - protokola avakirina komê

[5] GitHub - tarantool / cartridge-cli

[6] GitHub - tarantool / cartridge

Source: www.habr.com

Add a comment