Skartoċċ Tarantool: sharding backend Lua fi tliet linji

Skartoċċ Tarantool: sharding backend Lua fi tliet linji

Fil-Grupp Mail.ru għandna Tarantool - dan huwa server ta 'applikazzjoni fil-Lua, li jirdoppja wkoll bħala database (jew viċi versa?). Huwa mgħaġġel u jibred, iżda l-kapaċitajiet ta 'server wieħed għadhom mhumiex illimitati. L-iskala vertikali wkoll mhix rimedju, għalhekk Tarantool għandu għodda għall-iskala orizzontali - il-modulu vshard [1]. Jippermettilek taqsam id-dejta f'diversi servers, iżda trid tbiddel magħha biex twaqqafha u tehmeż il-loġika tan-negozju.

Aħbar tajba: ġbarna xi tiri kbar (eż [2], [3]) u ħoloq qafas ieħor li se jissimplifika b'mod sinifikanti s-soluzzjoni għal din il-problema.

Skartoċċ Tarantool huwa qafas ġdid għall-iżvilupp ta' sistemi distribwiti kumplessi. Jippermettilek tiffoka fuq il-kitba tal-loġika tan-negozju minflok issolvi l-problemi tal-infrastruttura. Taħt il-qatgħa ser ngħidlek kif jaħdem dan il-qafas u kif tikteb servizzi mqassma bl-użu tiegħu.

X'inhi eżattament il-problema?

Għandna tarantula, għandna vshard - x'tista' trid aktar?

L-ewwelnett, hija kwistjoni ta 'konvenjenza. Il-konfigurazzjoni vshard hija kkonfigurata permezz ta 'tabelli Lua. Biex sistema distribwita ta 'proċessi Tarantool multipli taħdem b'mod korrett, il-konfigurazzjoni trid tkun l-istess kullimkien. Ħadd ma jrid jagħmel dan manwalment. Għalhekk, jintużaw kull xorta ta 'skripts, Ansible, u sistemi ta' skjerament.

Skartoċċ innifsu jimmaniġġja l-konfigurazzjoni vshard, jagħmel dan ibbażat fuq tiegħu konfigurazzjoni mqassma proprja. Huwa essenzjalment fajl YAML sempliċi, li kopja tiegħu hija maħżuna f'kull istanza ta' Tarantool. Is-simplifikazzjoni hija li l-qafas innifsu jimmonitorja l-konfigurazzjoni tiegħu u jiżgura li huwa l-istess kullimkien.

It-tieni nett, hija għal darb'oħra kwistjoni ta 'konvenjenza. Il-konfigurazzjoni vshard m'għandha x'taqsam xejn mal-iżvilupp tal-loġika tan-negozju u tfixkel biss lill-programmatur mix-xogħol tiegħu. Meta niddiskutu l-arkitettura ta 'proġett, ħafna drabi nitkellmu dwar komponenti individwali u l-interazzjoni tagħhom. Għadu kmieni wisq biex wieħed jaħseb dwar it-tnedija ta' cluster għal 3 ċentri tad-dejta.

Solvejna dawn il-problemi għal darb'oħra, u f'xi punt irnexxielna niżviluppaw approċċ li ssimplifika l-ħidma mal-applikazzjoni matul iċ-ċiklu kollu tal-ħajja tagħha: ħolqien, żvilupp, ittestjar, CI/CD, manutenzjoni.

Skartoċċ jintroduċi l-kunċett ta 'rwol għal kull proċess Tarantool. Ir-rwoli huma kunċett li jippermetti lil żviluppatur jiffoka fuq il-kitba tal-kodiċi. Ir-rwoli kollha disponibbli fil-proġett jistgħu jitmexxew fuq istanza waħda ta' Tarantool, u dan ikun biżżejjed għat-testijiet.

Karatteristiċi ewlenin tal-Iskartoċċ Tarantool:

  • orkestrazzjoni awtomatizzata tal-clusters;
  • tespandi l-funzjonalità tal-applikazzjoni bl-użu ta 'rwoli ġodda;
  • mudell ta' applikazzjoni għall-iżvilupp u l-iskjerament;
  • sharding awtomatiku integrat;
  • integrazzjoni mal-qafas tal-ittestjar Luatest;
  • ġestjoni tal-clusters bl-użu tal-WebUI u l-API;
  • għodod għall-ippakkjar u l-iskjerament.

Hello dinja!

Ma nistax nistenna biex nuri l-qafas innifsu, għalhekk inħallu l-istorja dwar l-arkitettura għal aktar tard u nibdew b'xi ħaġa sempliċi. Jekk nassumu li Tarantool innifsu huwa diġà installat, allura kulma fadal huwa li tagħmel

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

Dawn iż-żewġ kmandi jinstallaw l-utilitajiet tal-linja tal-kmand u jippermettulek toħloq l-ewwel applikazzjoni tiegħek mill-mudell:

$ cartridge create --name myapp

U dan huwa dak li nġibu:

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/

Dan huwa repożitorju git b'"Hello, World!" applikazzjoni. Ejja nippruvaw inħaddmuha mill-ewwel, wara li installati qabel id-dipendenzi (inkluż il-qafas innifsu):

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

Allura, għandna nodu wieħed jaħdem għall-applikazzjoni sharded futura. Lajk kurżiv jista 'minnufih jiftaħ l-interface tal-web, jikkonfigura raggruppament ta' nodu wieħed bil-maws u jgawdi r-riżultat, iżda għadu kmieni wisq biex tiċċelebra. S'issa, l-applikazzjoni ma tista 'tagħmel xejn utli, għalhekk ser ngħidlek dwar l-iskjerament aktar tard, iżda issa wasal iż-żmien li tikteb kodiċi.

Żvilupp ta' Applikazzjoni

Immaġina, qed infasslu proġett li jrid jirċievi data, issalvaha u jibni rapport darba kuljum.

Skartoċċ Tarantool: sharding backend Lua fi tliet linji

Nibdew niġbdu dijagramma u npoġġu tliet komponenti fuqha: gateway, ħażna u scheduler. Qed naħdmu aktar fuq l-arkitettura. Peress li nużaw vshard bħala ħażna, inżidu vshard-router u vshard-storage mal-iskema. La l-gateway u lanqas l-iskeduler ma se jaċċessaw direttament il-ħażna; għalhekk huwa r-router, għalhekk inħoloq għalih.

Skartoċċ Tarantool: sharding backend Lua fi tliet linji

Din id-dijagramma għadha ma tirrappreżentax eżattament dak li ser nibnu fil-proġett minħabba li l-komponenti jidhru astratti. Għad irridu naraw kif dan se jiġi pproġettat fuq it-Tarantool reali - ejja niġbru l-komponenti tagħna skond il-proċess.

Skartoċċ Tarantool: sharding backend Lua fi tliet linji

M'hemmx skop li jinżammu vshard-router u gateway f'każijiet separati. Għaliex għandna bżonn nisserfjaw in-netwerk għal darb'oħra jekk din hija diġà r-responsabbiltà tar-router? Għandhom jitmexxew fl-istess proċess. Jiġifieri, kemm il-gateway kif ukoll vshard.router.cfg huma inizjalizzati fi proċess wieħed, u jħalluhom jinteraġixxu lokalment.

Fl-istadju tad-disinn, kien konvenjenti li taħdem bi tliet komponenti, iżda jien, bħala żviluppatur, waqt li nikteb il-kodiċi, ma rridx naħseb dwar it-tnedija ta 'tliet każijiet ta' Tarnatool. Għandi bżonn nagħmel testijiet u niċċekkja li ktibt gateway b'mod korrett. Jew forsi nixtieq nuri xi karatteristika lill-kollegi tiegħi. Għaliex għandi ngħaddi mill-battikata li niskjera tliet kopji? Hekk twieled il-kunċett tar-rwoli. Rwol huwa modulu luash regolari li ċ-ċiklu tal-ħajja tiegħu huwa mmexxi minn Skartoċċ. F'dan l-eżempju hemm erbgħa minnhom - gateway, router, ħażna, scheduler. Jista' jkun hemm aktar fi proġett ieħor. Ir-rwoli kollha jistgħu jitmexxew fi proċess wieħed, u dan ikun biżżejjed.

Skartoċċ Tarantool: sharding backend Lua fi tliet linji

U meta niġu għall-iskjerament għall-istadju jew il-produzzjoni, allura aħna se nassenjaw kull proċess ta 'Tarantool is-sett ta' rwoli tiegħu stess skont il-kapaċitajiet tal-hardware:

Skartoċċ Tarantool: sharding backend Lua fi tliet linji

Ġestjoni tat-topoloġija

L-informazzjoni dwar fejn qed jaħdmu liema rwoli għandha tinħażen x'imkien. U din "x'imkien" hija l-konfigurazzjoni mqassma, li diġà semmejt hawn fuq. L-iktar ħaġa importanti dwarha hija t-topoloġija tal-cluster. Hawn huma 3 gruppi ta 'replikazzjoni ta' 5 proċessi Tarantool:

Skartoċċ Tarantool: sharding backend Lua fi tliet linji

Ma rridux nitilfu d-dejta, għalhekk nittrattaw l-informazzjoni dwar it-tmexxija tal-proċessi b'attenzjoni. L-iskartoċċ iżomm rekord tal-konfigurazzjoni billi juża kommit f'żewġ fażijiet. Ladarba rridu naġġornaw il-konfigurazzjoni, l-ewwel jiċċekkja li l-istanzi kollha huma disponibbli u lesti biex jaċċettaw il-konfigurazzjoni l-ġdida. Wara dan, it-tieni fażi tapplika l-konfigurazzjoni. Għalhekk, anki jekk kopja waħda tirriżulta li tkun temporanjament mhux disponibbli, ma jiġri xejn ħażin. Il-konfigurazzjoni sempliċement mhux se tiġi applikata u tara żball minn qabel.

Ukoll fit-taqsima tat-topoloġija, huwa indikat parametru importanti bħalma huwa l-mexxej ta 'kull grupp ta' replikazzjoni. Normalment din hija l-kopja li qed tiġi rreġistrata. Il-bqija huma ħafna drabi jinqraw biss, għalkemm jista 'jkun hemm eċċezzjonijiet. Xi drabi l-iżviluppaturi kuraġġużi ma jibżgħux mill-kunflitti u jistgħu jiktbu data għal diversi repliki b'mod parallel, iżda hemm xi operazzjonijiet li, x'ikun, m'għandhomx isiru darbtejn. Għal dan hemm sinjal ta’ mexxej.

Skartoċċ Tarantool: sharding backend Lua fi tliet linji

Ħajja tar-rwoli

Biex jeżisti rwol astratt f'tali arkitettura, il-qafas irid jimmaniġġjahom b'xi mod. Naturalment, il-kontroll iseħħ mingħajr ma jerġa 'jinbeda l-proċess Tarantool. Hemm 4 callbacks biex jimmaniġġjaw ir-rwoli. L-iskartoċċ innifsu se jsejjaħhom skont dak li jkun miktub fil-konfigurazzjoni mqassma tiegħu, u b'hekk japplika l-konfigurazzjoni għal rwoli speċifiċi.

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

Kull rwol għandu funzjoni init. Tissejjaħ darba jew meta r-rwol ikun attivat jew meta Tarantool jerġa' jinbeda. Huwa konvenjenti hemmhekk, per eżempju, li initialize box.space.create, jew l-iskeduler jista 'jniedi xi fibra ta' l-isfond li se twettaq xogħol f'ċerti intervalli ta 'ħin.

Funzjoni waħda init jista’ ma jkunx biżżejjed. Skartoċċ jippermetti li r-rwoli jieħdu vantaġġ mill-konfigurazzjoni distribwita li juża biex jaħżnu t-topoloġija. Nistgħu niddikjaraw taqsima ġdida fl-istess konfigurazzjoni u naħżnu framment tal-konfigurazzjoni tan-negozju fiha. Fl-eżempju tiegħi, dan jista 'jkun skema ta' data jew settings ta 'skeda għar-rwol ta' scheduler.

Cluster sejħiet validate_config и apply_config kull darba li l-konfigurazzjoni mqassma tinbidel. Meta konfigurazzjoni tiġi applikata b'commit f'żewġ fażijiet, il-cluster jiċċekkja li kull rwol ikun lest li jaċċetta din il-konfigurazzjoni ġdida u, jekk meħtieġ, jirrapporta żball lill-utent. Meta kulħadd jaqbel li l-konfigurazzjoni hija normali, allura l- apply_config.

Wkoll ir-rwoli għandhom metodu stop, li hija meħtieġa biex tnaddaf l-output tar-rwol. Jekk ngħidu li Scheduler m'għadux meħtieġ fuq dan is-server, jista 'jwaqqaf dawk il-fibri li beda bihom init.

Ir-rwoli jistgħu jinteraġixxu ma' xulxin. Aħna mdorrijin niktbu sejħiet ta 'funzjoni fil-Lua, iżda jista' jiġri li proċess partikolari ma jkollux ir-rwol li neħtieġu. Biex niffaċilitaw is-sejħiet fuq in-netwerk, nużaw il-modulu awżiljarju rpc (sejħa ta 'proċedura remota), li huwa mibni fuq il-bażi tan-netbox standard mibni f'Tarantool. Dan jista 'jkun utli jekk, pereżempju, il-portal tiegħek irid jitlob direttament lill-iskedar biex jagħmel ix-xogħol issa, aktar milli jistenna ġurnata.

Punt importanti ieħor huwa li tiġi żgurata t-tolleranza tal-ħsarat. Skartoċċ juża l-protokoll SWIM biex jimmonitorja s-saħħa [4]. Fil-qosor, il-proċessi jiskambjaw "għajdut" bejniethom fuq UDP—kull proċess jgħid lill-ġirien tiegħu l-aħħar aħbarijiet, u huma jwieġbu. Jekk f’daqqa waħda t-tweġiba ma tasalx, Tarantool jibda jissuspetta li xi ħaġa hi ħażina, u wara ftit isemmi l-mewt u jibda jgħid lil kulħadd madwar din l-aħbar.

Skartoċċ Tarantool: sharding backend Lua fi tliet linji

Ibbażat fuq dan il-protokoll, Skartoċċ jorganizza ipproċessar awtomatiku ta 'falliment. Kull proċess jimmonitorja l-ambjent tiegħu, u jekk il-mexxej f'daqqa waħda jieqaf jirrispondi, ir-replika tista 'tieħu f'idejha r-rwol tagħha, u Cartridge jikkonfigura r-rwoli ta' tħaddim kif xieraq.

Skartoċċ Tarantool: sharding backend Lua fi tliet linji

Trid toqgħod attent hawnhekk, minħabba li taqleb frekwenti 'l quddiem u lura jista' jwassal għal kunflitti tad-dejta waqt ir-replikazzjoni. Naturalment, m'għandekx tippermetti failover awtomatiku bl-addoċċ. Irridu nifhmu b'mod ċar x'qed jiġri u nkunu ċerti li r-replikazzjoni ma tinkiser wara li l-mexxej jiġi rrestawrat u l-kuruna tiġi rritornata lilu.

Minn dan kollu, jista 'jkollok is-sensazzjoni li r-rwoli huma simili għal mikroservizzi. F'ċertu sens, huma biss hekk, biss bħala moduli ġewwa proċessi Tarantool. Iżda hemm ukoll numru ta’ differenzi fundamentali. L-ewwel, ir-rwoli kollha tal-proġett iridu jgħixu fl-istess bażi ta 'kodiċi. U l-proċessi kollha ta 'Tarantool għandhom jiġu mnedija mill-istess bażi ta' kodiċi, sabiex ma jkunx hemm sorpriżi bħal dawk meta nippruvaw inizjalizzaw l-iskeder, iżda sempliċement ma teżistix. Ukoll, m'għandekx tippermetti differenzi fil-verżjonijiet tal-kodiċi, minħabba li l-imġieba tas-sistema f'sitwazzjoni bħal din hija diffiċli ħafna biex titbassar u tiddibaggja.

B'differenza Docker, ma nistgħux nieħdu rwol "immaġini", neħduha f'magna oħra u nħaddmuha hemmhekk. Ir-rwoli tagħna mhumiex iżolati daqs il-kontenituri Docker. Ukoll, ma nistgħux inħaddmu żewġ rwoli identiċi fuq istanza waħda. Rwol jew jeżisti jew le; f'ċertu sens, huwa singleton. U t-tielet, ir-rwoli għandhom ikunu l-istess fi ħdan il-grupp ta 'replikazzjoni kollu, għax inkella jkun assurd - id-dejta hija l-istess, iżda l-konfigurazzjoni hija differenti.

Għodod ta 'skjerament

Wegħdt li nuri kif Cartridge jgħin biex iħaddem applikazzjonijiet. Biex tagħmel il-ħajja aktar faċli għal ħaddieħor, il-qafas jippakkja pakketti RPM:

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

Il-pakkett installat fih kważi dak kollu li għandek bżonn: kemm l-applikazzjoni kif ukoll id-dipendenzi installati. Tarantool se jasal ukoll fuq is-server bħala dipendenza tal-pakkett RPM, u s-servizz tagħna huwa lest biex jitnieda. Dan isir permezz ta' systemd, iżda l-ewwel trid tikteb ftit konfigurazzjoni. Bħala minimu, speċifika l-URI ta' kull proċess. Tlieta huwa biżżejjed per eżempju.

$ 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

Hemm sfumatura interessanti hawnhekk. Minflok ma nispeċifikaw biss il-port tal-protokoll binarju, aħna nispeċifikaw l-indirizz pubbliku kollu tal-proċess inkluż l-isem tal-host. Dan huwa meħtieġ sabiex in-nodi tal-cluster ikunu jafu kif jgħaqqdu ma 'xulxin. Hija idea ħażina li tuża 0.0.0.0 bħala l-indirizz advertise_uri; għandu jkun indirizz IP estern, mhux socket bind. Mingħajrha, xejn ma jaħdem, għalhekk Cartridge sempliċement ma jħallik tniedi node b'advertise_uri ħażin.

Issa li l-konfigurazzjoni hija lesta, tista 'tibda l-proċessi. Peress li unità systemd regolari ma tippermettix li jibda aktar minn proċess wieħed, l-applikazzjonijiet fuq l-Iskartoċċ huma installati mill-hekk imsejjaħ. unitajiet instanzjati li jaħdmu hekk:

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

Fil-konfigurazzjoni, speċifikajna l-port HTTP li fih Cartridge jaqdi l-interface tal-web - 8080. Ejja mmorru lejha u nagħtu ħarsa:

Skartoċċ Tarantool: sharding backend Lua fi tliet linji

Naraw li għalkemm il-proċessi qed jaħdmu, għadhom mhumiex konfigurati. L-iskartoċċ għadu ma jafx min għandu jirreplika ma 'min u ma jistax jieħu deċiżjoni waħdu, għalhekk qed jistenna l-azzjonijiet tagħna. Imma m'għandniex ħafna għażla: il-ħajja ta 'cluster ġdid tibda bil-konfigurazzjoni tal-ewwel node. Imbagħad inżidu l-oħrajn mal-cluster, nassenjawhom rwoli, u f'dan il-punt l-iskjerament jista 'jitqies li tlesta b'suċċess.

Ejja ferra 'tazza tax-xarba favorita tiegħek u jirrilassaw wara ġimgħa twila ta' xogħol. L-applikazzjoni tista 'tintuża.

Skartoċċ Tarantool: sharding backend Lua fi tliet linji

Riżultati ta '

X'inhuma r-riżultati? Ipprovaha, użaha, ħalli feedback, oħloq biljetti fuq Github.

referenzi

[1] Tarantool » 2.2 » Referenza » Referenza tal-blat » Modulu vshard

[2] Kif implimentajna l-qalba tan-negozju ta' investiment ta' Alfa-Bank ibbażat fuq Tarantool

[3] Arkitettura ta' kontijiet ta' ġenerazzjoni ġdida: trasformazzjoni bit-tranżizzjoni għal Tarantool

[4] SWIM - protokoll ta' kostruzzjoni ta' clusters

[5] GitHub - tarantool/cartridge-cli

[6] GitHub - tarantool/skartoċċ

Sors: www.habr.com

Żid kumment