Tarantool Cartridge: sharding yon backend Lua nan twa liy

Tarantool Cartridge: sharding yon backend Lua nan twa liy

Nan Mail.ru Group nou gen Tarantool - sa a se yon sèvè aplikasyon nan Lua, ki tou double kòm yon baz done (oswa vis vèrsa?). Li vit ak fre, men kapasite yo nan yon sèl sèvè yo toujou pa san limit. Dekale vètikal tou se pa yon Miracles, kidonk Tarantool gen zouti pou dekale orizontal - modil la vshard [1]. Li pèmèt ou shard done atravè plizyè serveurs, men ou gen brikolé ak li pou mete l' sou pye Et tache lojik biznis la.

Bon nouvèl: nou te kolekte kèk gwo vaksen (eg [2], [3]) ak kreye yon lòt kad ki pral siyifikativman senplifye solisyon an nan pwoblèm sa a.

Tarantool katouch se yon nouvo fondasyon pou devlope sistèm distribiye konplèks. Li pèmèt ou konsantre sou ekri lojik biznis olye pou yo rezoud pwoblèm enfrastrikti. Anba koupe a mwen pral di w kouman kad sa a travay ak ki jan yo ekri distribiye sèvis lè l sèvi avèk li.

Ki sa ki pwoblèm nan egzakteman?

Nou gen yon tarantula, nou gen vshard - kisa ou ka vle plis?

Premyèman, li se yon kesyon de konvenyans. Konfigirasyon vshard la configuré atravè tab Lua. Pou yon sistèm distribiye plizyè pwosesis Tarantool travay kòrèkteman, konfigirasyon an dwe menm tout kote. Pèsonn pa vle fè sa manyèlman. Se poutèt sa, tout kalite scripts, Ansible, ak sistèm deplwaman yo itilize.

Katouch tèt li jere konfigirasyon vshard la, li fè sa ki baze sou li yo pwòp konfigirasyon distribye. Li se esansyèlman yon senp dosye YAML, yon kopi ki estoke nan chak egzanp Tarantool. Senplifikasyon an se ke fondasyon an tèt li kontwole konfigirasyon li yo ak asire ke li se menm bagay la tou toupatou.

Dezyèmman, li se ankò yon kesyon de konvenyans. Konfigirasyon vshard la pa gen anyen fè ak devlopman nan lojik biznis ak sèlman distrè pwogramè a soti nan travay li. Lè nou diskite sou achitekti yon pwojè, nou pi souvan pale sou eleman endividyèl ak entèraksyon yo. Li twò bonè pou w reflechi sou woule yon gwoup nan 3 sant done.

Nou te rezoud pwoblèm sa yo anpil fwa, epi nan kèk pwen nou te rive devlope yon apwòch ki senplifye travay ak aplikasyon an pandan tout sik lavi li: kreyasyon, devlopman, tès, CI/CD, antretyen.

Katouch prezante konsèp nan yon wòl pou chak pwosesis Tarantool. Wòl yo se yon konsèp ki pèmèt yon pwomotè konsantre sou ekri kòd. Tout wòl ki disponib nan pwojè a ka kouri sou yon sèl egzanp Tarantool, epi sa a pral ase pou tès yo.

Karakteristik kle Tarantool Cartridge:

  • òkestrasyon gwoup otomatik;
  • agrandi fonksyonalite aplikasyon an lè l sèvi avèk nouvo wòl;
  • modèl aplikasyon pou devlopman ak deplwaman;
  • bati-an otomatik sharding;
  • entegrasyon ak fondasyon tès Luatest la;
  • jesyon gwoup lè l sèvi avèk WebUI ak API;
  • anbalaj ak zouti deplwaman.

Bonjou, Mondyal!

Mwen pa ka tann montre fondasyon an tèt li, kidonk nou pral kite istwa a sou achitekti a pou pita epi kòmanse ak yon bagay ki senp. Si nou sipoze ke Tarantool tèt li deja enstale, Lè sa a, tout sa ki rete se fè

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

De kòmandman sa yo pral enstale sèvis piblik liy kòmand yo epi pèmèt ou kreye premye aplikasyon w nan modèl la:

$ cartridge create --name myapp

Epi sa a se sa nou jwenn:

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/

Sa a se yon depo git ak yon pare-fè "Bonjou, Mondyal!" aplikasyon. Ann eseye kouri li touswit, ou te deja enstale depandans yo (ki gen ladan fondasyon an tèt li):

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

Se konsa, nou gen yon sèl ne kouri pou aplikasyon an sharded nan lavni. Yon pwofàn curieux ka imedyatman louvri koòdone entènèt la, konfigirasyon yon gwoup nan yon sèl ne ak sourit la epi jwi rezilta a, men li twò bonè pou rejwi. Jiskaprezan, aplikasyon an pa ka fè anyen itil, kidonk mwen pral di w sou deplwaman pita, men kounye a li lè yo ekri kòd.

Devlopman Aplikasyon

Jis imajine, nou ap desine yon pwojè ki dwe resevwa done, sove li epi bati yon rapò yon fwa pa jou.

Tarantool Cartridge: sharding yon backend Lua nan twa liy

Nou kòmanse trase yon dyagram epi mete twa eleman sou li: pòtay, depo ak orè. Nou ap travay sou achitekti a pi lwen. Depi nou itilize vshard kòm depo, nou ajoute vshard-routeur ak vshard-storage nan konplo a. Ni pòtay la, ni pwogramè a pral dirèkteman gen aksè nan depo a; se pou sa routeur la, se pou sa li te kreye.

Tarantool Cartridge: sharding yon backend Lua nan twa liy

Dyagram sa a toujou pa reprezante egzakteman sa nou pral bati nan pwojè a paske eleman yo sanble abstrè. Nou toujou bezwen wè ki jan sa a pral pwojte sou reyèl Tarantool la - an nou gwoupe eleman nou yo pa pwosesis.

Tarantool Cartridge: sharding yon backend Lua nan twa liy

Pa gen okenn pwen nan kenbe vshard-routeur ak pòtay sou ka separe. Poukisa nou bezwen navige rezo a yon lòt fwa ankò si sa a deja responsablite nan routeur la? Yo dwe kouri nan menm pwosesis la. Sa vle di, tou de gateway ak vshard.router.cfg yo inisyalize nan yon sèl pwosesis, epi kite yo kominike lokalman.

Nan etap nan konsepsyon, li te pratik yo travay ak twa konpozan, men mwen, kòm yon pwomotè, pandan y ap ekri kòd la, pa vle panse sou lanse twa ka nan Tarnatool. Mwen bezwen fè tès yo epi tcheke ke mwen te ekri pòtay kòrèkteman. Oswa petèt mwen vle demontre yon karakteristik bay kòlèg mwen yo. Poukisa mwen ta dwe ale nan konplikasyon nan deplwaye twa kopi? Sa a se ki jan konsèp nan wòl te fèt. Yon wòl se yon modil luash regilye ki gen sik lavi jere pa Cartridge. Nan egzanp sa a gen kat nan yo - pòtay, routeur, depo, orè. Ka gen plis nan yon lòt pwojè. Tout wòl yo ka kouri nan yon sèl pwosesis, epi sa a pral ase.

Tarantool Cartridge: sharding yon backend Lua nan twa liy

Ak lè li rive deplwaman nan sèn oswa pwodiksyon, Lè sa a, nou pral bay chak pwosesis Tarantool pwòp seri wòl li yo depann sou kapasite pyès ki nan konpitè:

Tarantool Cartridge: sharding yon backend Lua nan twa liy

Jesyon topoloji

Enfòmasyon sou ki kote wòl yo ap kouri yo dwe estoke yon kote. Ak "yon kote" sa a se konfigirasyon distribye, ke mwen deja mansyone pi wo a. Bagay ki pi enpòtan sou li se topoloji gwoup la. Men 3 gwoup replikasyon 5 pwosesis Tarantool:

Tarantool Cartridge: sharding yon backend Lua nan twa liy

Nou pa vle pèdi done, kidonk nou trete enfòmasyon sou kouri pwosesis ak anpil atansyon. Katouch kenbe tras nan konfigirasyon an lè l sèvi avèk yon komèt de-faz. Yon fwa nou vle mete ajou konfigirasyon an, li premye tcheke ke tout ka yo disponib ak pare yo aksepte nouvo konfigirasyon an. Apre sa, dezyèm faz la aplike konfigirasyon an. Kidonk, menm si yon kopi parèt pou yon ti tan pa disponib, pa gen anyen move ki pral rive. Konfigirasyon an tou senpleman pa pral aplike epi ou pral wè yon erè davans.

Epitou nan seksyon topoloji a, yo endike yon paramèt enpòtan tankou lidè chak gwoup replikasyon. Anjeneral sa a se kopi a ke yo te anrejistre. Rès yo pi souvan lekti sèlman, byenke ka gen eksepsyon. Pafwa devlopè brav yo pa bezwen pè konfli epi yo ka ekri done nan plizyè kopi an paralèl, men gen kèk operasyon ki, kèlkeswa sa, pa ta dwe fèt de fwa. Pou sa gen yon siy nan yon lidè.

Tarantool Cartridge: sharding yon backend Lua nan twa liy

Lavi wòl yo

Pou yon wòl abstrè egziste nan yon achitekti konsa, fondasyon an dwe jere yo yon jan kanmenm. Natirèlman, kontwòl fèt san rekòmanse pwosesis Tarantool la. Gen 4 apèl pou jere wòl yo. Katouch tèt li pral rele yo depann sou sa ki ekri nan konfigirasyon distribiye li yo, kidonk aplike konfigirasyon an nan wòl espesifik.

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

Chak wòl gen yon fonksyon init. Li rele yon fwa swa lè wòl la pèmèt oswa lè Tarantool rekòmanse. Li se pratik la, pou egzanp, inisyalize box.space.create, oswa orè a ka lanse kèk fib background ki pral fè travay nan sèten entèval tan.

Yon fonksyon init ka pa ase. Katouch pèmèt wòl yo pran avantaj de konfigirasyon distribiye li itilize pou estoke topoloji a. Nou ka deklare yon nouvo seksyon nan menm konfigirasyon an epi estoke yon fragman nan konfigirasyon biznis la ladan l. Nan egzanp mwen an, sa a ta ka yon chema done oswa anviwònman orè pou wòl orè a.

Cluster apèl yo validate_config и apply_config chak fwa konfigirasyon distribye a chanje. Lè yon konfigirasyon aplike pa yon komite de-faz, gwoup la tcheke si chak wòl pare pou aksepte nouvo konfigirasyon sa a epi, si sa nesesè, rapòte yon erè bay itilizatè a. Lè tout moun dakò ke konfigirasyon an nòmal, lè sa a apply_config.

Epitou wòl yo gen yon metòd stop, ki nesesè pou netwaye pwodiksyon wòl la. Si nou di ke pwogramè pa nesesè ankò sou sèvè sa a, li ka sispann fib sa yo ke li te kòmanse itilize init.

Wòl yo ka kominike youn ak lòt. Nou abitye ekri apèl fonksyon nan Lua, men li ka rive ke yon pwosesis bay pa gen wòl nou bezwen an. Pou fasilite apèl sou rezo a, nou itilize modil oksilyè rpc (rele pwosedi aleka), ki bati sou baz netbox estanda ki te bati nan Tarantool. Sa a ka itil si, pou egzanp, pòtay ou vle dirèkteman mande pwogramè a fè travay la kounye a, olye ke tann yon jou.

Yon lòt pwen enpòtan se asire tolerans fay. Katouch itilize pwotokòl SWIM pou kontwole sante [4]. Nan ti bout tan, pwosesis echanj "rimè" youn ak lòt sou UDP-chak pwosesis di vwazen li yo dènye nouvèl, epi yo reponn. Si toudenkou repons lan pa vini, Tarantool kòmanse sispèk yon bagay ki mal, epi apre yon ti tan li resite lanmò epi li kòmanse di tout moun alantou nouvèl sa a.

Tarantool Cartridge: sharding yon backend Lua nan twa liy

Ki baze sou pwotokòl sa a, Cartridge òganize otomatik echèk pwosesis. Chak pwosesis kontwole anviwònman li yo, epi si lidè a toudenkou sispann reponn, kopi a ka pran sou wòl li, epi Cartridge configured wòl yo kouri kòmsadwa.

Tarantool Cartridge: sharding yon backend Lua nan twa liy

Ou bezwen fè atansyon isit la, paske souvan chanje retounen ak lide ka mennen nan konfli done pandan replikasyon. Natirèlman, ou pa ta dwe pèmèt failover otomatik o aza. Nou dwe byen konprann sa k ap pase epi asire w ke replikasyon pa pral kraze apre lidè a te retabli epi kouwòn lan tounen ba li.

Soti nan tout sa a, ou ka santi ke wòl yo sanble ak mikwosèvis. Nan yon sans, yo se jis sa, sèlman kòm modil andedan pwosesis Tarantool. Men, gen tou yon kantite diferans fondamantal. Premyèman, tout wòl pwojè yo dwe viv nan menm baz kòd. Ak tout pwosesis Tarantool yo ta dwe lanse soti nan baz la menm kòd, pou pa gen okenn sipriz tankou sa yo lè nou eseye inisyalize orè a, men li tou senpleman pa egziste. Epitou, ou pa ta dwe pèmèt diferans ki genyen nan vèsyon kòd, paske konpòtman an nan sistèm nan nan yon sitiyasyon trè difisil predi ak debug.

Kontrèman ak Docker, nou pa ka jis pran yon wòl "imaj", pran li nan yon lòt machin epi kouri li la. Wòl nou yo pa izole tankou resipyan Docker. Epitou, nou pa ka kouri de wòl idantik sou yon sèl egzanp. Yon wòl swa egziste oswa li pa egziste; nan yon sans, li se yon singleton. Ak twazyèmman, wòl yo dwe menm nan tout gwoup replikasyon an, paske otreman li ta absid - done yo se menm bagay la, men konfigirasyon an diferan.

Zouti deplwaman

Mwen te pwomèt pou m montre kijan Cartridge ede deplwaye aplikasyon yo. Pou fè lavi pi fasil pou lòt moun, kad la pake pakè RPM:

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

Pake enstale a gen prèske tout bagay ou bezwen: tou de aplikasyon an ak depandans yo enstale. Tarantool pral rive tou sou sèvè a kòm yon depandans nan pake RPM a, ak sèvis nou an pare pou lanse. Sa a se fè atravè systemd, men anvan ou bezwen ekri yon ti konfigirasyon. Omwen, presize URI chak pwosesis. Twa se ase pou egzanp.

$ 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

Gen yon nuans enteresan isit la. Olye pou yo espesifye jis pò a pwotokòl binè, nou presize tout adrès piblik la nan pwosesis la ki gen ladan non host la. Sa nesesè pou nœuds gwoup yo konnen ki jan yo konekte youn ak lòt. Li se yon move lide yo sèvi ak 0.0.0.0 kòm adrès advertise_uri a; li ta dwe yon adrès IP ekstèn, pa yon koneksyon priz. San li, pa gen anyen ki pral travay, kidonk Cartridge tou senpleman pa pral kite ou lanse yon ne ak move advertise_uri.

Kounye a ke konfigirasyon an pare, ou ka kòmanse pwosesis yo. Depi yon inite systemd regilye pa pèmèt plis pase yon pwosesis kòmanse, aplikasyon sou katouch la enstale pa sa yo rele. inite enstansye ki travay tankou sa a:

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

Nan konfigirasyon an, nou espesifye pò HTTP sou ki Cartridge sèvi koòdone entènèt la - 8080. Ann ale nan li epi pran yon gade:

Tarantool Cartridge: sharding yon backend Lua nan twa liy

Nou wè ke byenke pwosesis yo ap kouri, yo poko configuré. Katouch la poko konnen ki moun ki ta dwe repwodui ak ki moun epi li pa ka pran yon desizyon poukont li, kidonk li ap tann aksyon nou yo. Men, nou pa gen anpil chwa: lavi yon nouvo gwoup kòmanse ak konfigirasyon premye ne. Lè sa a, nou pral ajoute lòt yo nan gwoup la, bay yo wòl, epi nan pwen sa a ka konsidere deplwaman an fini avèk siksè.

Ann vide yon vè bwason pi renmen ou epi detann apre yon semèn travay long. Aplikasyon an ka itilize.

Tarantool Cartridge: sharding yon backend Lua nan twa liy

Rezilta

Ki rezilta yo? Eseye li, sèvi ak li, kite fidbak, kreye tikè sou Github.

Referans

[1] Tarantool » 2.2 » Referans » Wòch referans » Modil vshard

[2] Ki jan nou aplike nwayo biznis envestisman Alfa-Bank la ki baze sou Tarantool

[3] Nouvo jenerasyon achitekti facturation: transfòmasyon ak tranzisyon pou Tarantool

[4] SWIM - pwotokòl konstriksyon gwoup

[5] GitHub - tarantool/cartridge-cli

[6] GitHub - tarantool / katouch

Sous: www.habr.com

Add nouvo kòmantè