Дар Mail.ru Group мо Tarantool дорем - ин сервери барномавӣ дар Луа мебошад, ки он ҳамчун пойгоҳи додаҳо дучанд мешавад (ё баръакс?). Ин зуд ва олӣ аст, аммо имкониятҳои як сервер то ҳол номаҳдуд нестанд. Миқёси амудӣ низ як табобат нест, аз ин рӯ Tarantool дорои абзорҳо барои миқёси уфуқӣ - модули vshard
Хабари хуш: мо якчанд аксҳои калон ҷамъ кардем (масалан
Мушкилот дар чист?
Мо тарантула дорем, вшард дорем - боз чӣ мехоҳед?
Аввалан, ин масъалаи роҳат аст. Конфигуратсияи 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
Ҳамин тавр, мо як гиреҳ дорем, ки барои барномаи ояндаи шарикӣ кор мекунад. Шахси пуртаҷриба метавонад фавран интерфейси вебро кушояд, кластери як гиреҳро бо муш танзим кунад ва аз натиҷа лаззат барад, аммо барои шодӣ кардан ҳанӯз барвақт аст. То ба ҳол, барнома ҳеҷ чизи муфиде карда наметавонад, бинобар ин ман ба шумо дар бораи ҷойгиркунӣ баъдтар нақл мекунам, аммо ҳоло вақти навиштани код расидааст.
Таҳияи барнома
Тасаввур кунед, мо лоиҳаеро таҳия карда истодаем, ки бояд маълумотро қабул кунад, онро захира кунад ва дар як рӯз як маротиба гузориш эҷод кунад.
Мо ба кашидани диаграмма шурӯъ мекунем ва дар он се ҷузъро ҷойгир мекунем: дарвоза, нигоҳдорӣ ва нақшакаш. Мо минбаъд дар болои меъморӣ кор карда истодаем. Азбаски мо vshard-ро ҳамчун анбор истифода мебарем, мо ба нақшаи vshard-роутер ва vshard-нигоҳ илова мекунем. На дарвоза ва на банақшагир мустақиман ба анбор дастрасӣ надоранд; роутер барои ҳамин аст, он барои он офарида шудааст.
Ин диаграмма то ҳол он чизеро, ки мо дар лоиҳа бунёд мекунем, ифода намекунад, зеро ҷузъҳо абстрактӣ ба назар мерасанд. Мо то ҳол бояд бубинем, ки ин ба Tarantool воқеӣ чӣ гуна хоҳад буд - биёед ҷузъҳои худро аз рӯи раванд гурӯҳбандӣ кунем.
Нигоҳ доштани vshard-роутер ва шлюз дар мисолҳои алоҳида аҳамияти кам вуҷуд дорад. Чаро мо бояд бори дигар дар шабака сайр кунем, агар ин аллакай масъулияти роутер аст? Онҳо бояд дар як раванд иҷро карда шаванд. Яъне, ҳам gateway ва ҳам vshard.router.cfg дар як раванд оғоз карда мешаванд ва бигзор онҳо ба таври маҳаллӣ ҳамкорӣ кунанд.
Дар марҳилаи тарҳрезӣ кор кардан бо се ҷузъ қулай буд, аммо ман ҳамчун таҳиякунанда ҳангоми навиштани код намехоҳам дар бораи оғози се мисоли Tarnatool фикр кунам. Ман бояд санҷишҳоро иҷро кунам ва тафтиш кунам, ки дарвозаро дуруст навиштаам. Ё шояд ман мехоҳам як хусусиятро ба ҳамкасбони худ нишон диҳам. Чаро ман бояд дар бораи ҷойгиркунии се нусха гузарам? Мафҳуми нақшҳо ҳамин тавр ба вуҷуд омадааст. Нақш як модули муқаррарии luash аст, ки давраи ҳаёти онро Cartridge идора мекунад. Дар ин мисол чортои онҳо мавҷуданд - шлюз, роутер, анбор, нақшакаш. Шояд дар лоиҳаи дигар бештар бошад. Ҳама нақшҳоро дар як раванд иҷро кардан мумкин аст ва ин кофӣ хоҳад буд.
Ва ҳангоме ки сухан дар бораи ҷойгиркунӣ ба саҳна ё истеҳсол меравад, мо ба ҳар як раванди Tarantool маҷмӯи нақшҳои худро вобаста ба қобилиятҳои сахтафзор таъин мекунем:
Идоракунии топология
Маълумот дар бораи он, ки кадом нақшҳо дар куҷо иҷро мешаванд, бояд дар ҷое нигоҳ дошта шаванд. Ва ин "ҷое" конфигуратсияи тақсимшуда аст, ки ман дар боло зикр кардам. Чизи аз ҳама муҳим дар он топологияи кластер аст. Инҳоянд 3 гурӯҳи такрории 5 равандҳои Tarantool:
Мо намехоҳем маълумотро аз даст диҳем, аз ин рӯ мо ба маълумот дар бораи равандҳои иҷрошаванда боэҳтиёт муносибат мекунем. Картридж конфигуратсияро бо истифода аз ӯҳдадории думарҳила пайгирӣ мекунад. Вақте ки мо мехоҳем конфигуратсияро навсозӣ кунем, он аввал месанҷад, ки ҳама намунаҳо дастрасанд ва барои қабули конфигуратсияи нав омодаанд. Пас аз ин, марҳилаи дуюм конфигуратсияро татбиқ мекунад. Ҳамин тариқ, ҳатто агар як нусха муваққатан дастнорас гардад, ҳеҷ чизи бад рӯй нахоҳад дод. Конфигуратсия танҳо татбиқ карда намешавад ва шумо пешакӣ хатогиро хоҳед дид.
Инчунин дар бахши топология чунин параметри муҳим ба мисли пешвои ҳар як гурӯҳи такрорӣ нишон дода шудааст. Одатан ин нусхаи сабтшуда мебошад. Боқимондаҳо аксар вақт танҳо барои хондан мебошанд, гарчанде ки истисноҳо вуҷуд доранд. Баъзан таҳиягарони ҷасур аз муноқишаҳо наметарсанд ва метавонанд ба якчанд реплика маълумот нависанд, аммо баъзе амалиётҳое ҳастанд, ки новобаста аз он, ки онҳо набояд ду маротиба иҷро карда шаванд. Барои ин аломати пешво вуҷуд дорад.
Ҳаёти нақшҳо
Барои мавҷудияти нақши абстрактӣ дар чунин меъморӣ, чаҳорчӯба бояд онҳоро бо ягон роҳ идора кунад. Табиист, ки назорат бидуни аз нав оғоз кардани раванди 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-ро истифода мебарад
Дар асоси ин протокол, Cartridge коркарди автоматии нокомиро ташкил мекунад. Ҳар як раванд муҳити худро назорат мекунад ва агар роҳбар ногаҳон посух доданро қатъ кунад, реплика метавонад нақши худро бар дӯш гирад ва Картридж нақшҳои иҷрошавандаро мувофиқан танзим мекунад.
Дар ин ҷо шумо бояд эҳтиёт бошед, зеро зуд-зуд гузаштан ба пеш ва бозгашт метавонад ба ихтилофоти додаҳо ҳангоми такрорӣ оварда расонад. Албатта, шумо набояд ба таври тасодуфӣ интиқоли автоматиро фаъол созед. Мо бояд ба таври возеҳ дарк кунем, ки чӣ рӯй дода истодааст ва итминон ҳосил кунем, ки пас аз барқарор шудани пешво ва ба ӯ баргардонидани тоҷ такрорӣ намешиканад.
Аз ин ҳама, шумо метавонед эҳсос кунед, ки нақшҳо ба микросервисҳо монанданд. Ба як маъно, онҳо танҳо ҳамчун модулҳо дар дохили равандҳои 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. Биёед ба он равем ва бубинем:
Мо мебинем, ки ҳарчанд равандҳо иҷро мешаванд, онҳо ҳанӯз танзим карда нашудаанд. Картридж ҳанӯз намедонад, ки кӣ бояд бо кӣ такрор кунад ва мустақилона тасмим гирифта наметавонад, бинобар ин интизори амали мост. Аммо мо интихоби зиёд надорем: ҳаёти кластери нав аз конфигуратсияи гиреҳи аввал оғоз мешавад. Сипас, мо дигаронро ба кластер илова мекунем, ба онҳо нақшҳо таъин мекунем ва дар ин лаҳза ҷойгиркуниро бомуваффақият анҷом додан мумкин аст.
Биёед як пиёла нӯшокии дӯстдоштаи худро бирезем ва пас аз як ҳафтаи корӣ истироҳат кунем. Барномаро истифода бурдан мумкин аст.
Натиҷаҳо
Натиҷаҳо чӣ гунаанд? Кӯшиш кунед, истифода баред, фикру мулоҳиза гузоред, дар Github чиптаҳо созед.
мурожиат
[1]
Манбаъ: will.com