Тарантоол Цартридге: дељење Луа позадине у три реда

Тарантоол Цартридге: дељење Луа позадине у три реда

У Маил.ру Гроуп имамо Тарантоол - ово је сервер апликација у Луа, који такође служи као база података (или обрнуто?). Брз је и кул, али могућности једног сервера и даље нису неограничене. Вертикално скалирање такође није панацеја, тако да Тарантоол има алате за хоризонтално скалирање - модул всхард [КСНУМКС]. Омогућава вам да делите податке на неколико сервера, али морате да се помучите да бисте га поставили и приложили пословну логику.

Добре вести: прикупили смо неке велике снимке (нпр [КСНУМКС], [КСНУМКС]) и креирао још један оквир који ће значајно поједноставити решење овог проблема.

Тарантоол Цартридге је нови оквир за развој сложених дистрибуираних система. Омогућава вам да се фокусирате на писање пословне логике уместо на решавање инфраструктурних проблема. Испод реза ћу вам рећи како овај оквир функционише и како да напишете дистрибуиране сервисе користећи га.

И у чему је, заправо, проблем?

Имамо тарантулу, имамо всхард - шта више желите?

Прво, то је ствар погодности. Конфигурација всхард-а се конфигурише преко Луа табела. Да би дистрибуирани систем вишеструких Тарантоол процеса исправно функционисао, конфигурација мора бити свуда иста. Нико не жели ово да ради ручно. Због тога се користе све врсте скрипти, Ансибле и системи за имплементацију.

Кертриџ сам управља конфигурацијом всхард, то ради на основу своје сопствену дистрибуирану конфигурацију. То је у суштини једноставна ИАМЛ датотека, чија се копија чува у свакој Тарантоол инстанци. Поједностављење је то што сам оквир прати своју конфигурацију и осигурава да је свуда исти.

Друго, то је опет ствар погодности. Конфигурација всхард нема никакве везе са развојем пословне логике и само одвлачи програмера од његовог посла. Када говоримо о архитектури пројекта, најчешће говоримо о појединачним компонентама и њиховој интеракцији. Прерано је размишљати о увођењу кластера у 3 дата центра.

Решавали смо ове проблеме изнова и изнова и у неком тренутку смо успели да развијемо приступ који је поједноставио рад са апликацијом током читавог њеног животног циклуса: креирање, развој, тестирање, ЦИ/ЦД, одржавање.

Цартридге уводи концепт улоге за сваки Тарантоол процес. Улоге су концепт који омогућава програмеру да се фокусира на писање кода. Све улоге доступне у пројекту могу се покренути на једној Тарантоол инстанци, а то ће бити довољно за тестове.

Кључне карактеристике Тарантоол кертриџа:

  • аутоматизована кластер оркестрација;
  • проширење функционалности апликације коришћењем нових улога;
  • шаблон апликације за развој и примену;
  • уграђено аутоматско дељење;
  • интеграција са Луатест оквиром за тестирање;
  • управљање кластером коришћењем ВебУИ и АПИ-ја;
  • алати за паковање и примену.

Здраво Свете!

Једва чекам да покажем сам оквир, па ћемо причу о архитектури оставити за касније и почети са нечим једноставним. Ако претпоставимо да је сам Тарантоол већ инсталиран, онда остаје само да се уради

$ 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/

Ово је гит спремиште са готовим „Здраво, свет!“ апликација. Покушајмо одмах да га покренемо, након што смо претходно инсталирали зависности (укључујући и сам оквир):

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

Дакле, имамо један чвор који ради за будућу подељену апликацију. Радознали лаик може одмах да отвори веб интерфејс, мишем конфигурише групу од једног чвора и ужива у резултату, али је прерано да се радује. За сада, апликација не може да уради ништа корисно, па ћу вам касније рећи о примени, али сада је време да напишете код.

Развој апликација

Замислите само, ми дизајнирамо пројекат који мора примати податке, чувати их и правити извештај једном дневно.

Тарантоол Цартридге: дељење Луа позадине у три реда

Почињемо да цртамо дијаграм и на њега постављамо три компоненте: гатеваи, складиште и планер. Радимо даље на архитектури. Пошто користимо всхард као складиште, шеми додајемо всхард-роутер и всхард-стораге. Ни мрежни пролаз ни планер неће директно приступити складишту; за то је рутер, за то је створен.

Тарантоол Цартридге: дељење Луа позадине у три реда

Овај дијаграм још увек не представља тачно оно што ћемо градити у пројекту јер компоненте изгледају апстрактно. Још увек треба да видимо како ће се ово пројектовати на прави Тарантоол - хајде да групишемо наше компоненте према процесу.

Тарантоол Цартридге: дељење Луа позадине у три реда

Нема смисла држати всхард-рутер и гатеваи на одвојеним инстанцама. Зашто морамо поново да сурфујемо мрежом ако је то већ одговорност рутера? Морају се покренути у оквиру истог процеса. То јест, и гатеваи и всхард.роутер.цфг се иницијализују у једном процесу и пуштају их да интерагују локално.

У фази пројектовања било је згодно радити са три компоненте, али ја, као програмер, док пишем код, не желим да размишљам о покретању три инстанце Тарнатоол-а. Морам да покренем тестове и проверим да ли сам исправно написао гатеваи. Или можда желим да демонстрирам неку функцију својим колегама. Зашто бих морао да пролазим кроз муке око постављања три копије? Тако је настао концепт улога. Улога је обичан луасх модул чијим животним циклусом управља Цартридге. У овом примеру постоје четири од њих - мрежни пролаз, рутер, складиште, планер. Можда их има више у другом пројекту. Све улоге се могу покренути у једном процесу, и то ће бити довољно.

Тарантоол Цартридге: дељење Луа позадине у три реда

А када је у питању имплементација за постављање или производњу, онда ћемо сваком Тарантоол процесу доделити сопствени скуп улога у зависности од хардверских могућности:

Тарантоол Цартридге: дељење Луа позадине у три реда

Управљање топологијом

Информације о томе где се које улоге покрећу морају негде бити ускладиштене. А ово „негде“ је дистрибуирана конфигурација, коју сам већ поменуо. Најважнија ствар у вези са тим је топологија кластера. Ево 3 групе репликације од 5 Тарантоол процеса:

Тарантоол Цартридге: дељење Луа позадине у три реда

Не желимо да изгубимо податке, па пажљиво поступамо са информацијама о покренутим процесима. Кертриџ прати конфигурацију користећи двофазно урезивање. Када желимо да ажурирамо конфигурацију, прво проверава да ли су све инстанце доступне и спремне да прихвате нову конфигурацију. Након овога, друга фаза примењује конфигурацију. Дакле, чак и ако се покаже да је један примерак привремено недоступан, ништа лоше се неће догодити. Конфигурација једноставно неће бити примењена и видећете грешку унапред.

Такође у одељку о топологији је назначен тако важан параметар као вођа сваке групе репликације. Обично је ово копија која се снима. Остало је најчешће само за читање, мада може бити изузетака. Понекад се храбри програмери не плаше сукоба и могу паралелно да запишу податке у неколико реплика, али постоје неке операције које, без обзира на све, не би требало изводити два пута. За ово постоји знак вође.

Тарантоол Цартридге: дељење Луа позадине у три реда

Живот улога

Да би апстрактна улога постојала у таквој архитектури, оквир мора некако да управља њима. Наравно, контрола се дешава без поновног покретања Тарантоол процеса. Постоје 4 повратна позива за управљање улогама. Сама касета ће их позвати у зависности од тога шта је написано у његовој дистрибуираној конфигурацији, примењујући конфигурацију на одређене улоге.

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

Свака улога има функцију init. Позива се једном или када је улога омогућена или када се Тарантоол поново покрене. Тамо је згодно, на пример, иницијализовати бок.спаце.цреате, или планер може да покрене нека позадинска влакна која ће обављати посао у одређеним временским интервалима.

Једна функција init можда неће бити довољно. Кертриџ омогућава улогама да искористе предности дистрибуиране конфигурације коју користи за чување топологије. Можемо да декларишемо нови одељак у истој конфигурацији и да у њега ускладиштимо фрагмент пословне конфигурације. У мом примеру, ово може бити шема података или подешавања распореда за улогу планера.

Цлустер цаллс validate_config и apply_config сваки пут када се дистрибуирана конфигурација промени. Када се конфигурација примени двофазним урезивањем, кластер проверава да ли је свака улога спремна да прихвати ову нову конфигурацију и, ако је потребно, пријављује грешку кориснику. Када се сви сложе да је конфигурација нормална, онда apply_config.

Такође улоге имају метод stop, што је потребно за чишћење излаза улоге. Ако кажемо да планер више није потребан на овом серверу, он може зауставити та влакна са којима је започео init.

Улоге могу да комуницирају једна са другом. Навикли смо да пишемо позиве функција у Луа, али може се десити да дати процес нема улогу која нам је потребна. Да бисмо олакшали позиве преко мреже, користимо помоћни модул рпц (ремоте процедуре цалл), који је изграђен на основу стандардног нетбок-а уграђеног у Тарантоол. Ово може бити корисно ако, на пример, ваш мрежни пролаз жели директно да затражи од планера да одмах обави посао, уместо да чека дан.

Још једна важна тачка је осигурање толеранције грешака. Кертриџ користи СВИМ протокол за праћење здравља [КСНУМКС]. Укратко, процеси међусобно размењују „гласине“ преко УДП-а — сваки процес својим суседима говори најновије вести, а они одговарају. Ако изненада одговор не дође, Тарантоол почиње да сумња да нешто није у реду, а након неког времена рецитује смрт и почиње да саопштава свима около ову вест.

Тарантоол Цартридге: дељење Луа позадине у три реда

На основу овог протокола, Цартридге организује аутоматску обраду грешака. Сваки процес надгледа своје окружење, и ако лидер изненада престане да реагује, реплика може преузети његову улогу, а Цартридге у ​​складу са тим конфигурише покренуте улоге.

Тарантоол Цартридге: дељење Луа позадине у три реда

Овде морате бити опрезни, јер често пребацивање напред-назад може довести до сукоба података током репликације. Наравно, не би требало да омогућите насумично аутоматско пребацивање на грешку. Морамо јасно разумети шта се дешава и бити сигурни да се репликација неће прекинути након што се лидер врати и круна му буде враћена.

Из свега овога можете стећи осећај да су улоге сличне микросервисима. У извесном смислу, они су управо то, само као модули унутар Тарантоол процеса. Али постоји и низ фундаменталних разлика. Прво, све улоге пројекта морају да живе у истој бази кода. И све Тарантоол процесе треба покренути из исте базе кода, тако да нема изненађења попут оних када покушамо да иницијализујемо планер, али он једноставно не постоји. Такође, не треба дозволити разлике у верзијама кода, јер је понашање система у таквој ситуацији веома тешко предвидети и отклонити грешке.

За разлику од Доцкер-а, не можемо само да преузмемо улогу "имаге", да је однесемо на другу машину и тамо покренемо. Наше улоге нису тако изоловане као Доцкер контејнери. Такође, не можемо покренути две идентичне улоге на једној инстанци. Улога или постоји или не постоји; у извесном смислу, то је појединац. И треће, улоге морају бити исте унутар целе групе за репликацију, јер би иначе било апсурдно – подаци су исти, али је конфигурација другачија.

Алати за примену

Обећао сам да ћу показати како Цартридге помаже у примени апликација. Да би другима олакшао живот, оквир пакује РПМ пакете:

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

Инсталирани пакет садржи скоро све што вам је потребно: и апликацију и инсталиране зависности. Тарантоол ће такође стићи на сервер као зависност од РПМ пакета, а наша услуга је спремна за покретање. Ово се ради преко системд-а, али прво морате написати малу конфигурацију. У најмању руку наведите УРИ за сваки процес. На пример, три су довољне.

$ 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 као адвертисе_ури адресу; требало би да буде спољна ИП адреса, а не веза за сокет. Без тога ништа неће функционисати, тако да вам Цартридге једноставно неће дозволити да покренете чвор са погрешним адвертисе_ури.

Сада када је конфигурација спремна, можете започети процесе. Пошто обична системд јединица не дозвољава покретање више од једног процеса, апликације на Цартридге-у се инсталирају тзв. инстанциране јединице које раде овако:

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

У конфигурацији смо навели ХТТП порт на којем Цартридге опслужује веб интерфејс - 8080. Идемо до њега и погледамо:

Тарантоол Цартридге: дељење Луа позадине у три реда

Видимо да иако су процеси покренути, они још нису конфигурисани. Кертриџ још не зна ко са ким треба да реплицира и не може сам да донесе одлуку, па чека наше акције. Али немамо много избора: живот новог кластера почиње конфигурацијом првог чвора. Затим ћемо додати остале у кластер, доделити им улоге и у овом тренутку се постављање може сматрати успешно завршеним.

Хајде да сипамо чашу вашег омиљеног пића и опустимо се после дуге радне недеље. Апликација се може користити.

Тарантоол Цартридге: дељење Луа позадине у три реда

Резултати

Какви су резултати? Пробајте, користите, оставите повратне информације, креирајте тикете на Гитхуб-у.

референце

[КСНУМКС] Тарантоол » 2.2 » Референце » Роцкс референце » Модуле всхард

[КСНУМКС] Како смо имплементирали срж инвестиционог пословања Алфа-Банк заснованог на Тарантоол-у

[КСНУМКС] Архитектура наплате нове генерације: трансформација са преласком на Тарантоол

[КСНУМКС] СВИМ - протокол изградње кластера

[КСНУМКС] ГитХуб - тарантоол/цартридге-цли

[КСНУМКС] ГитХуб - тарантоол/картриџ

Извор: ввв.хабр.цом

Додај коментар