Картриджи Tarantool: тақсим кардани пушти Lua дар се сатр

Картриджи Tarantool: тақсим кардани пушти Lua дар се сатр

Дар Mail.ru Group мо Tarantool дорем - ин сервери барномавӣ дар Луа мебошад, ки он ҳамчун пойгоҳи додаҳо дучанд мешавад (ё баръакс?). Ин зуд ва олӣ аст, аммо имкониятҳои як сервер то ҳол номаҳдуд нестанд. Миқёси амудӣ низ як табобат нест, аз ин рӯ Tarantool дорои абзорҳо барои миқёси уфуқӣ - модули vshard [1]. Он ба шумо имкон медиҳад, ки маълумотро дар якчанд серверҳо тақсим кунед, аммо шумо бояд бо он кор кунед, то онро насб кунед ва мантиқи тиҷоратро замима кунед.

Хабари хуш: мо якчанд аксҳои калон ҷамъ кардем (масалан [2], [3]) ва чорчубаи дигареро ба вучуд овард, ки халли ин масъаларо хеле осон мекунад.

Картриджи Tarantool чаҳорчӯбаи нав барои таҳияи системаҳои мураккаби тақсимшуда мебошад. Он ба шумо имкон медиҳад, ки ба навиштани мантиқи тиҷорат диққат диҳед, ба ҷои ҳалли мушкилоти инфрасохтор. Дар зер буриш ман ба шумо мегӯям, ки ин чаҳорчӯба чӣ гуна кор мекунад ва чӣ гуна бо истифода аз он хидматҳои тақсимшударо нависед.

Мушкилот дар чист?

Мо тарантула дорем, вшард дорем - боз чӣ мехоҳед?

Аввалан, ин масъалаи роҳат аст. Конфигуратсияи vshard тавассути ҷадвалҳои Lua танзим карда мешавад. Барои дуруст кор кардани системаи тақсимшудаи равандҳои сершумори Tarantool, конфигуратсия бояд дар ҳама ҷо якхела бошад. Ҳеҷ кас намехоҳад, ки ин корро дастӣ кунад. Аз ин рӯ, ҳама намудҳои скриптҳо, Ansible ва системаҳои ҷойгиркунӣ истифода мешаванд.

Худи картридж конфигуратсияи vshard-ро идора мекунад, онро дар асоси он мекунад конфигуратсияи тақсимшудаи худ. Ин аслан як файли оддии YAML аст, ки нусхаи он дар ҳар як мисоли Tarantool нигоҳ дошта мешавад. Соддасозӣ дар он аст, ки худи чаҳорчӯба конфигуратсияи онро назорат мекунад ва кафолат медиҳад, ки он дар ҳама ҷо якхела бошад.

Сониян, ин боз масъалаи рохат аст. Конфигуратсияи vshard ба рушди мантиқи тиҷорат рабте надорад ва танҳо барномасозро аз кораш парешон мекунад. Вақте ки мо меъмории лоиҳаро муҳокима мекунем, мо аксар вақт дар бораи ҷузъҳои инфиродӣ ва ҳамкории онҳо сӯҳбат мекунем. Дар бораи паҳн кардани кластер ба 3 маркази додаҳо фикр кардан ҳанӯз барвақт аст.

Мо ин мушкилотро такрор ба такрор ҳал кардем ва дар як вақт мо тавонистем равишеро таҳия кунем, ки кор бо барномаро дар тамоми давраи ҳаёти он соддатар гардонад: эҷод, таҳия, озмоиш, CI/CD, нигоҳдорӣ.

Картридж консепсияи нақшро барои ҳар як раванди Tarantool муаррифӣ мекунад. Нақшҳо консепсияест, ки ба таҳиягар имкон медиҳад, ки ба навиштани код тамаркуз кунад. Ҳама нақшҳои дар лоиҳа мавҷудбуда метавонанд дар як мисоли Tarantool иҷро шаванд ва ин барои санҷишҳо кофӣ хоҳад буд.

Хусусиятҳои асосии Cartridge Tarantool:

  • ташкили кластерҳои автоматӣ;
  • васеъ кардани функсияҳои барнома бо истифода аз нақшҳои нав;
  • қолаби барнома барои таҳия ва ҷойгиркунӣ;
  • дарунсохти автоматӣ;
  • ҳамгироӣ бо чаҳорчӯбаи санҷиши Luatest;
  • идоракунии кластер бо истифода аз WebUI ва API;
  • асбобҳои бастабандӣ ва ҷойгиркунӣ.

Салом Ҷаҳон!

Ман интизор шуда наметавонам, ки худи чаҳорчӯба нишон диҳам, аз ин рӯ мо ҳикояро дар бораи меъмориро барои дертар мегузорем ва бо чизи оддӣ оғоз мекунем. Агар мо фарз кунем, ки худи Tarantool аллакай насб шудааст, пас танҳо кор кардан боқӣ мемонад

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

Ин ду фармон утилитаҳои сатри фармонро насб мекунанд ва ба шумо имкон медиҳанд, ки барномаи аввалини худро аз қолаб созед:

$ cartridge create --name myapp

Ва ин аст он чизе ки мо ба даст меорем:

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/

Ин як анбори git бо "Салом, Ҷаҳон!" ариза. Биёед кӯшиш кунем, ки онро фавран иҷро кунем, то вобастагиҳоро қаблан насб кунем (аз ҷумла худи чаҳорчӯба):

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

Ҳамин тавр, мо як гиреҳ дорем, ки барои барномаи ояндаи шарикӣ кор мекунад. Шахси пуртаҷриба метавонад фавран интерфейси вебро кушояд, кластери як гиреҳро бо муш танзим кунад ва аз натиҷа лаззат барад, аммо барои шодӣ кардан ҳанӯз барвақт аст. То ба ҳол, барнома ҳеҷ чизи муфиде карда наметавонад, бинобар ин ман ба шумо дар бораи ҷойгиркунӣ баъдтар нақл мекунам, аммо ҳоло вақти навиштани код расидааст.

Таҳияи барнома

Тасаввур кунед, мо лоиҳаеро таҳия карда истодаем, ки бояд маълумотро қабул кунад, онро захира кунад ва дар як рӯз як маротиба гузориш эҷод кунад.

Картриджи Tarantool: тақсим кардани пушти Lua дар се сатр

Мо ба кашидани диаграмма шурӯъ мекунем ва дар он се ҷузъро ҷойгир мекунем: дарвоза, нигоҳдорӣ ва нақшакаш. Мо минбаъд дар болои меъморӣ кор карда истодаем. Азбаски мо vshard-ро ҳамчун анбор истифода мебарем, мо ба нақшаи vshard-роутер ва vshard-нигоҳ илова мекунем. На дарвоза ва на банақшагир мустақиман ба анбор дастрасӣ надоранд; роутер барои ҳамин аст, он барои он офарида шудааст.

Картриджи Tarantool: тақсим кардани пушти Lua дар се сатр

Ин диаграмма то ҳол он чизеро, ки мо дар лоиҳа бунёд мекунем, ифода намекунад, зеро ҷузъҳо абстрактӣ ба назар мерасанд. Мо то ҳол бояд бубинем, ки ин ба Tarantool воқеӣ чӣ гуна хоҳад буд - биёед ҷузъҳои худро аз рӯи раванд гурӯҳбандӣ кунем.

Картриджи Tarantool: тақсим кардани пушти Lua дар се сатр

Нигоҳ доштани vshard-роутер ва шлюз дар мисолҳои алоҳида аҳамияти кам вуҷуд дорад. Чаро мо бояд бори дигар дар шабака сайр кунем, агар ин аллакай масъулияти роутер аст? Онҳо бояд дар як раванд иҷро карда шаванд. Яъне, ҳам gateway ва ҳам vshard.router.cfg дар як раванд оғоз карда мешаванд ва бигзор онҳо ба таври маҳаллӣ ҳамкорӣ кунанд.

Дар марҳилаи тарҳрезӣ кор кардан бо се ҷузъ қулай буд, аммо ман ҳамчун таҳиякунанда ҳангоми навиштани код намехоҳам дар бораи оғози се мисоли Tarnatool фикр кунам. Ман бояд санҷишҳоро иҷро кунам ва тафтиш кунам, ки дарвозаро дуруст навиштаам. Ё шояд ман мехоҳам як хусусиятро ба ҳамкасбони худ нишон диҳам. Чаро ман бояд дар бораи ҷойгиркунии се нусха гузарам? Мафҳуми нақшҳо ҳамин тавр ба вуҷуд омадааст. Нақш як модули муқаррарии luash аст, ки давраи ҳаёти онро Cartridge идора мекунад. Дар ин мисол чортои онҳо мавҷуданд - шлюз, роутер, анбор, нақшакаш. Шояд дар лоиҳаи дигар бештар бошад. Ҳама нақшҳоро дар як раванд иҷро кардан мумкин аст ва ин кофӣ хоҳад буд.

Картриджи Tarantool: тақсим кардани пушти Lua дар се сатр

Ва ҳангоме ки сухан дар бораи ҷойгиркунӣ ба саҳна ё истеҳсол меравад, мо ба ҳар як раванди Tarantool маҷмӯи нақшҳои худро вобаста ба қобилиятҳои сахтафзор таъин мекунем:

Картриджи Tarantool: тақсим кардани пушти Lua дар се сатр

Идоракунии топология

Маълумот дар бораи он, ки кадом нақшҳо дар куҷо иҷро мешаванд, бояд дар ҷое нигоҳ дошта шаванд. Ва ин "ҷое" конфигуратсияи тақсимшуда аст, ки ман дар боло зикр кардам. Чизи аз ҳама муҳим дар он топологияи кластер аст. Инҳоянд 3 гурӯҳи такрории 5 равандҳои Tarantool:

Картриджи Tarantool: тақсим кардани пушти Lua дар се сатр

Мо намехоҳем маълумотро аз даст диҳем, аз ин рӯ мо ба маълумот дар бораи равандҳои иҷрошаванда боэҳтиёт муносибат мекунем. Картридж конфигуратсияро бо истифода аз ӯҳдадории думарҳила пайгирӣ мекунад. Вақте ки мо мехоҳем конфигуратсияро навсозӣ кунем, он аввал месанҷад, ки ҳама намунаҳо дастрасанд ва барои қабули конфигуратсияи нав омодаанд. Пас аз ин, марҳилаи дуюм конфигуратсияро татбиқ мекунад. Ҳамин тариқ, ҳатто агар як нусха муваққатан дастнорас гардад, ҳеҷ чизи бад рӯй нахоҳад дод. Конфигуратсия танҳо татбиқ карда намешавад ва шумо пешакӣ хатогиро хоҳед дид.

Инчунин дар бахши топология чунин параметри муҳим ба мисли пешвои ҳар як гурӯҳи такрорӣ нишон дода шудааст. Одатан ин нусхаи сабтшуда мебошад. Боқимондаҳо аксар вақт танҳо барои хондан мебошанд, гарчанде ки истисноҳо вуҷуд доранд. Баъзан таҳиягарони ҷасур аз муноқишаҳо наметарсанд ва метавонанд ба якчанд реплика маълумот нависанд, аммо баъзе амалиётҳое ҳастанд, ки новобаста аз он, ки онҳо набояд ду маротиба иҷро карда шаванд. Барои ин аломати пешво вуҷуд дорад.

Картриджи Tarantool: тақсим кардани пушти Lua дар се сатр

Ҳаёти нақшҳо

Барои мавҷудияти нақши абстрактӣ дар чунин меъморӣ, чаҳорчӯба бояд онҳоро бо ягон роҳ идора кунад. Табиист, ки назорат бидуни аз нав оғоз кардани раванди Tarantool сурат мегирад. Барои идоракунии нақшҳо 4 занги бозгашт вуҷуд дорад. Худи картридж онҳоро вобаста ба он чизе, ки дар конфигуратсияи тақсимшудаи он навишта шудааст, даъват мекунад ва ба ин васила конфигуратсияро ба нақшҳои мушаххас татбиқ мекунад.

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

Ҳар як нақш вазифа дорад init. Он як маротиба ё ҳангоми фаъол кардани нақш ё ҳангоми аз нав оғоз кардани Tarantool даъват карда мешавад. Дар он ҷо, масалан, оғоз кардани box.space.create қулай аст, ё банақшагир метавонад баъзе нахи заминаро оғоз кунад, ки дар фосилаҳои муайяни вақт корҳоро иҷро мекунад.

Як функсия init кифоя набошад. Картридж имкон медиҳад, ки нақшҳо аз конфигуратсияи тақсимшуда, ки барои нигоҳ доштани топология истифода мебаранд, бартарӣ гиранд. Мо метавонем як бахши навро дар ҳамон конфигуратсия эълон кунем ва порчаи конфигуратсияи тиҷоратро дар он нигоҳ дорем. Дар мисоли ман, ин метавонад схемаи додаҳо ё танзимоти ҷадвал барои нақши нақшакаш бошад.

Зангҳои кластерӣ validate_config и apply_config ҳар дафъае, ки конфигуратсияи тақсимшуда тағир меёбад. Вақте ки конфигуратсия аз ҷониби ӯҳдадории думарҳила татбиқ карда мешавад, кластер месанҷад, ки ҳар як нақш барои қабули ин конфигуратсияи нав омода аст ва агар лозим бошад, дар бораи хатогӣ ба корбар хабар медиҳад. Вақте ки ҳама розӣ ҳастанд, ки конфигуратсия муқаррарӣ аст, пас apply_config.

Нақшҳо низ усул доранд stop, ки барои тоза кардани баромади роль зарур аст. Агар гӯем, ки банақшагири дигар дар ин сервер лозим нест, он метавонад он нахҳоеро, ки ба истифода оғоз кардааст, боздорад init.

Нақшҳо метавонанд бо ҳамдигар ҳамкорӣ кунанд. Мо ба навиштани зангҳои функсионалӣ дар Луа одат кардаем, аммо ин метавонад рӯй диҳад, ки раванди додашуда нақши ба мо лозимиро надорад. Барои осон кардани зангҳо тавассути шабака, мо модули ёрирасони rpc (заңги процедураи дурдаст) -ро истифода мебарем, ки дар асоси netbox стандартии дар Tarantool сохташуда сохта шудааст. Ин метавонад муфид бошад, агар, масалан, дарвозаи шумо мехоҳад мустақиман аз нақшакаш хоҳиш кунад, ки корро худи ҳозир иҷро кунад, на як рӯз интизор шавед.

Нуктаи дигари муҳим ин таъмини таҳаммулпазирии хатогиҳо мебошад. Картридж барои назорати саломатӣ протоколи SWIM-ро истифода мебарад [4]. Хулоса, равандҳо дар бораи UDP бо ҳамдигар "овузаҳо" иваз мекунанд - ҳар як раванд ба ҳамсояҳо хабарҳои охиринро нақл мекунад ва онҳо ҷавоб медиҳанд. Агар ногаҳон ҷавоб наояд, Тарантул гумон мекунад, ки чизе нодуруст аст ва пас аз муддате маргро мехонад ва дар атрофи ин хабар ба ҳама нақл мекунад.

Картриджи Tarantool: тақсим кардани пушти Lua дар се сатр

Дар асоси ин протокол, Cartridge коркарди автоматии нокомиро ташкил мекунад. Ҳар як раванд муҳити худро назорат мекунад ва агар роҳбар ногаҳон посух доданро қатъ кунад, реплика метавонад нақши худро бар дӯш гирад ва Картридж нақшҳои иҷрошавандаро мувофиқан танзим мекунад.

Картриджи Tarantool: тақсим кардани пушти Lua дар се сатр

Дар ин ҷо шумо бояд эҳтиёт бошед, зеро зуд-зуд гузаштан ба пеш ва бозгашт метавонад ба ихтилофоти додаҳо ҳангоми такрорӣ оварда расонад. Албатта, шумо набояд ба таври тасодуфӣ интиқоли автоматиро фаъол созед. Мо бояд ба таври возеҳ дарк кунем, ки чӣ рӯй дода истодааст ва итминон ҳосил кунем, ки пас аз барқарор шудани пешво ва ба ӯ баргардонидани тоҷ такрорӣ намешиканад.

Аз ин ҳама, шумо метавонед эҳсос кунед, ки нақшҳо ба микросервисҳо монанданд. Ба як маъно, онҳо танҳо ҳамчун модулҳо дар дохили равандҳои Tarantool мебошанд. Аммо як қатор фарқиятҳои асосӣ низ мавҷуданд. Аввалан, ҳамаи нақшҳои лоиҳа бояд дар як пойгоҳи код зиндагӣ кунанд. Ва ҳама равандҳои Tarantool бояд аз ҳамон як пойгоҳи код оғоз карда шаванд, то вақте ки мо кӯшиш мекунем, ки банақшагириро оғоз кунем, ҳеҷ гуна ногаҳонӣ ба вуҷуд наояд, аммо он танҳо вуҷуд надорад. Инчунин, шумо набояд ба фарқиятҳо дар версияҳои код иҷозат диҳед, зеро рафтори система дар чунин вазъият пешгӯӣ ва ислоҳ кардан хеле душвор аст.

Баръакси Docker, мо наметавонем танҳо як нақш "тасвир" гирем, онро ба мошини дигар бардорем ва онро дар он ҷо иҷро кунем. Нақшҳои мо мисли контейнерҳои Docker ҷудо нестанд. Инчунин, мо наметавонем дар як мисол ду нақши якхеларо иҷро кунем. Нақш ё вуҷуд дорад ё вуҷуд надорад; ба маъное, он як синглтон аст. Ва сеюм, нақшҳо бояд дар тамоми гурӯҳи такрорӣ якхела бошанд, зеро дар акси ҳол ин бемаънӣ хоҳад буд - маълумот як аст, аммо конфигуратсия дигар аст.

Воситаҳои ҷойгиркунӣ

Ман ваъда додам, ки нишон диҳам, ки чӣ тавр Cartridge барои ҷойгиркунии барномаҳо кӯмак мекунад. Барои осон кардани ҳаёт барои дигарон, чаҳорчӯба бастаҳои RPM -ро бастааст:

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

Бастаи насбшуда қариб ҳама чизро дар бар мегирад: ҳам барнома ва ҳам вобастагии насбшуда. Tarantool инчунин ба сервер ҳамчун вобастагии бастаи RPM меояд ва хидмати мо барои оғозёбӣ омода аст. Ин тавассути systemd анҷом дода мешавад, аммо аввал шумо бояд конфигуратсияи каме нависед. Ҳадди ақал, URI-и ҳар як равандро муайян кунед. Масалан, се кифоя аст.

$ 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

Дар ин ҷо як нозуки ҷолиб вуҷуд дорад. Ба ҷои муайян кардани танҳо порти протоколи дуӣ, мо тамоми суроғаи умумии равандро, аз ҷумла номи мизбонро муайян мекунем. Ин барои он зарур аст, ки гиреҳҳои кластер чӣ гуна ба ҳамдигар пайваст шаванд. Истифодаи 0.0.0.0 ҳамчун суроғаи advertise_uri фикри бад аст; он бояд суроғаи IP-и беруна бошад, на пайвасткунандаи розетка. Бе он, ҳеҷ чиз кор намекунад, аз ин рӯ Cartridge ба шумо имкон намедиҳад, ки гиреҳро бо advertise_uri нодуруст оғоз кунед.

Акнун, ки конфигуратсия омода аст, шумо метавонед равандҳоро оғоз кунед. Азбаски воҳиди муқаррарии системавӣ имкон намедиҳад, ки зиёда аз як раванд оғоз шавад, замимаҳо дар картридж аз ҷониби ба ном насб карда мешаванд. воҳидҳои фаврӣ, ки чунин кор мекунанд:

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

Дар конфигуратсия мо порти HTTP-ро муайян кардем, ки дар он Cartridge ба веб-интерфейс хизмат мерасонад - 8080. Биёед ба он равем ва бубинем:

Картриджи Tarantool: тақсим кардани пушти Lua дар се сатр

Мо мебинем, ки ҳарчанд равандҳо иҷро мешаванд, онҳо ҳанӯз танзим карда нашудаанд. Картридж ҳанӯз намедонад, ки кӣ бояд бо кӣ такрор кунад ва мустақилона тасмим гирифта наметавонад, бинобар ин интизори амали мост. Аммо мо интихоби зиёд надорем: ҳаёти кластери нав аз конфигуратсияи гиреҳи аввал оғоз мешавад. Сипас, мо дигаронро ба кластер илова мекунем, ба онҳо нақшҳо таъин мекунем ва дар ин лаҳза ҷойгиркуниро бомуваффақият анҷом додан мумкин аст.

Биёед як пиёла нӯшокии дӯстдоштаи худро бирезем ва пас аз як ҳафтаи корӣ истироҳат кунем. Барномаро истифода бурдан мумкин аст.

Картриджи Tarantool: тақсим кардани пушти Lua дар се сатр

Натиҷаҳо

Натиҷаҳо чӣ гунаанд? Кӯшиш кунед, истифода баред, фикру мулоҳиза гузоред, дар Github чиптаҳо созед.

мурожиат

[1] Tarantool » 2.2 » истинод » истинод ба сангҳо » Модули vshard

[2] Чӣ гуна мо асоси тиҷорати сармоягузории Алфа-Банкро дар асоси Tarantool амалӣ кардем

[3] Меъмории насли нави биллинг: тағирот бо гузариш ба Tarantool

[4] SWIM - протоколи сохтмони кластер

[5] GitHub - tarantool/cartridge-cli

[6] GitHub - tarantool/картридж

Манбаъ: will.com

Илова Эзоҳ