Tarantool Cartridge: kugawanya sehemu ya nyuma ya Lua katika mistari mitatu

Tarantool Cartridge: kugawanya sehemu ya nyuma ya Lua katika mistari mitatu

Katika Mail.ru Group tuna Tarantool - hii ni seva ya maombi katika Lua, ambayo pia mara mbili kama hifadhidata (au kinyume chake?). Ni haraka na baridi, lakini uwezo wa seva moja bado hauna kikomo. Kuongeza wima pia sio tiba, kwa hivyo Tarantool ina zana za kuongeza usawa - moduli ya vshard. [1]. Inakuruhusu kugawanya data kwenye seva kadhaa, lakini lazima ucheze nayo ili kuiweka na kuambatisha mantiki ya biashara.

Habari njema: tumekusanya picha kubwa (km [2], [3]) na kuunda mfumo mwingine ambao utarahisisha kwa kiasi kikubwa suluhisho la tatizo hili.

Cartridge ya Tarantool ni mfumo mpya wa kutengeneza mifumo changamano iliyosambazwa. Inakuwezesha kuzingatia kuandika mantiki ya biashara badala ya kutatua matatizo ya miundombinu. Chini ya kata nitakuambia jinsi mfumo huu unavyofanya kazi na jinsi ya kuandika huduma zilizosambazwa kwa kutumia.

Tatizo ni nini hasa?

Tuna tarantula, tuna vshard - ni nini kingine unachotaka?

Kwanza, ni suala la urahisi. Usanidi wa vshard umesanidiwa kupitia majedwali ya Lua. Ili mfumo uliosambazwa wa michakato mingi ya Tarantool ufanye kazi kwa usahihi, usanidi lazima uwe sawa kila mahali. Hakuna mtu anataka kufanya hivi mwenyewe. Kwa hiyo, kila aina ya maandiko, Ansible, na mifumo ya kupeleka hutumiwa.

Cartridge yenyewe inasimamia usanidi wa vshard, hufanya hivi kulingana na yake usanidi uliosambazwa mwenyewe. Kimsingi ni faili rahisi ya YAML, ambayo nakala yake huhifadhiwa katika kila tukio la Tarantool. Urahisishaji ni kwamba mfumo yenyewe hufuatilia usanidi wake na kuhakikisha kuwa ni sawa kila mahali.

Pili, ni suala la urahisi tena. Usanidi wa vshard hauhusiani na ukuzaji wa mantiki ya biashara na huvuruga tu programu kutoka kwa kazi yake. Tunapojadili usanifu wa mradi, mara nyingi tunazungumza juu ya vifaa vya mtu binafsi na mwingiliano wao. Ni mapema sana kufikiria kusambaza nguzo kwa vituo 3 vya data.

Tulitatua matatizo haya tena na tena, na wakati fulani tulifaulu kubuni mbinu iliyorahisisha kufanya kazi na programu katika kipindi chake chote cha maisha: uundaji, ukuzaji, majaribio, CI/CD, matengenezo.

Cartridge inatanguliza dhana ya jukumu kwa kila mchakato wa Tarantool. Majukumu ni dhana inayomruhusu msanidi programu kuzingatia uandishi wa msimbo. Majukumu yote yanayopatikana katika mradi yanaweza kuendeshwa kwa mfano mmoja wa Tarantool, na hii itatosha kwa majaribio.

Vipengele muhimu vya Cartridge ya Tarantool:

  • ochestration ya nguzo otomatiki;
  • kupanua utendaji wa programu kwa kutumia majukumu mapya;
  • template ya maombi kwa ajili ya maendeleo na kupelekwa;
  • kujengwa katika sharding moja kwa moja;
  • kuunganishwa na mfumo wa upimaji wa Luatest;
  • usimamizi wa nguzo kwa kutumia WebUI na API;
  • zana za ufungaji na kupeleka.

Salamu, Dunia!

Siwezi kusubiri kuonyesha mfumo yenyewe, kwa hiyo tutaacha hadithi kuhusu usanifu baadaye na kuanza na kitu rahisi. Ikiwa tunadhania kwamba Tarantool yenyewe tayari imewekwa, basi yote iliyobaki ni kufanya

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

Amri hizi mbili zitasakinisha huduma za mstari wa amri na kukuruhusu kuunda programu yako ya kwanza kutoka kwa kiolezo:

$ cartridge create --name myapp

Na hii ndio tunayopata:

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/

Hili ni hazina ya git iliyo na "Hujambo, Ulimwengu" iliyotengenezwa tayari! maombi. Wacha tujaribu kuiendesha mara moja, tukiwa tumeweka utegemezi hapo awali (pamoja na mfumo yenyewe):

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

Kwa hivyo, tuna nodi moja inayoendesha programu ya baadaye iliyoshirikiwa. Mlei anayedadisi anaweza kufungua kiolesura cha wavuti mara moja, kusanidi kikundi cha nodi moja na panya na kufurahia matokeo, lakini ni mapema sana kufurahiya. Hadi sasa, programu haiwezi kufanya chochote muhimu, kwa hiyo nitakuambia kuhusu kupelekwa baadaye, lakini sasa ni wakati wa kuandika msimbo.

Maendeleo ya Maombi

Hebu fikiria, tunabuni mradi ambao lazima upokee data, uihifadhi na utengeneze ripoti mara moja kwa siku.

Tarantool Cartridge: kugawanya sehemu ya nyuma ya Lua katika mistari mitatu

Tunaanza kuchora mchoro na kuweka vipengele vitatu juu yake: lango, uhifadhi na mpangilio. Tunafanya kazi kwenye usanifu zaidi. Kwa kuwa tunatumia vshard kama hifadhi, tunaongeza vshard-router na vshard-storage kwenye mpango. Wala lango au kipanga ratiba kitafikia moja kwa moja uhifadhi; ndivyo kipanga njia kinavyotumika, ndivyo kiliundwa.

Tarantool Cartridge: kugawanya sehemu ya nyuma ya Lua katika mistari mitatu

Mchoro huu bado hauwakilishi kile ambacho tutakuwa tukijenga katika mradi kwa sababu vipengele vinaonekana kuwa vya kufikirika. Bado tunahitaji kuona jinsi hii itaonyeshwa kwenye Tarantool halisi - hebu tupange vipengele vyetu kwa mchakato.

Tarantool Cartridge: kugawanya sehemu ya nyuma ya Lua katika mistari mitatu

Kuna umuhimu mdogo katika kuweka vshard-router na lango kwenye matukio tofauti. Kwa nini tunahitaji kuvinjari mtandao tena ikiwa hii tayari ni jukumu la kipanga njia? Lazima ziendeshwe ndani ya mchakato sawa. Hiyo ni, lango na vshard.router.cfg huanzishwa katika mchakato mmoja, na kuziruhusu kuingiliana ndani ya nchi.

Katika hatua ya kubuni, ilikuwa rahisi kufanya kazi na vipengele vitatu, lakini mimi, kama msanidi programu, wakati wa kuandika kanuni, sitaki kufikiria kuzindua matukio matatu ya Tarnatool. Ninahitaji kufanya majaribio na angalia kuwa niliandika lango kwa usahihi. Au labda nataka kuonyesha kipengele kwa wenzangu. Kwa nini nipitie shida ya kupeleka nakala tatu? Hivi ndivyo dhana ya majukumu ilivyozaliwa. Jukumu ni moduli ya kawaida ya luash ambayo mzunguko wa maisha unasimamiwa na Cartridge. Katika mfano huu kuna nne kati yao - lango, router, uhifadhi, mpangilio. Kunaweza kuwa na zaidi katika mradi mwingine. Majukumu yote yanaweza kuendeshwa katika mchakato mmoja, na hii itakuwa ya kutosha.

Tarantool Cartridge: kugawanya sehemu ya nyuma ya Lua katika mistari mitatu

Na linapokuja suala la kupelekwa kwa utengenezaji au utengenezaji, basi tutagawa kila mchakato wa Tarantool seti yake ya majukumu kulingana na uwezo wa vifaa:

Tarantool Cartridge: kugawanya sehemu ya nyuma ya Lua katika mistari mitatu

Usimamizi wa Topolojia

Taarifa kuhusu ni wapi majukumu yanaendeshwa lazima ihifadhiwe mahali fulani. Na hii "mahali fulani" ni usanidi uliosambazwa, ambao tayari nimetaja hapo juu. Jambo muhimu zaidi juu yake ni topolojia ya nguzo. Hapa kuna vikundi 3 vya urudufishaji wa michakato 5 ya Tarantool:

Tarantool Cartridge: kugawanya sehemu ya nyuma ya Lua katika mistari mitatu

Hatutaki kupoteza data, kwa hivyo tunashughulikia maelezo kuhusu kuendesha michakato kwa uangalifu. Cartridge hufuatilia usanidi kwa kutumia ahadi ya awamu mbili. Tunapotaka kusasisha usanidi, kwanza hukagua kuwa hali zote zinapatikana na tayari kukubali usanidi mpya. Baada ya hayo, awamu ya pili inatumika usanidi. Kwa hivyo, hata nakala moja ikionekana kuwa haipatikani kwa muda, hakuna kitu kibaya kitatokea. Usanidi hautatumika tu na utaona hitilafu mapema.

Pia katika sehemu ya topolojia, kigezo muhimu kama kiongozi wa kila kikundi cha urudufishaji kinaonyeshwa. Kawaida hii ndiyo nakala inayorekodiwa. Zingine mara nyingi ni za kusoma tu, ingawa kunaweza kuwa na vighairi. Wakati mwingine watengenezaji jasiri hawana hofu ya migogoro na wanaweza kuandika data kwa replicas kadhaa kwa sambamba, lakini kuna baadhi ya shughuli ambazo, bila kujali, hazipaswi kufanywa mara mbili. Kwa hili kuna ishara ya kiongozi.

Tarantool Cartridge: kugawanya sehemu ya nyuma ya Lua katika mistari mitatu

Maisha ya majukumu

Ili jukumu la dhahania liwepo katika usanifu kama huo, mfumo lazima uudhibiti kwa njia fulani. Kwa kawaida, udhibiti hutokea bila kuanzisha upya mchakato wa Tarantool. Kuna simu 4 za kudhibiti majukumu. Cartridge yenyewe itawaita kulingana na kile kilichoandikwa katika usanidi wake uliosambazwa, na hivyo kutumia usanidi kwa majukumu maalum.

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

Kila jukumu lina kazi init. Inaitwa mara moja ama wakati jukumu limewezeshwa au wakati Tarantool imeanzishwa upya. Inafaa hapo, kwa mfano, kuanzisha box.space.create, au kipanga ratiba kinaweza kuzindua nyuzinyuzi za usuli ambazo zitafanya kazi kwa vipindi fulani vya wakati.

Kazi moja init inaweza isitoshe. Cartridge huruhusu majukumu kuchukua fursa ya usanidi uliosambazwa unaotumia kuhifadhi topolojia. Tunaweza kutangaza sehemu mpya katika usanidi sawa na kuhifadhi kipande cha usanidi wa biashara ndani yake. Katika mfano wangu, hii inaweza kuwa schema ya data au mipangilio ya ratiba ya jukumu la mpangaji.

Simu za nguzo validate_config и apply_config kila wakati usanidi uliosambazwa unabadilika. Wakati usanidi unatumiwa na ahadi ya awamu mbili, nguzo hukagua kuwa kila jukumu liko tayari kukubali usanidi huu mpya na, ikiwa ni lazima, huripoti kosa kwa mtumiaji. Wakati kila mtu anakubali kwamba usanidi ni wa kawaida, basi apply_config.

Pia majukumu yana mbinu stop, ambayo inahitajika ili kusafisha matokeo ya jukumu. Tukisema kwamba kipanga ratiba hakihitajiki tena kwenye seva hii, kinaweza kusimamisha nyuzi ambazo kilianza nazo init.

Majukumu yanaweza kuingiliana. Tumezoea kuandika simu za kukokotoa katika Lua, lakini inaweza kutokea kwamba mchakato fulani hauna jukumu tunalohitaji. Ili kuwezesha simu kupitia mtandao, tunatumia rpc (simu ya utaratibu wa mbali) moduli msaidizi, ambayo imejengwa kwa misingi ya netbox ya kawaida iliyojengwa kwenye Tarantool. Hii inaweza kuwa na manufaa ikiwa, kwa mfano, lango lako linataka kumwomba kipanga ratiba moja kwa moja kufanya kazi hiyo sasa hivi, badala ya kusubiri siku moja.

Jambo lingine muhimu ni kuhakikisha uvumilivu wa makosa. Cartridge hutumia itifaki ya SWIM kufuatilia afya [4]. Kwa kifupi, michakato hubadilishana "uvumi" wao kwa wao juu ya UDP-kila mchakato huambia majirani wake habari za hivi punde, nao hujibu. Ikiwa ghafla jibu halijatokea, Tarantool huanza kushuku kitu kibaya, na baada ya muda inasoma kifo na huanza kuwaambia kila mtu karibu na habari hii.

Tarantool Cartridge: kugawanya sehemu ya nyuma ya Lua katika mistari mitatu

Kulingana na itifaki hii, Cartridge hupanga usindikaji wa kushindwa kiotomatiki. Kila mchakato hufuatilia mazingira yake, na ikiwa kiongozi ataacha kujibu ghafla, replica inaweza kuchukua jukumu lake, na Cartridge husanidi majukumu yanayoendeshwa ipasavyo.

Tarantool Cartridge: kugawanya sehemu ya nyuma ya Lua katika mistari mitatu

Unahitaji kuwa mwangalifu hapa, kwa sababu kubadili mara kwa mara na kurudi kunaweza kusababisha migogoro ya data wakati wa urudufishaji. Bila shaka, hupaswi kuwezesha kushindwa kiotomatiki bila mpangilio. Lazima tuelewe wazi kile kinachotokea na kuwa na uhakika kwamba replication haitavunjika baada ya kiongozi kurejeshwa na taji kurejeshwa kwake.

Kutoka kwa haya yote, unaweza kupata hisia kwamba majukumu ni sawa na huduma ndogo. Kwa maana, ni hivyo tu, kama moduli ndani ya michakato ya Tarantool. Lakini pia kuna idadi ya tofauti za kimsingi. Kwanza, majukumu yote ya mradi lazima yaishi katika msingi sawa wa msimbo. Na michakato yote ya Tarantool inapaswa kuzinduliwa kutoka kwa msingi sawa wa nambari, ili hakuna mshangao kama ule tunapojaribu kuanzisha kipanga ratiba, lakini haipo. Pia, hupaswi kuruhusu tofauti katika matoleo ya kanuni, kwa sababu tabia ya mfumo katika hali hiyo ni vigumu sana kutabiri na kurekebisha.

Tofauti na Docker, hatuwezi kuchukua jukumu la "picha", ipeleke kwa mashine nyingine na kuiendesha hapo. Majukumu yetu hayajatengwa kama vyombo vya Docker. Pia, hatuwezi kutekeleza majukumu mawili yanayofanana kwa mfano mmoja. Jukumu lipo au halipo; kwa maana fulani, ni singleton. Na tatu, majukumu lazima yawe sawa ndani ya kikundi kizima cha replication, kwa sababu vinginevyo itakuwa ni upuuzi - data ni sawa, lakini usanidi ni tofauti.

Zana za kupeleka

Niliahidi kuonyesha jinsi Cartridge inavyosaidia kupeleka maombi. Ili kurahisisha maisha kwa wengine, mfumo hufunga vifurushi vya RPM:

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

Kifurushi kilichosanikishwa kina karibu kila kitu unachohitaji: programu tumizi na vitegemezi vilivyosakinishwa. Tarantool pia itawasili kwenye seva kama tegemezi la kifurushi cha RPM, na huduma yetu iko tayari kuzinduliwa. Hii inafanywa kupitia systemd, lakini kwanza unahitaji kuandika usanidi kidogo. Kwa uchache, taja URI ya kila mchakato. Tatu inatosha kwa mfano.

$ 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

Kuna nuance ya kuvutia hapa. Badala ya kubainisha lango la itifaki ya binary, tunabainisha anwani nzima ya umma ya mchakato huo ikijumuisha jina la mpangishaji. Hii ni muhimu ili nodi za nguzo zijue jinsi ya kuunganishwa kwa kila mmoja. Ni wazo mbaya kutumia 0.0.0.0 kama anwani ya advertise_uri; inapaswa kuwa anwani ya IP ya nje, sio soketi. Bila hivyo, hakuna kitakachofanya kazi, kwa hivyo Cartridge haitakuruhusu kuzindua nodi na utangazaji_uri mbaya.

Sasa kwa kuwa usanidi uko tayari, unaweza kuanza michakato. Kwa kuwa kitengo cha kawaida cha mfumo hairuhusu mchakato zaidi ya mmoja kuanza, programu kwenye Cartridge zimewekwa na kinachojulikana. vitengo vya papo hapo vinavyofanya kazi kama hii:

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

Katika usanidi, tulibainisha mlango wa HTTP ambao Cartridge hutumikia kiolesura cha wavuti - 8080. Hebu tuende kwake na tuangalie:

Tarantool Cartridge: kugawanya sehemu ya nyuma ya Lua katika mistari mitatu

Tunaona kwamba ingawa michakato inaendelea, bado haijasanidiwa. Cartridge bado haijui ni nani anayepaswa kuiga na nani na hawezi kufanya uamuzi peke yake, kwa hiyo inasubiri matendo yetu. Lakini hatuna chaguo nyingi: maisha ya kikundi kipya huanza na usanidi wa node ya kwanza. Kisha tutawaongeza wengine kwenye kikundi, kuwapa majukumu, na kwa wakati huu uwekaji unaweza kuchukuliwa kuwa umekamilika kwa ufanisi.

Hebu tumimine glasi ya kinywaji chako unachopenda na kupumzika baada ya wiki ndefu ya kazi. maombi inaweza kutumika.

Tarantool Cartridge: kugawanya sehemu ya nyuma ya Lua katika mistari mitatu

Matokeo ya

Matokeo ni nini? Ijaribu, itumie, acha maoni, unda tikiti kwenye Github.

marejeo

[1] Tarantool » 2.2 » Rejea » Rejeleo la miamba » Moduli vshard

[2] Jinsi tulivyotekeleza msingi wa biashara ya uwekezaji ya Alfa-Bank kulingana na Tarantool

[3] Usanifu wa utozaji wa kizazi kipya: mabadiliko na mpito hadi Tarantool

[4] SWIM - itifaki ya ujenzi wa nguzo

[5] GitHub - tarantool/cartridge-cli

[6] GitHub - tarantool / cartridge

Chanzo: mapenzi.com

Kuongeza maoni