Tarantool Cartridge: sharding Lua backend hauv peb kab

Tarantool Cartridge: sharding Lua backend hauv peb kab

Ntawm Mail.ru Group peb muaj Tarantool - qhov no yog daim ntawv thov neeg rau zaub mov hauv Lua, uas tseem muab ob npaug rau hauv cov ntaub ntawv (lossis lwm qhov?). Nws ceev thiab txias, tab sis lub peev xwm ntawm ib tus neeg rau zaub mov tseem tsis muaj qhov txwv. Vertical scaling kuj tsis yog panacea, yog li Tarantool muaj cov cuab yeej rau kev ntsuas kab rov tav - lub vshard module [1]. Nws tso cai rau koj kom shard cov ntaub ntawv hla ntau lub servers, tab sis koj yuav tsum tau tinker nrog nws los teeb tsa thiab xa cov kev lag luam logic.

Xov xwm zoo: peb tau sau qee qhov kev txhaj tshuaj loj (xws li [2], [3]) thiab tsim lwm lub moj khaum uas yuav ua kom yooj yim rau txoj kev daws teeb meem no.

Tarantool Cartridge yog lub moj khaum tshiab rau kev tsim cov txheej txheem sib faib. Nws tso cai rau koj tsom mus rau kev sau cov kev lag luam logic es tsis txhob daws cov teeb meem hauv vaj tse. Hauv qab no qhov kev txiav kuv yuav qhia koj seb lub moj khaum no ua haujlwm li cas thiab yuav sau cov kev pabcuam faib li cas siv nws.

Qhov teeb meem yog dab tsi?

Peb muaj tarantula, peb muaj vshard - dab tsi ntxiv koj xav tau?

Ua ntej, nws yog ib qho teeb meem ntawm kev yooj yim. Lub vshard configuration yog configured los ntawm Lua rooj. Rau ib qho kev faib tawm ntawm ntau cov txheej txheem Tarantool ua haujlwm kom raug, kev teeb tsa yuav tsum zoo ib yam txhua qhov chaw. Tsis muaj leej twg xav ua qhov no manually. Yog li ntawd, txhua yam kev sau ntawv, Ansible, thiab kev xa tawm tau siv.

Cartridge nws tus kheej tswj lub vshard configuration, nws ua qhov no raws li nws tus kheej faib configuration. Nws yog ib qho tseem ceeb ntawm YAML cov ntaub ntawv yooj yim, ib daim qauv uas tau muab khaws cia hauv txhua qhov piv txwv Tarantool. Qhov yooj yim yog tias lub moj khaum nws tus kheej saib xyuas nws cov teeb tsa thiab xyuas kom meej tias nws zoo ib yam nyob txhua qhov chaw.

Во-вторых, дело снова в удобстве. Конфигурация вшард не имеет никакого отношения к разработке бизнес-логики и только отвлекает программиста от работы. Когда мы обсуждаем архитектуру того или иного проекта, то чаще всего речь идёт об отдельных компонентах и их взаимодействии. О выкатке кластера на 3 датацентра думать рано.

Мы решали эти проблемы раз за разом, и в какой-то момент у нас получилось выработать подход, позволяющий упростить работу с приложением на всем его жизненном цикле: создание, разработка, тестирование, CI/CD, сопровождение.

Cartridge qhia lub tswv yim ntawm lub luag haujlwm rau txhua tus txheej txheem Tarantool. Lub luag haujlwm yog lub tswv yim uas tso cai rau tus tsim tawm tsom mus rau kev sau cov lej. Txhua lub luag haujlwm muaj nyob hauv qhov project tuaj yeem khiav ntawm ib qho piv txwv Tarantool, thiab qhov no yuav txaus rau kev xeem.

Cov yam ntxwv tseem ceeb ntawm Tarantool Cartridge:

  • automated pawg orchestration;
  • расширение функциональности приложения с помощью новых ролей;
  • daim ntawv thov template rau kev txhim kho thiab xa mus;
  • built-in tsis siv neeg sharding;
  • kev koom ua ke nrog Luatest kev xeem lub moj khaum;
  • управление кластером с помощью WebUI и API;
  • ntim thiab xa tawm cov cuab yeej.

Nyob zoo, Ntiaj Teb!

Kuv tsis tuaj yeem tos kom qhia lub moj khaum nws tus kheej, yog li peb yuav tawm hauv zaj dab neeg txog kev tsim qauv rau tom qab thiab pib nrog qee yam yooj yim. Yog tias peb xav tias Tarantool nws tus kheej twb tau teeb tsa, ces txhua yam uas tseem tshuav yog ua

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

Ob cov lus txib no yuav nruab cov kab lus hais kom ua thiab tso cai rau koj los tsim koj thawj daim ntawv thov los ntawm tus qauv:

$ cartridge create --name myapp

Thiab qhov no yog qhov peb tau txais:

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-репозиторий с готовым «Hello, World!» приложением. Давайте сразу попробуем его запустить, предварительно установив зависимости (в т.ч. сам фреймворк):

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

Итак, у нас запущена одна нода будущего шардированного приложения. Любознательный обыватель может сразу открыть веб-интерфейс, мышкой сконфигурировать кластер из одного узла и наслаждаться результатом, но радоваться пока рано. Пока что приложение не умеет делать ничего полезного, поэтому про деплой я расскажу потом, а сейчас наступает время писать код.

Kev txhim kho kev thov

Вот представьте, мы дизайним проект, который должен принимать данные, сохранять их и раз в сутки строить отчёт.

Tarantool Cartridge: sharding Lua backend hauv peb kab

Мы начинаем рисовать схему, и помещаем на неё три компонента: gateway, storage и scheduler. Прорабатываем архитектуру дальше. Раз мы используем в качестве хранилища vshard, то добавляем в схему vshard-router и vshard-storage. Ни gateway, ни scheduler обращаться в хранилище напрямую не будут, для этого есть роутер, он для того и создан.

Tarantool Cartridge: sharding Lua backend hauv peb kab

Эта схема всё ещё не совсем точно отражает то, что мы будем создавать в проекте, потому что компоненты выглядят абстрактно. Нужно ещё посмотреть, как это спроецируется на реальный Tarantool — сгруппируем наши компоненты по процессам.

Tarantool Cartridge: sharding Lua backend hauv peb kab

Tsis muaj qhov taw tes me me hauv kev khaws vshard-router thiab rooj vag ntawm qhov sib txawv. Vim li cas peb yuav tsum tau nthwv dej ntawm lub network ib zaug yog tias qhov no twb yog lub luag haujlwm ntawm router? Lawv yuav tsum tau khiav hauv tib txoj kev. Ntawd yog, ob lub rooj vag thiab vshard.router.cfg tau pib ua haujlwm hauv ib txheej txheem, thiab cia lawv cuam tshuam hauv zos.

Nyob rau theem tsim, nws yooj yim rau kev ua haujlwm nrog peb yam, tab sis kuv, raws li tus tsim tawm, thaum sau tus lej, tsis xav xav txog kev pib peb zaug ntawm Tarnatool. Kuv yuav tsum tau khiav cov kev xeem thiab xyuas tias kuv sau lub rooj vag kom raug. Los yog tej zaum kuv xav ua qauv qhia rau kuv cov npoj yaig. Vim li cas kuv thiaj yuav tsum mus dhau qhov teeb meem ntawm kev xa peb daim ntawv luam? Qhov no yog li cas lub tswvyim ntawm lub luag haujlwm tau yug los. Lub luag hauj lwm yog ib tug niaj hnub lush module uas nws lub neej voj voog yog tswj los ntawm Cartridge. Hauv qhov piv txwv no muaj plaub ntawm lawv - rooj vag, router, cia, teem sijhawm. Tej zaum yuav muaj ntau dua hauv lwm qhov project. Txhua lub luag haujlwm tuaj yeem khiav hauv ib txheej txheem, thiab qhov no yuav txaus.

Tarantool Cartridge: sharding Lua backend hauv peb kab

Thiab thaum nws los txog rau kev xa mus rau staging lossis ntau lawm, peb yuav muab txhua tus txheej txheem Tarantool nws tus kheej lub luag haujlwm nyob ntawm qhov muaj peev xwm kho vajtse:

Tarantool Cartridge: sharding Lua backend hauv peb kab

Kev tswj hwm topology

Cov ntaub ntawv hais txog qhov twg lub luag haujlwm yuav tsum tau muab khaws cia rau qhov chaw. Thiab qhov no "qhov chaw" yog qhov kev faib tawm, uas kuv twb tau hais saum toj no. Qhov tseem ceeb tshaj plaws ntawm nws yog pawg topology. Nov yog 3 pawg replication ntawm 5 cov txheej txheem Tarantool:

Tarantool Cartridge: sharding Lua backend hauv peb kab

Peb tsis xav poob cov ntaub ntawv, yog li peb kho cov ntaub ntawv hais txog kev khiav haujlwm nrog kev saib xyuas. Cartridge khaws cov kev teeb tsa uas siv ob-theem kev cog lus. Thaum peb xav hloov kho qhov teeb tsa, nws ua ntej kuaj xyuas tias txhua qhov xwm txheej muaj thiab npaj los lees txais qhov kev teeb tsa tshiab. Tom qab no, theem thib ob siv lub config. Yog li, txawm tias ib daim ntawv luam tawm mus ib ntus, tsis muaj dab tsi phem yuav tshwm sim. Lub configuration yuav tsuas tsis raug siv thiab koj yuav pom ib qho yuam kev ua ntej.

Tsis tas li nyob rau hauv ntu topology, xws li ib qho tseem ceeb parameter raws li tus thawj coj ntawm txhua pawg replication yog qhia. Feem ntau qhov no yog daim ntawv uas raug kaw. Cov seem feem ntau yog nyeem nkaus xwb, txawm tias yuav muaj kev zam. Qee lub sij hawm cov neeg tsim khoom siab tawv tsis ntshai ntawm kev tsis sib haum xeeb thiab tuaj yeem sau cov ntaub ntawv rau ntau qhov kev sib txuas ua ke, tab sis muaj qee qhov haujlwm uas, tsis muaj teeb meem dab tsi, yuav tsum tsis txhob ua ob zaug. Rau qhov no muaj ib tug kos npe rau ntawm ib tug thawj coj.

Tarantool Cartridge: sharding Lua backend hauv peb kab

Lub neej ntawm lub luag haujlwm

Чтобы абстрактная роль могла существовать в такой архитектуре, фреймворк должен ими как-то управлять. Естественно, управление происходит без перезапуска процесса Tarantool. Для управления ролями существует 4 колбека. Cartridge сам будет их вызвать в зависимости от того, что у него написано в распределённой конфигурации, тем самым применяя конфигурацию к конкретным ролям.

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

У каждой роли есть функция init. Она вызывается один раз либо при включении роли, либо при перезапуске Tarantool’а. Там удобно, например, инициализировать box.space.create, или scheduler может запустить какой-нибудь фоновый fiber, который будет выполнять работу через определённые интервалы времени.

Одной функции init tej zaum yuav tsis txaus. Cartridge tso cai rau lub luag haujlwm los ua kom zoo dua ntawm qhov kev faib tawm uas nws siv los khaws cov topology. Peb tuaj yeem tshaj tawm ib ntu tshiab hauv tib qhov kev teeb tsa thiab khaws ib feem ntawm kev lag luam teeb tsa hauv nws. Hauv kuv qhov piv txwv, qhov no tuaj yeem yog cov ntaub ntawv schema lossis lub sijhawm teem sijhawm rau lub luag haujlwm teem sijhawm.

Pawg hu validate_config и apply_config txhua lub sij hawm tus faib configuration hloov. Thaum ib qho kev teeb tsa raug siv los ntawm ob-theem kev cog lus, pawg kuaj xyuas tias txhua lub luag haujlwm tau npaj los lees txais qhov kev teeb tsa tshiab no thiab, yog tias tsim nyog, qhia txog qhov yuam kev rau tus neeg siv. Thaum txhua tus pom zoo tias qhov kev teeb tsa yog qhov qub, ces qhov apply_config.

Также у ролей есть метод stop, который нужен для очистки результатов жизнедеятельности роли. Если мы говорим, что scheduler на этом сервере больше не нужен, он может остановить те файберы, которые запускал с помощью init.

Роли могут взаимодействовать между собой. Мы привыкли писать вызовы функций на Lua, но может случиться так, что в данном процессе нет нужной нам роли. Чтобы облегчить обращения по сети, мы используем вспомогательный модуль rpc (remote procedure call), который построен на основе стандартного netbox, встроенного в Tarantool. Это может пригодиться, если, например, ваш gateway захочет напрямую попросить scheduler сделать работу прямо сейчас, а не ждать сутки.

Ещё один важный момент — обеспечение отказоустойчивости. Для мониторинга здоровья в Cartridge используется протокол SWIM [4]. Hauv luv luv, cov txheej txheem pauv "lus xaiv" nrog ib leeg dhau UDP-txhua tus txheej txheem qhia nws cov neeg nyob ze cov xov xwm tshiab kawg, thiab lawv teb. Yog tias mam li nco dheev cov lus teb tsis tuaj, Tarantool pib xav tias ib yam dab tsi tsis ncaj ncees lawm, thiab tom qab ib pliag nws rov hais txog kev tuag thiab pib qhia txhua tus neeg nyob ib puag ncig cov xov xwm no.

Tarantool Cartridge: sharding Lua backend hauv peb kab

На основе этого протокола Cartridge организует автоматическую обработку отказов. Каждый процесс следит за своим окружением, и если лидер вдруг перестал отвечать, то реплика может взять его роль на себя, а Cartridge соответствующим образом конфигурирует запущенные роли.

Tarantool Cartridge: sharding Lua backend hauv peb kab

Koj yuav tsum tau ceev faj ntawm no, vim tias nquag hloov mus rau sab nraud tuaj yeem ua rau cov ntaub ntawv tsis sib haum xeeb thaum rov ua dua. Tau kawg, koj yuav tsum tsis txhob ua kom tsis siv neeg tsis ua haujlwm ntawm random. Peb yuav tsum to taub meej txog qhov tshwm sim thiab nco ntsoov tias kev rov ua dua yuav tsis tawg tom qab tus thawj coj rov qab los thiab lub kaus mom rov qab los rau nws.

Los ntawm tag nrho cov no, koj tuaj yeem xav tias lub luag haujlwm zoo ib yam li microservices. Hauv kev nkag siab, lawv tsuas yog qhov ntawd, tsuas yog raws li cov qauv hauv cov txheej txheem Tarantool. Tab sis kuj tseem muaj ntau qhov sib txawv tseem ceeb. Ua ntej, txhua txoj haujlwm ua haujlwm yuav tsum nyob hauv tib lub hauv paus code. Thiab tag nrho cov txheej txheem Tarantool yuav tsum tau pib los ntawm tib lub hauv paus, kom tsis muaj qhov xav tsis thoob li cov thaum peb sim pib lub sijhawm teem sijhawm, tab sis nws tsuas tsis muaj nyob. Tsis tas li ntawd, koj yuav tsum tsis txhob tso cai rau qhov sib txawv ntawm cov code versions, vim hais tias tus cwj pwm ntawm lub system nyob rau hauv xws li ib tug teeb meem yog heev nyuaj rau kwv yees thiab debug.

Tsis zoo li Docker, peb tsis tuaj yeem ua lub luag haujlwm "duab", coj nws mus rau lwm lub tshuab thiab khiav nws nyob ntawd. Peb lub luag haujlwm tsis raug cais raws li Docker ntim. Tsis tas li ntawd, peb tsis tuaj yeem khiav ob lub luag haujlwm zoo ib yam ntawm ib qho piv txwv. Ib lub luag haujlwm yog muaj los yog tsis muaj; hauv kev nkag siab, nws yog ib leeg. Thiab qhov thib peb, lub luag haujlwm yuav tsum yog tib yam nyob rau hauv tag nrho cov replication pawg, vim hais tias txwv tsis pub nws yuav absurd - cov ntaub ntawv yog tib yam, tab sis cov configuration yog txawv.

Cov cuab yeej siv

Я обещал показать, как Cartridge помогает деплоить приложения. Чтобы облегчить жизнь окружающим, фреймворк упаковывает RPM-пакеты:

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

Lub pob teeb tsa muaj yuav luag txhua yam uas koj xav tau: ob qho tib si daim ntawv thov thiab cov kev vam khom. Tarantool tseem yuav tuaj txog ntawm tus neeg rau zaub mov raws li qhov kev vam khom ntawm pob RPM, thiab peb cov kev pabcuam tau npaj rau kev tshaj tawm. Qhov no yog ua los ntawm systemd, tab sis ua ntej koj yuav tsum tau sau me ntsis configuration. Yam tsawg kawg nkaus, qhia URI ntawm txhua tus txheej txheem. Peb yog txaus rau piv txwv.

$ 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

Muaj ib qho nthuav nuance ntawm no. Hloov chaw tsuas yog qhov chaw nres nkoj binary raws tu qauv, peb qhia tag nrho cov chaw nyob pej xeem ntawm tus txheej txheem suav nrog lub npe hostname. Qhov no yog qhov tsim nyog kom cov pawg nodes paub txuas mus rau ib leeg. Nws yog ib lub tswv yim phem uas siv 0.0.0.0 raws li advertise_uri chaw nyob; nws yuav tsum yog qhov chaw nyob sab nraud IP, tsis yog lub qhov (socket) khi. Yog tsis muaj nws, tsis muaj dab tsi yuav ua hauj lwm, yog li Cartridge tsuas yuav tsis cia koj tso lub node nrog advertise_uri tsis ncaj ncees lawm.

Tam sim no hais tias lub configuration yog npaj txhij, koj tuaj yeem pib cov txheej txheem. Txij li cov chav tsev tsis tu ncua tsis pub ntau tshaj ib txoj kev pib, cov ntawv thov ntawm Cartridge raug teeb tsa los ntawm qhov hu ua. instantiated units uas ua haujlwm zoo li no:

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

В конфигурации мы указали HTTP-порт, на котором Cartridge обслуживает веб-интерфейс — 8080. Зайдём на него и посмотрим:

Tarantool Cartridge: sharding Lua backend hauv peb kab

Peb pom tias txawm hais tias cov txheej txheem tab tom khiav, lawv tseem tsis tau teeb tsa. Daim cartridge tseem tsis tau paub tias leej twg yuav tsum rov ua dua nrog leej twg thiab tsis tuaj yeem txiav txim siab ntawm nws tus kheej, yog li nws tseem tos peb qhov kev ua. Tab sis peb tsis muaj ntau txoj kev xaiv: lub neej ntawm ib pawg tshiab pib nrog kev teeb tsa ntawm thawj lub pob. Tom qab ntawd peb yuav ntxiv lwm tus rau hauv pawg, muab lawv lub luag haujlwm, thiab ntawm qhov no, kev xa tawm tuaj yeem suav tias ua tiav tiav.

Cia peb ncuav ib khob ntawm koj nyiam haus thiab so tom qab lub lim tiam ua haujlwm ntev. Daim ntawv thov tuaj yeem siv tau.

Tarantool Cartridge: sharding Lua backend hauv peb kab

Cov txiaj ntsim tau los

Cov txiaj ntsig yog dab tsi? Sim nws, siv nws, tawm tswv yim, tsim daim pib ntawm Github.

ua tim khawv

[1] Tarantool » 2.2 » Reference » Rocks reference » Module vshard

[2] Yuav ua li cas peb tau siv lub hauv paus ntawm Alfa-Bank kev nqis peev ua lag luam raws li Tarantool

[3] Tshiab tiam sau nqi architecture: kev hloov pauv nrog kev hloov mus rau Tarantool

[4] SWIM - pawg kev tsim kho raws tu qauv

[5] GitHub - tarantool/cartridge-cli

[6] GitHub - tarantool/cartridge

Tau qhov twg los: www.hab.com

Ntxiv ib saib