Создаем свое первое приложение на Tarantool Cartridge
Здесь мы показываем, как сделать простое кластерное приложение.
Первым делом настройте среду разработки.
Затем создайте приложение с именем myapp
. Выполните:
$ cartridge create --name myapp
Эта команда создает новое Tarantool Cartridge-приложение в директории ./myapp
. Там теперь содержатся созданные по шаблону файлы и директории.
Войдите внутрь этой директории и запустите ваше приложение:
$ cd ./myapp
$ cartridge build
$ cartridge start
Эта команда собирает приложение локально, стартует 5 экземпляров Tarantool и запускает приложение в том виде, как оно было создано – без какой-либо интересной бизнес-логики.
Откуда взялись 5 экземпляров? Загляните внутрь файла instances.yml
.Там задается конфигурация всех экземпляров, которые вы можете настроить внутри вашего кластера. По умолчанию, там задана конфигурация 5 экземпляров.
myapp.router:
workdir: ./tmp/db_dev/3301
advertise_uri: localhost:3301
http_port: 8081
myapp.s1-master:
workdir: ./tmp/db_dev/3302
advertise_uri: localhost:3302
http_port: 8082
myapp.s1-replica:
workdir: ./tmp/db_dev/3303
advertise_uri: localhost:3303
http_port: 8083
myapp.s2-master:
workdir: ./tmp/db_dev/3304
advertise_uri: localhost:3304
http_port: 8084
myapp.s2-replica:
workdir: ./tmp/db_dev/3305
advertise_uri: localhost:3305
http_port: 8085
Вы можете увидеть все эти экземпляры в веб-интерфейсе для управления кластером по адресу http://localhost:8081 (порт 8081 – это HTTP-порт первого экземпляра из файла instances.yml
).

Теперь временно остановите кластер с помощью Ctrl + C
.
Пора заняться написанием бизнес-логики для вашего приложения. Чтобы не слишком усложнять наш пример, возьмем канонический «Hello world!»«.
Переименуйте шаблонный файл app/roles/custom.lua
в hello-world.lua
.
$ mv app/roles/custom.lua app/roles/hello-world.lua
Это будет ваша роль. Роль в Tarantool Cartridge – это Lua-модуль, в котором реализованы специфичные для экземпляра Tarantool функции и логика. Далее мы покажем, как добавлять в роль свой код, собирать ее, назначать и тестировать.
У вашей роли уже есть некоторый код внутри функции init()
.
local function init(opts) -- luacheck: no unused args
-- if opts.is_master then
-- end
local httpd = cartridge.service_get('httpd')
httpd:route({method = 'GET', path = '/hello'}, function()
return {body = 'Hello world!'}
end)
return true
end
Этот код экспортирует конечную точку /hello
для выполнения HTTP-запросов. Например, для первого экземпляра из файла instances.yml
это будет http://localhost:8081/hello . Если вы зайдете по этому адресу в браузере после того, как роль будет назначена (чуть позже мы покажем, как это делается), то увидите на странице слова «Hello world!».
Добавим сюда еще немного кода.
local function init(opts) -- luacheck: no unused args
-- if opts.is_master then
-- end
local httpd = cartridge.service_get('httpd')
httpd:route({method = 'GET', path = '/hello'}, function()
return {body = 'Hello world!'}
end)
local log = require('log')
log.info('Hello world!')
return true
end
Здесь мы пишем «Hello, world!» в консоль в момент назначения роли, что даст вам возможность отследить данное событие. Пока ничего сложного.
Далее изменим значение параметра role_name
в «return»-блоке файла hello-world.lua
. Этот текст будет показан в качестве имени вашей роли в веб-интерфейсе для управления кластером.
return {
role_name = 'Hello world!',
init = init,
stop = stop,
validate_config = validate_config,
apply_config = apply_config,
}
Последнее, что осталось сделать — это добавить вашу роль в список доступных ролей кластера, в файл init.lua
.
local ok, err = cartridge.cfg({
workdir = 'tmp/db',
roles = {
'cartridge.roles.vshard-storage',
'cartridge.roles.vshard-router',
'app.roles.hello-world'
},
cluster_cookie = 'myapp-cluster-cookie',
})
Теперь кластер будет знать про вашу роль.
Почему мы указали app.roles.hello-world
? По умолчанию, имя роли в данном файле должно включать в себя полный путь от корня приложения (./myapp
) до файла роли (app/roles/hello-world.lua
).
Отлично! Роль готова. Теперь заново соберите и запустите ваше приложение:
$ cartridge build
$ cartridge start
Все экземпляры запущены, но они пока ничего не делают, а ждут, что им назначат роли.
Экземпляры (реплики) в кластере Tarantool Cartridge должны быть собраны в наборы реплик. Роли назначаются каждому набору, и любой экземпляр в наборе реплик видит все роли, которые назначены этому набору.
Давайте создадим набор реплик, в котором будет всего один экземпляр, и назначим этому набору вашу роль.
Откройте веб-интерфейс для управления кластером по адресу http://localhost:8081.
Нажмите кнопку Configure.
Установите флажок напротив роли
Hello world!
, чтобы назначить ее. Заметьте, что имя роли здесь совпадает с тем текстом, который вы задали в параметреrole_name
в файлеhello-world.lua
.(По желанию) Задайте имя набора реплик, например «hello-world-replica-set».
Нажмите кнопку Create replica set. Информация о вашем наборе реплик появится в веб-интерфейсе.

Итак, ваша роль назначена. В консоли вы можете увидеть такое сообщение:

А если вы сейчас откроете в браузере страницу http://localhost:8081/hello , то увидите ответ вашей роли на HTTP GET-запрос.

Все работает! Что же дальше?
- Загляните в это руководство, чтобы настроить оставшиеся наборы реплик и опробовать разные кластерные возможности.
- Посмотрите эти примеры приложений и реализуйте более сложную логику для вашей роли.
- Упакуйте ваше приложение для дальнейшего распространения. Вы можете выбрать любой из поддерживаемых видов пакетов: DEB, RPM, архив TGZ или Docker-образ.