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
Aħbar tajba: ġbarna xi tiri kbar (eż
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.
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.
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.
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.
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:
Ġ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:
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.
Ħ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
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.
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:
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.
Riżultati ta '
X'inhuma r-riżultati? Ipprovaha, użaha, ħalli feedback, oħloq biljetti fuq Github.
referenzi
[1]
Sors: www.habr.com