Tarantool Cartridge: sharding sa usa ka Lua backend sa tulo ka linya

Tarantool Cartridge: sharding sa usa ka Lua backend sa tulo ka linya

Sa Mail.ru Group kami adunay Tarantool - kini usa ka server sa aplikasyon sa Lua, nga nagdoble usab ingon usa ka database (o vice versa?). Kini paspas ug bugnaw, apan ang mga kapabilidad sa usa ka server dili gihapon limitado. Vertical scaling dili usab usa ka panacea, mao nga ang Tarantool adunay mga himan alang sa horizontal scaling - ang vshard module [1]. Gitugotan ka niini nga mag-shard sa mga datos sa daghang mga server, apan kinahanglan nimo nga i-tinker kini aron ma-set up kini ug ilakip ang lohika sa negosyo.

Maayong balita: nakakolekta kami pipila ka dagkong mga shot (eg [2], [3]) ug naghimo ug laing gambalay nga makapasayon ​​pag-ayo sa solusyon niini nga problema.

Tarantool Cartridge mao ang usa ka bag-o nga gambalay alang sa pagpalambo sa komplikado apod-apod nga mga sistema. Gitugotan ka niini nga mag-focus sa pagsulat sa lohika sa negosyo imbes nga masulbad ang mga problema sa imprastraktura. Ubos sa cut isulti ko kanimo kung giunsa kini nga balangkas ug kung giunsa pagsulat ang mga gipang-apod-apod nga serbisyo gamit kini.

Unsa man gyud ang problema?

Kami adunay tarantula, kami adunay vshard - unsa pa ang gusto nimo?

Una, kini usa ka butang sa kasayon. Ang vshard configuration gi-configure pinaagi sa Lua tables. Aron ang usa ka gipang-apod-apod nga sistema sa daghang mga proseso sa Tarantool aron molihok sa husto, ang pag-configure kinahanglan parehas bisan diin. Walay usa nga gustong mobuhat niini nga mano-mano. Busa, ang tanang matang sa mga script, Ansible, ug mga sistema sa pag-deploy gigamit.

Ang Cartridge mismo ang nagdumala sa vshard configuration, gibuhat kini base sa iyang kaugalingong distributed configuration. Kini usa ka yano nga YAML file, usa ka kopya nga gitipigan sa matag pananglitan sa Tarantool. Ang pagpayano mao nga ang balangkas mismo nag-monitor sa pag-configure niini ug nagsiguro nga parehas kini bisan diin.

Ikaduha, kini pag-usab sa usa ka butang sa kasayon. Ang configuration sa vshard walay labut sa pagpalambo sa lohika sa negosyo ug makabalda lamang sa programmer gikan sa iyang trabaho. Kung hisgutan namon ang arkitektura sa usa ka proyekto, kanunay namon nga hisgutan ang bahin sa indibidwal nga mga sangkap ug ang ilang interaksyon. Sayo pa kaayo nga maghunahuna bahin sa paglansad sa usa ka kumpol sa 3 nga mga sentro sa datos.

Gisulbad namo kini nga mga problema balik-balik, ug sa usa ka punto nakahimo kami sa pagpalambo sa usa ka pamaagi nga gipasimple sa pagtrabaho uban sa aplikasyon sa tibuok nga siklo sa kinabuhi niini: paglalang, pagpalambo, pagsulay, CI/CD, pagmentinar.

Gipaila sa Cartridge ang konsepto sa usa ka papel alang sa matag proseso sa Tarantool. Ang mga tahas usa ka konsepto nga nagtugot sa usa ka developer nga mag-focus sa pagsulat sa code. Ang tanan nga mga tahas nga magamit sa proyekto mahimong ipadagan sa usa ka pananglitan sa Tarantool, ug kini igo na alang sa mga pagsulay.

Panguna nga mga bahin sa Tarantool Cartridge:

  • automated cluster orkestra;
  • pagpalapad sa pagpaandar sa aplikasyon gamit ang bag-ong mga tahas;
  • template sa aplikasyon alang sa pagpalambo ug pag-deploy;
  • built-in nga awtomatikong sharding;
  • paghiusa sa balangkas sa pagsulay sa Luatest;
  • pagdumala sa cluster gamit ang WebUI ug API;
  • packaging ug deployment himan.

Hello, Kalibutan!

Dili ko makahulat nga ipakita ang balangkas mismo, mao nga biyaan namon ang istorya bahin sa arkitektura sa ulahi ug magsugod sa usa ka butang nga yano. Kung atong hunahunaon nga ang Tarantool mismo na-install na, nan ang nahabilin mao ang buhaton

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

Kining duha ka mga sugo mag-instalar sa command line utilities ug motugot kanimo sa paghimo sa imong unang aplikasyon gikan sa template:

$ cartridge create --name myapp

Ug kini ang atong makuha:

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/

Kini usa ka git repository nga adunay andam nga "Hello, World!" aplikasyon. Atong sulayan ang pagpadagan niini dayon, nga na-install na kaniadto ang mga dependency (lakip ang balangkas mismo):

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

Busa, kami adunay usa ka node nga nagdagan alang sa umaabot nga sharded nga aplikasyon. Ang usa ka mausisaon nga layko mahimo dayon nga mag-abli sa web interface, mag-configure sa usa ka pungpong sa usa ka node gamit ang mouse ug malingaw sa resulta, apan sayo pa kaayo aron magmaya. Sa pagkakaron, ang aplikasyon dili makahimo sa bisan unsa nga mapuslanon, mao nga ako mosulti kanimo mahitungod sa pag-deploy sa ulahi, apan karon panahon na sa pagsulat sa code.

Pagpalambo sa Aplikasyon

Hunahunaa lang, nagdesinyo kami usa ka proyekto nga kinahanglan makadawat mga datos, i-save kini ug maghimo usa ka taho kausa sa usa ka adlaw.

Tarantool Cartridge: sharding sa usa ka Lua backend sa tulo ka linya

Nagsugod kami sa pagdrowing og usa ka diagram ug gibutang ang tulo ka mga sangkap niini: gateway, storage ug scheduler. Nagtrabaho pa kami sa arkitektura. Tungod kay gigamit namon ang vshard ingon pagtipig, gidugang namon ang vshard-router ug vshard-storage sa laraw. Ni ang gateway o ang scheduler direktang maka-access sa storage; mao kana ang para sa router, mao kana ang gibuhat niini.

Tarantool Cartridge: sharding sa usa ka Lua backend sa tulo ka linya

Kini nga diagram dili gihapon eksakto nga nagrepresentar kung unsa ang atong pagatukoron sa proyekto tungod kay ang mga sangkap tan-awon nga abstract. Kinahanglan pa naton tan-awon kung giunsa kini iplano sa tinuud nga Tarantool - igrupo naton ang among mga sangkap pinaagi sa proseso.

Tarantool Cartridge: sharding sa usa ka Lua backend sa tulo ka linya

Adunay gamay nga punto sa pagpadayon sa vshard-router ug gateway sa lahi nga mga higayon. Ngano nga kinahanglan naton nga mag-surf sa network pag-usab kung kini na ang responsibilidad sa router? Kinahanglang ipadagan sila sulod sa samang proseso. Sa ato pa, ang gateway ug vshard.router.cfg gisugdan sa usa ka proseso, ug tugoti sila nga makig-interact sa lokal.

Sa yugto sa disenyo, sayon ​​​​ang pagtrabaho sa tulo ka mga sangkap, apan ako, isip usa ka developer, samtang nagsulat sa code, dili gusto nga maghunahuna mahitungod sa paglansad sa tulo ka mga higayon sa Tarnatool. Kinahanglan ko nga modagan sa mga pagsulay ug susihon kung husto ba ang akong pagsulat sa gateway. O tingali gusto nakong ipakita ang usa ka bahin sa akong mga kauban. Nganong maglisod man ko sa pag-deploy ug tulo ka kopya? Ingon niini ang pagkahimugso sa konsepto sa mga papel. Ang usa ka tahas usa ka regular nga modulo nga luash kansang siklo sa kinabuhi gidumala sa Cartridge. Niini nga pananglitan adunay upat niini - gateway, router, storage, scheduler. Mahimong daghan pa sa laing proyekto. Ang tanan nga mga tahas mahimong dagan sa usa ka proseso, ug kini igo na.

Tarantool Cartridge: sharding sa usa ka Lua backend sa tulo ka linya

Ug kung bahin sa pag-deploy sa dula o produksiyon, unya among i-assign ang matag proseso sa Tarantool sa kaugalingon nga set sa mga tahas depende sa mga kapabilidad sa hardware:

Tarantool Cartridge: sharding sa usa ka Lua backend sa tulo ka linya

Pagdumala sa Topology

Ang impormasyon bahin sa kung asa nga mga tahas nagdagan kinahanglan nga tipigan bisan asa. Ug kini nga "sa usa ka dapit" mao ang gipang-apod-apod nga pagsumpo, nga akong nahisgutan sa ibabaw. Ang labing importante nga butang mahitungod niini mao ang cluster topology. Ania ang 3 ka grupo sa pagkopya sa 5 ka proseso sa Tarantool:

Tarantool Cartridge: sharding sa usa ka Lua backend sa tulo ka linya

Dili namo gusto nga mawad-an og data, mao nga among gitagad ang impormasyon bahin sa mga proseso sa pagpadagan uban ang pag-amping. Gisubay sa Cartridge ang configuration gamit ang two-phase commit. Sa higayon nga gusto namong i-update ang configuration, kini una nga magsusi nga ang tanan nga mga higayon anaa ug andam sa pagdawat sa bag-ong configuration. Pagkahuman niini, ang ikaduhang hugna magamit ang config. Busa, bisan kung ang usa ka kopya mahimong temporaryo nga dili magamit, wala’y daotan nga mahitabo. Ang pag-configure dili lang magamit ug makakita ka og sayup nga daan.

Usab sa seksyon sa topology, ang usa ka hinungdanon nga parameter sama sa lider sa matag grupo sa pagkopya gipakita. Kasagaran kini ang kopya nga girekord. Ang uban kay kasagarang read-only, bisag adunay mga eksepsiyon. Usahay ang maisog nga mga developer dili mahadlok sa mga panagbangi ug makasulat sa mga datos sa daghang mga replika nga managsama, apan adunay pipila nga mga operasyon nga, bisan unsa pa, dili kinahanglan himuon kaduha. Alang niini adunay timailhan sa usa ka lider.

Tarantool Cartridge: sharding sa usa ka Lua backend sa tulo ka linya

Kinabuhi sa mga papel

Alang sa usa ka abstract nga papel nga maglungtad sa ingon nga arkitektura, ang balangkas kinahanglan nga magdumala kanila bisan unsang paagi. Natural, ang kontrol mahitabo nga wala i-restart ang proseso sa Tarantool. Adunay 4 ka callback aron pagdumala sa mga tahas. Ang Cartridge mismo ang motawag kanila depende sa kung unsa ang nahisulat sa giapod-apod nga configuration niini, sa ingon gipadapat ang configuration sa piho nga mga tahas.

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

Ang matag papel adunay function init. Gitawag kini usa ka higayon kung ang papel gipagana o kung gi-restart ang Tarantool. Kombenyente didto, pananglitan, ang pag-initialize sa box.space.create, o ang scheduler mahimong maglunsad og pipila ka background fiber nga mohimo sa trabaho sa pipila ka mga agwat sa oras.

Usa ka function init mahimong dili igo. Gitugotan sa Cartridge ang mga tahas nga mapahimuslan ang gipang-apod-apod nga configuration nga gigamit niini sa pagtipig sa topology. Mahimo namon nga ipahayag ang usa ka bag-ong seksyon sa parehas nga pag-configure ug tipigan ang usa ka tipik sa configuration sa negosyo niini. Sa akong pananglitan, kini mahimo nga usa ka schema sa datos o mga setting sa iskedyul alang sa papel sa scheduler.

Cluster nga tawag validate_config и apply_config matag higayon nga mausab ang gipang-apod-apod nga configuration. Kung ang usa ka pagsumpo gipadapat sa usa ka duha ka hugna nga commit, ang cluster nagsusi nga ang matag tahas andam nga modawat niining bag-ong configuration ug, kung gikinahanglan, magreport sa usa ka sayup sa user. Sa diha nga ang tanan mouyon nga ang configuration mao ang normal, unya ang apply_config.

Usab ang mga papel adunay pamaagi stop, nga gikinahanglan aron malimpyohan ang output sa papel. Kung giingon namon nga dili na kinahanglan ang scheduler sa kini nga server, mahimo’g mapahunong ang mga lanot nga gisugdan niini init.

Ang mga tahas mahimong makig-uban sa usag usa. Naanad kami sa pagsulat sa mga tawag sa function sa Lua, apan mahimo’g mahitabo nga ang gihatag nga proseso wala’y papel nga among gikinahanglan. Aron mapadali ang mga tawag sa network, gigamit namo ang rpc (remote procedure call) auxiliary module, nga gitukod base sa standard netbox nga gitukod sa Tarantool. Mahimong mapuslanon kini kung, pananglitan, gusto sa imong gateway nga direktang hangyoon ang scheduler nga buhaton ang trabaho karon, kaysa maghulat usa ka adlaw.

Ang laing importante nga punto mao ang pagsiguro sa pagtugot sa sayup. Gigamit sa Cartridge ang SWIM protocol aron mamonitor ang kahimsog [4]. Sa laktod nga pagkasulti, ang mga proseso nagbinayloay og "mga hungihong" sa usag usa tungod sa UDP-matag proseso nagsulti sa mga silingan sa pinakabag-o nga balita, ug sila mitubag. Kung sa kalit ang tubag dili moabut, ang Tarantool nagsugod sa pagduda sa usa ka butang nga sayup, ug pagkahuman sa usa ka panahon kini nag-recite sa kamatayon ug nagsugod sa pagsulti sa tanan sa palibot niini nga balita.

Tarantool Cartridge: sharding sa usa ka Lua backend sa tulo ka linya

Pinasukad niini nga protocol, ang Cartridge nag-organisar sa awtomatikong pagproseso sa kapakyasan. Ang matag proseso nag-monitor sa palibot niini, ug kung ang lider kalit nga mohunong sa pagtubag, ang replika mahimong mopuli sa papel niini, ug ang Cartridge nag-configure sa mga nagdagan nga tahas sumala niana.

Tarantool Cartridge: sharding sa usa ka Lua backend sa tulo ka linya

Kinahanglan ka nga mag-amping dinhi, tungod kay ang kanunay nga pagbalhin-balhin mahimong mosangpot sa mga panagsumpaki sa datos sa panahon sa pagkopya. Siyempre, dili nimo kinahanglan nga i-enable ang awtomatikong failover nga random. Kinahanglan nga tin-aw natong masabtan kung unsa ang nahitabo ug siguroha nga ang pagkopya dili mabuak human ang pangulo mapasig-uli ug ang korona ibalik kaniya.

Gikan niining tanan, mahimo nimong mabati nga ang mga tahas parehas sa mga microservice. Sa usa ka diwa, sila ra, ingon nga mga module sa sulod sa mga proseso sa Tarantool. Apan adunay daghan usab nga sukaranan nga mga kalainan. Una, ang tanang tahas sa proyekto kinahanglang magpuyo sa samang code base. Ug ang tanan nga mga proseso sa Tarantool kinahanglan nga gilansad gikan sa parehas nga base sa code, aron wala’y mga sorpresa nga sama sa kung gisulayan namon nga sugdan ang scheduler, apan wala kini. Usab, dili nimo tugutan ang mga kalainan sa mga bersyon sa code, tungod kay ang pamatasan sa sistema sa ingon nga kahimtang lisud kaayo nga matagna ug i-debug.

Dili sama sa Docker, dili lang kita makahimo sa usa ka papel nga "imahe", dad-on kini sa laing makina ug ipadagan kini didto. Ang among mga tahas dili ingon ka bulag sama sa mga sudlanan sa Docker. Usab, dili kita makadagan sa duha ka managsama nga tahas sa usa ka higayon. Ang usa ka tahas anaa man o wala; sa usa ka diwa, kini usa ka singleton. Ug ikatulo, ang mga tahas kinahanglan parehas sa sulod sa tibuuk nga grupo sa pagkopya, tungod kay kung dili kini dili makatarunganon - parehas ang datos, apan lahi ang pagsumpo.

Mga gamit sa pag-deploy

Misaad ko nga ipakita kung giunsa pagtabang sa Cartridge ang pag-deploy sa mga aplikasyon. Aron mapasayon ​​ang kinabuhi sa uban, ang framework packages RPM packages:

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

Ang na-install nga pakete naglangkob sa halos tanan nga imong gikinahanglan: ang aplikasyon ug ang na-install nga mga dependency. Ang Tarantool moabot usab sa server isip dependency sa RPM package, ug ang among serbisyo andam na nga ilunsad. Gihimo kini pinaagi sa systemd, apan una kinahanglan nimo nga magsulat usa ka gamay nga pagsumpo. Sa labing gamay, ipiho ang URI sa matag proseso. Ang tulo igo na pananglitan.

$ 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

Adunay usa ka makapaikag nga nuance dinhi. Imbis nga ipiho ang binary protocol port, among gitino ang tibuuk nga adres sa publiko sa proseso lakip ang hostname. Kinahanglan kini aron ang mga cluster node mahibal-an kung unsaon pagkonektar sa usag usa. Dili maayo nga ideya nga gamiton ang 0.0.0.0 isip advertise_uri address; kini kinahanglan nga usa ka eksternal nga IP address, dili usa ka socket bind. Kung wala kini, wala’y molihok, busa dili ka tugutan sa Cartridge nga maglansad usa ka node nga adunay sayup nga advertise_uri.

Karon nga andam na ang pag-configure, mahimo nimong sugdan ang mga proseso. Tungod kay ang usa ka regular nga systemd unit dili motugot sa labaw pa sa usa ka proseso nga magsugod, ang mga aplikasyon sa Cartridge gi-install sa gitawag nga. instantiated nga mga yunit nga nagtrabaho sama niini:

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

Sa configuration, among gipiho ang HTTP port diin ang Cartridge nagsilbi sa web interface - 8080. Atong adtoon ug tan-awon:

Tarantool Cartridge: sharding sa usa ka Lua backend sa tulo ka linya

Nakita namon nga bisan kung nagdagan ang mga proseso, wala pa sila ma-configure. Ang cartridge wala pa mahibal-an kung kinsa ang kinahanglan nga magsundog kung kinsa ug dili makahimo sa usa ka desisyon sa iyang kaugalingon, mao nga naghulat kini sa among mga aksyon. Apan wala kami'y daghang kapilian: ang kinabuhi sa usa ka bag-ong cluster nagsugod sa pag-configure sa una nga node. Dayon atong idugang ang uban sa cluster, hatagan sila og mga tahas, ug niining puntoha ang deployment maisip nga malampusong nahuman.

Atong ibubo ang usa ka baso sa imong paborito nga ilimnon ug magpahayahay pagkahuman sa taas nga semana sa pagtrabaho. Ang aplikasyon mahimong magamit.

Tarantool Cartridge: sharding sa usa ka Lua backend sa tulo ka linya

Mga resulta

Unsa ang mga resulta? Sulayi kini, gamita kini, ibilin ang feedback, paghimo og mga tiket sa Github.

mga pakisayran

[1] Tarantool » 2.2 » Reperensya » Reperensya sa mga bato » Module vshard

[2] Giunsa namo pagpatuman ang kinauyokan sa negosyo sa pamuhunan sa Alfa-Bank base sa Tarantool

[3] Bag-ong henerasyon nga arkitektura sa pagsingil: pagbag-o sa pagbalhin sa Tarantool

[4] SWIM - protocol sa pagtukod sa cluster

[5] GitHub - tarantool/cartridge-cli

[6] GitHub - tarantool/cartridge

Source: www.habr.com

Idugang sa usa ka comment