Cetris Tarantool: darnio backend Lua mewn tair llinell

Cetris Tarantool: darnio backend Lua mewn tair llinell

Yn Mail.ru Group mae gennym Tarantool - gweinydd cais yw hwn yn Lua, sydd hefyd yn dyblu fel cronfa ddata (neu i'r gwrthwyneb?). Mae'n gyflym ac yn cŵl, ond nid yw galluoedd un gweinydd yn ddiderfyn o hyd. Nid yw graddio fertigol yn ateb i bob problem chwaith, felly mae gan Tarantool offer ar gyfer graddio llorweddol - y modiwl vshard [1]. Mae'n caniatáu ichi rannu data ar draws sawl gweinydd, ond mae'n rhaid i chi bincio ag ef i'w sefydlu ac atodi rhesymeg y busnes.

Newyddion da: rydyn ni wedi casglu rhai lluniau mawr (ee [2], [3]) a chreu fframwaith arall a fydd yn symleiddio'r ateb i'r broblem hon yn sylweddol.

Cetris Tarantool yn fframwaith newydd ar gyfer datblygu systemau gwasgaredig cymhleth. Mae'n caniatáu ichi ganolbwyntio ar ysgrifennu rhesymeg busnes yn lle datrys problemau seilwaith. O dan y toriad byddaf yn dweud wrthych sut mae'r fframwaith hwn yn gweithio a sut i ysgrifennu gwasanaethau dosbarthedig gan ei ddefnyddio.

Beth yn union yw'r broblem?

Mae gennym ni tarantwla, mae gennym ni vshard - beth arall allech chi ei eisiau?

Yn gyntaf, mae'n fater o gyfleustra. Mae'r cyfluniad vshard wedi'i ffurfweddu trwy dablau Lua. Er mwyn i system ddosbarthedig o brosesau Tarantool lluosog weithio'n gywir, rhaid i'r cyfluniad fod yr un peth ym mhobman. Nid oes neb eisiau gwneud hyn â llaw. Felly, defnyddir pob math o sgriptiau, Ansible, a systemau defnyddio.

Mae cetris ei hun yn rheoli'r cyfluniad vshard, mae'n gwneud hyn yn seiliedig ar ei cyfluniad dosbarthedig eich hun. Yn ei hanfod, ffeil YAML syml ydyw, y mae copi ohoni'n cael ei storio ym mhob achos Tarantool. Y symleiddio yw bod y fframwaith ei hun yn monitro ei ffurfweddiad ac yn sicrhau ei fod yr un peth ym mhobman.

Yn ail, mater o gyfleustra ydyw eto. Nid oes gan y cyfluniad vshard unrhyw beth i'w wneud â datblygiad rhesymeg busnes ac mae'n tynnu sylw'r rhaglennydd oddi wrth ei waith yn unig. Pan fyddwn yn trafod pensaernïaeth prosiect, rydym yn aml yn siarad am gydrannau unigol a'u rhyngweithio. Mae'n rhy gynnar i feddwl am gyflwyno clwstwr i 3 canolfan ddata.

Fe wnaethom ddatrys y problemau hyn dro ar ôl tro, ac ar ryw adeg fe wnaethom lwyddo i ddatblygu dull a oedd yn symleiddio gweithio gyda'r cymhwysiad trwy gydol ei gylch bywyd: creu, datblygu, profi, CI / CD, cynnal a chadw.

Mae cetris yn cyflwyno'r cysyniad o rôl ar gyfer pob proses Tarantool. Mae rolau yn gysyniad sy'n caniatáu i ddatblygwr ganolbwyntio ar ysgrifennu cod. Gellir rhedeg pob rôl sydd ar gael yn y prosiect ar un enghraifft Tarantool, a bydd hyn yn ddigon ar gyfer profion.

Nodweddion allweddol Tarantool Cartridge:

  • offeryniaeth clwstwr awtomataidd;
  • ehangu ymarferoldeb y rhaglen gan ddefnyddio rolau newydd;
  • templed cais ar gyfer datblygu a defnyddio;
  • rhwygo awtomatig adeiledig;
  • integreiddio â fframwaith profi Luatest;
  • rheoli clwstwr gan ddefnyddio WebUI ac API;
  • offer pecynnu a defnyddio.

Helo Byd!

Ni allaf aros i ddangos y fframwaith ei hun, felly byddwn yn gadael y stori am y bensaernïaeth yn ddiweddarach ac yn dechrau gyda rhywbeth syml. Os tybiwn fod Tarantool ei hun eisoes wedi'i osod, yna mae'r cyfan sydd ar ôl i'w wneud

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

Bydd y ddau orchymyn hyn yn gosod y cyfleustodau llinell orchymyn ac yn caniatáu ichi greu eich cais cyntaf o'r templed:

$ cartridge create --name myapp

A dyma beth rydyn ni'n ei gael:

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/

Ystorfa git yw hon gyda "Helo, Byd!" cais. Gadewch i ni geisio ei redeg ar unwaith, ar ôl gosod y dibyniaethau yn flaenorol (gan gynnwys y fframwaith ei hun):

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

Felly, mae gennym un nod yn rhedeg ar gyfer y cais wedi'i dorri'n ddarnau yn y dyfodol. Gall lleygwr chwilfrydig agor y rhyngwyneb gwe ar unwaith, ffurfweddu clwstwr o un nod gyda'r llygoden a mwynhau'r canlyniad, ond mae'n rhy gynnar i lawenhau. Hyd yn hyn, ni all y cais wneud unrhyw beth defnyddiol, felly byddaf yn dweud wrthych am y defnydd yn ddiweddarach, ond nawr mae'n bryd ysgrifennu cod.

Datblygu Cymwysiadau

Dychmygwch, rydym yn dylunio prosiect y mae'n rhaid iddo dderbyn data, ei arbed ac adeiladu adroddiad unwaith y dydd.

Cetris Tarantool: darnio backend Lua mewn tair llinell

Rydyn ni'n dechrau llunio diagram ac yn gosod tair cydran arno: porth, storfa a rhaglennydd. Rydym yn gweithio ar y bensaernïaeth ymhellach. Gan ein bod yn defnyddio vshard fel storfa, rydym yn ychwanegu vshard-router a vshard-storage i'r cynllun. Ni fydd y porth na'r trefnydd yn cael mynediad uniongyrchol i'r storfa; dyna bwrpas y llwybrydd, dyna beth y cafodd ei greu ar ei gyfer.

Cetris Tarantool: darnio backend Lua mewn tair llinell

Nid yw'r diagram hwn yn cynrychioli'n union yr hyn y byddwn yn ei adeiladu yn y prosiect oherwydd bod y cydrannau'n edrych yn haniaethol. Mae angen i ni weld o hyd sut y bydd hyn yn cael ei daflunio ar y Tarantool go iawn - gadewch i ni grwpio ein cydrannau fesul proses.

Cetris Tarantool: darnio backend Lua mewn tair llinell

Nid oes fawr o ddiben cadw vshard-router a porth ar achosion gwahanol. Pam fod angen i ni syrffio'r rhwydwaith unwaith eto os yw hyn eisoes yn gyfrifoldeb y llwybrydd? Rhaid iddynt gael eu rhedeg o fewn yr un broses. Hynny yw, mae porth a vshard.router.cfg yn cael eu cychwyn mewn un broses, a gadael iddynt ryngweithio'n lleol.

Yn y cam dylunio, roedd yn gyfleus gweithio gyda thair cydran, ond nid wyf i, fel datblygwr, wrth ysgrifennu'r cod, am feddwl am lansio tri achos o Tarnatool. Mae angen i mi redeg profion a gwirio fy mod wedi ysgrifennu'r porth yn gywir. Neu efallai fy mod eisiau dangos nodwedd i fy nghydweithwyr. Pam ddylwn i fynd drwy'r drafferth o ddefnyddio tri chopi? Dyma sut y ganwyd y cysyniad o rolau. Modiwl cyflym rheolaidd yw rôl y mae ei gylch bywyd yn cael ei reoli gan Cartridge. Yn yr enghraifft hon mae pedwar ohonyn nhw - porth, llwybrydd, storfa, trefnydd. Efallai y bydd mwy mewn prosiect arall. Gellir rhedeg pob rôl mewn un broses, a bydd hyn yn ddigon.

Cetris Tarantool: darnio backend Lua mewn tair llinell

Ac o ran eu defnyddio i lwyfannu neu gynhyrchu, yna byddwn yn neilltuo ei set ei hun o rolau i bob proses Tarantool yn dibynnu ar alluoedd y caledwedd:

Cetris Tarantool: darnio backend Lua mewn tair llinell

Rheoli topoleg

Rhaid storio gwybodaeth am ble mae'r rolau'n rhedeg yn rhywle. A'r “rhywle” hwn yw'r cyfluniad dosbarthedig, y soniais amdano eisoes uchod. Y peth pwysicaf amdano yw topoleg y clwstwr. Dyma 3 grŵp atgynhyrchu o 5 proses Tarantool:

Cetris Tarantool: darnio backend Lua mewn tair llinell

Nid ydym am golli data, felly rydym yn trin gwybodaeth am redeg prosesau yn ofalus. Mae cetris yn cadw golwg ar y ffurfwedd gan ddefnyddio ymrwymiad dau gam. Unwaith y byddwn am ddiweddaru'r ffurfweddiad, yn gyntaf mae'n gwirio bod pob achos ar gael ac yn barod i dderbyn y ffurfweddiad newydd. Ar ôl hyn, mae'r ail gam yn cymhwyso'r ffurfwedd. Felly, hyd yn oed os na fydd un copi ar gael dros dro, ni fydd dim byd drwg yn digwydd. Yn syml, ni fydd y cyfluniad yn cael ei gymhwyso a byddwch yn gweld gwall ymlaen llaw.

Hefyd yn yr adran topoleg, nodir paramedr mor bwysig ag arweinydd pob grŵp atgynhyrchu. Fel arfer dyma'r copi sy'n cael ei recordio. Mae'r gweddill fel arfer yn ddarllen-yn-unig, er y gall fod eithriadau. Weithiau nid yw datblygwyr dewr yn ofni gwrthdaro a gallant ysgrifennu data at sawl atgynhyrchiad ochr yn ochr, ond mae rhai gweithrediadau, ni waeth beth, na ddylid eu perfformio ddwywaith. Ar gyfer hyn mae arwydd o arweinydd.

Cetris Tarantool: darnio backend Lua mewn tair llinell

Bywyd rolau

Er mwyn i rôl haniaethol fodoli mewn pensaernïaeth o'r fath, rhaid i'r fframwaith eu rheoli rywsut. Yn naturiol, mae rheolaeth yn digwydd heb ailgychwyn y broses Tarantool. Mae 4 galwad yn ôl i reoli rolau. Bydd cetris ei hun yn eu galw yn dibynnu ar yr hyn sydd wedi'i ysgrifennu yn ei ffurfwedd ddosbarthedig, a thrwy hynny gymhwyso'r cyfluniad i rolau penodol.

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

Mae gan bob rôl swyddogaeth init. Fe'i gelwir unwaith naill ai pan fydd y rôl wedi'i galluogi neu pan fydd Tarantool yn cael ei ailgychwyn. Mae'n gyfleus yno, er enghraifft, i gychwyn box.space.create, neu gall y trefnydd lansio rhywfaint o ffibr cefndir a fydd yn perfformio gwaith ar gyfnodau amser penodol.

Un swyddogaeth init efallai na fydd yn ddigon. Mae cetris yn caniatáu i rolau fanteisio ar y cyfluniad dosbarthedig y mae'n ei ddefnyddio i storio'r topoleg. Gallwn ddatgan adran newydd yn yr un ffurfweddiad a storio darn o'r cyfluniad busnes ynddi. Yn fy enghraifft i, gallai hyn fod yn sgema data neu'n osodiadau amserlen ar gyfer rôl yr amserlennydd.

Galwadau clwstwr validate_config и apply_config bob tro mae'r cyfluniad dosbarthedig yn newid. Pan fydd cyfluniad yn cael ei gymhwyso gan ymrwymiad dau gam, mae'r clwstwr yn gwirio bod pob rôl yn barod i dderbyn y cyfluniad newydd hwn ac, os oes angen, yn adrodd gwall i'r defnyddiwr. Pan fydd pawb yn cytuno bod y ffurfweddiad yn normal, yna bydd y apply_config.

Hefyd mae gan rolau ddull stop, sydd ei angen i lanhau allbwn y rôl. Os dywedwn nad oes angen amserlennydd ar y gweinydd hwn mwyach, gall atal y ffibrau hynny y dechreuodd gyda nhw init.

Gall rolau ryngweithio â'i gilydd. Rydym wedi arfer ysgrifennu galwadau ffwythiant yn Lua, ond gall ddigwydd nad oes gan broses benodol y rôl sydd ei hangen arnom. Er mwyn hwyluso galwadau dros y rhwydwaith, rydym yn defnyddio'r modiwl ategol rpc (galwad gweithdrefn o bell), sydd wedi'i adeiladu ar sail y blwch rhwyd ​​safonol sydd wedi'i ymgorffori yn Tarantool. Gall hyn fod yn ddefnyddiol, er enghraifft, os yw eich porth am ofyn yn uniongyrchol i'r trefnydd wneud y gwaith ar hyn o bryd, yn hytrach nag aros diwrnod.

Pwynt pwysig arall yw sicrhau goddefgarwch bai. Mae Cartridge yn defnyddio'r protocol SWIM i fonitro iechyd [4]. Yn fyr, mae prosesau'n cyfnewid “sïon” â'i gilydd dros y CDU - mae pob proses yn dweud wrth ei chymdogion y newyddion diweddaraf, ac maen nhw'n ymateb. Os na ddaw'r ateb yn sydyn, mae Tarantool yn dechrau amau ​​​​bod rhywbeth o'i le, ac ar ôl ychydig mae'n adrodd marwolaeth ac yn dechrau dweud wrth bawb o gwmpas y newyddion hwn.

Cetris Tarantool: darnio backend Lua mewn tair llinell

Yn seiliedig ar y protocol hwn, mae Cartridge yn trefnu prosesu methiant awtomatig. Mae pob proses yn monitro ei hamgylchedd, ac os yw'r arweinydd yn rhoi'r gorau i ymateb yn sydyn, gall y replica gymryd drosodd ei rôl, ac mae Cartridge yn ffurfweddu'r rolau rhedeg yn unol â hynny.

Cetris Tarantool: darnio backend Lua mewn tair llinell

Mae angen i chi fod yn ofalus yma, oherwydd gall newid yn aml yn ôl ac ymlaen arwain at wrthdaro data wrth ddyblygu. Wrth gwrs, ni ddylech alluogi methiant awtomatig ar hap. Rhaid inni ddeall yn glir beth sy'n digwydd a bod yn siŵr na fydd atgynhyrchu yn torri ar ôl i'r arweinydd gael ei adfer a bod y goron yn cael ei dychwelyd iddo.

O hyn i gyd, efallai y cewch chi'r teimlad bod rolau yn debyg i ficrowasanaethau. Mewn ffordd, dyna'n union ydyn nhw, dim ond fel modiwlau y tu mewn i brosesau Tarantool. Ond mae yna hefyd nifer o wahaniaethau sylfaenol. Yn gyntaf, rhaid i bob rôl prosiect fyw yn yr un sylfaen cod. A dylid lansio holl brosesau Tarantool o'r un sylfaen cod, fel nad oes unrhyw bethau annisgwyl fel y rhai pan geisiwn gychwyn y rhaglennydd, ond yn syml nid yw'n bodoli. Hefyd, ni ddylech ganiatáu gwahaniaethau mewn fersiynau cod, oherwydd mae ymddygiad y system mewn sefyllfa o'r fath yn anodd iawn ei ragweld a'i ddadfygio.

Yn wahanol i Docker, ni allwn gymryd rôl "delwedd", mynd ag ef i beiriant arall a'i redeg yno. Nid yw ein rolau mor ynysig â chynwysyddion Docker. Hefyd, ni allwn redeg dwy rôl union yr un fath ar un achos. Mae rôl naill ai'n bodoli neu ddim; mewn un ystyr, sengl ydyw. Ac yn drydydd, rhaid i'r rolau fod yr un peth o fewn y grŵp atgynhyrchu cyfan, oherwydd fel arall byddai'n hurt - mae'r data yr un peth, ond mae'r ffurfweddiad yn wahanol.

Offer lleoli

Addewais ddangos sut mae Cartridge yn helpu i ddefnyddio cymwysiadau. I wneud bywyd yn haws i eraill, mae'r fframwaith yn pecynnu pecynnau RPM:

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

Mae'r pecyn wedi'i osod yn cynnwys bron popeth sydd ei angen arnoch: y cais a'r dibyniaethau gosod. Bydd Tarantool hefyd yn cyrraedd y gweinydd fel dibyniaeth ar y pecyn RPM, ac mae ein gwasanaeth yn barod i'w lansio. Gwneir hyn trwy systemd, ond yn gyntaf mae angen i chi ysgrifennu ychydig o gyfluniad. Ar y lleiaf, nodwch URI pob proses. Mae tri yn ddigon er enghraifft.

$ 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

Mae naws ddiddorol yma. Yn hytrach na nodi'r porthladd protocol deuaidd yn unig, rydym yn nodi cyfeiriad cyhoeddus cyfan y broses gan gynnwys yr enw gwesteiwr. Mae hyn yn angenrheidiol fel bod nodau'r clwstwr yn gwybod sut i gysylltu â'i gilydd. Mae'n syniad drwg defnyddio 0.0.0.0 fel y cyfeiriad advertise_uri; dylai fod yn gyfeiriad IP allanol, nid rhwymiad soced. Hebddo, ni fydd unrhyw beth yn gweithio, felly ni fydd Cartridge yn gadael ichi lansio nod gyda'r hysbyseb_uri anghywir.

Nawr bod y cyfluniad yn barod, gallwch chi gychwyn y prosesau. Gan nad yw uned systemd reolaidd yn caniatáu i fwy nag un broses gychwyn, mae cymwysiadau ar y Cetris yn cael eu gosod gan yr hyn a elwir. unedau ar unwaith sy'n gweithio fel hyn:

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

Yn y ffurfweddiad, fe wnaethom nodi'r porthladd HTTP y mae Cartridge yn gwasanaethu'r rhyngwyneb gwe - 8080 arno. Gadewch i ni fynd ato ac edrych arno:

Cetris Tarantool: darnio backend Lua mewn tair llinell

Gwelwn, er bod y prosesau'n rhedeg, nad ydynt wedi'u ffurfweddu eto. Nid yw'r cetris yn gwybod eto pwy ddylai ddyblygu gyda phwy ac ni all wneud penderfyniad ar ei ben ei hun, felly mae'n aros am ein gweithredoedd. Ond nid oes gennym lawer o ddewis: mae bywyd clwstwr newydd yn dechrau gyda chyfluniad y nod cyntaf. Yna byddwn yn ychwanegu'r lleill at y clwstwr, yn neilltuo rolau iddynt, ac ar y pwynt hwn gellir ystyried bod y lleoliad wedi'i gwblhau'n llwyddiannus.

Gadewch i ni arllwys gwydraid o'ch hoff ddiod ac ymlacio ar ôl wythnos waith hir. Gellir defnyddio'r cais.

Cetris Tarantool: darnio backend Lua mewn tair llinell

Canlyniadau

Beth yw'r canlyniadau? Rhowch gynnig arni, defnyddiwch ef, gadewch adborth, crëwch docynnau ar Github.

cyfeiriadau

[1] Tarantool » 2.2 » Cyfeirnod » Cyfeirnod creigiau » Modiwl vshard

[2] Sut y gwnaethom weithredu craidd busnes buddsoddi Alfa-Bank yn seiliedig ar Tarantool

[3] Pensaernïaeth bilio cenhedlaeth newydd: trawsnewid gyda'r newid i Tarantool

[4] NOFIO - protocol adeiladu clwstwr

[5] GitHub - tarantool/cetris-cli

[6] GitHub - tarantool/cetris

Ffynhonnell: hab.com

Ychwanegu sylw