Это старая версия документа!
# Общее apt install gnupg2 curl lsb-release # Экспортируем ключи curl https://download.tarantool.org/tarantool/release/2.8/gpgkey | sudo apt-key add - # Добавляем репозиторий echo "deb https://download.tarantool.org/tarantool/release/2.8/debian/ `lsb-release -c -s` main" | sudo tee /etc/apt/sources.list.d/tarantool_2_8.list echo "deb-src https://download.tarantool.org/tarantool/release/2.8/debian/ `lsb-release -c -s` main" | sudo tee -a /etc/apt/sources.list.d/tarantool_2_8.list # Ставим apt update && apt install tarantool
Все строится вокруг инстанса (приложения). Пользователи/роли/объекты заводятся внутри него и относятся к нему. В инстансе задается порт прослушивания, системные конфиги и т.д.
Для хранения конфигурации есть две папки «instances.available» и «instances.enabled», из второй приложения автозапускаются при старте службы. (по логике файлы создаются в первой, и при активации ссылка создается в enabled, но так чето не работает, даже если создать ссылку вручную, пока что работает если файл сразу поместить в enabled.)
Для управления служит утилита «tarantoolctl», либо «systemctl tarantool@<name_app>».
Параметры приложению можно заливать при создании, в основном файле «.lua», в интерактивном режиме, либо скриптами в процессе работы, утилитой «tarantoolctl eval app_name».
Примененные впоследствии скрипты не сохраняют своего действия при перезагрузке приложения + перезагрузка основной службы не влияет на работу приложений (инстансов).
Система может выполняться:
За основу можно взять файл «example.lua», в папке «available»
box.cfg { -- Здесь параметры остались по умолчанию } local function bootstrap() -- Создание пользователя box.schema.user.create('good', { password = 'secret' }) box.schema.user.grant('good', 'read,write,execute', 'universe') ----------------------------------- -- Пространство стикеров local stickers = box.schema.create_space('stickers') -- Индекс для файла stickers:create_index('primary', {type = 'TREE', parts = {1, 'unsigned'}}) -- Индекс для рейтинга stickers:create_index('secondary', {type = 'TREE', unique = false, parts = {2, 'integer'}}) -- Индекс для названий стикеров stickers:create_index('ternary', {type ='HASH', parts = {3, 'string', 4, 'string'}}) ----------------------------------- -- Пространство стикер-пака local packs = box.schema.create_space('packs') -- Индекс для стикер-пака packs:create_index('primary', {type = 'HASH', parts = {1, 'string'}}) -- Индекс для рейтинга пака packs:create_index('secondary', {type = 'TREE', unique = false, parts = {2, 'integer'}}) end -- При первом запуске создаем пространство и назначаем привилегии box.once('example-2.0', bootstrap)
Записи хранятся в пространствах (space), аналог таблицы в реляционной базе.
Внутри пространства находятся кортежи (tuples), похоже на строку в таблице и на JSON-массив данных.
Необходимо создавать индексы (index), бывают как минимум два типа:
После запуска инсталляции, подключится в режиме консоли можно:
# tarantoolctl enter <name>
Перечень запущенных инстансов можно просмотреть в списке процессов ОС:
# ps -ef | grep tarantoolctl
Максимальное количество пользователей - 32
Пользователи содержатся в пространстве _user
> box.space._user:select() > box.space._user:select{id}
Работа происходит через схему schema.user
> box.schema.user.create('user-name', {password= '..'}) > box.schema.user.passwd('user-name', 'new-passwd') > box.schema.user.drop('user-name') > box.schema.user.exists('user-name') > box.schema.user.info('user-name') # Возвращает хэш пароля > box.schema.user.password('user-name')
Если у пользователя нет пароля, то подключится с его помощью не получится. Он рассматривается только как внутренний. Такие могут быть полезны с процедурами с SETUID, в которых привилегии предоставляются пользователям с внешним подключением.
В системе одна основная база данных- «box.schema» (universe), содержит все объекты. Владелец- «admin»
Владельцы автоматом получают привилегии создаваемых объектов, можно делится с пользователями или ролями командой- «box.schema.user.grant()» (revoke() для удаления)
Для создания объектов, нужна привилегия create и как минимум read, write в системном пространстве.
Пару примеров:
> box.schema.user.grant('User','read,write,execute,create,drop','universe') > box.schema.user.grant('User','write', 'space', '_schema') > box.schema.user.grant('User','create,read','space','T') > box.schema.user.grant('User','drop','sequence') > box.schema.user.grant('User','execute','function','F') > box.schema.user.grant('User','create','role')
Функция будет выполняться с привилегиями внутреннего пользователя, вызываясь при этом другим пользователем.
box.schema.space.create('u') box.schema.space.create('i') box.space.u:create_index('pk') box.space.i:create_index('pk') box.schema.user.create('inner-user') box.schema.user.grant('inner-user', 'read,write', 'space', 'u') box.schema.user.grant('inner-user', 'read,write', 'space', 'i') box.schema.user.grant('inner-user', 'create', 'universe') box.schema.user.grant('inner-user', 'read,write', 'space', '_func') function read_and_modify(key) local u= box.space.u local i= box.space.i local fiber= require('fiber') local t= u:get{key} if t ~= nil then u:put{key, box.session.uid()} i:put{key, fiber.time()} end end box.session.su('inner-user') box.schema.func.create('read_and_modify', {setuid= true}) box.session.su('admin') box.schema.user.create('public-user', {password= 'secret'}) box.schema.user.grant('public-user', 'execute', 'function', 'read_and_modify')
Роли являются контейнерами привилегий, которые могут применяться к пользователям. Информация о ролях хранится в пространстве «_user»- третье поле является ролью.
«usage» и «session» - не могут быть назначены ролями.
Роли могут быть вложенными, т.е. `роль2` может содержать в себе `роль1`, тогда к пользователю будет применена `роль2` вместе с `роль1` неявно.
Есть два способа управлять ролями:
> box.schema.user.grant-or-revoke(user-name-or-role-name,'execute', 'role',role-name...) > box.schema.user.grant-or-revoke(user-name-or-role-name,role-name...)
Пару примеров:
> box.schema.role.create('Role1') > box.schema.role.grant('Role1', 'Role2') > box.schema.user.grant('User1', 'Role1') -- Даже после связки ролей, изменения применятся > box.schema.role.grant('Role2', 'read,write', 'space', 'T')
В консольном режиме «fiber= require('fiber')», и далее через эту переменную можно получить информацию о работающих потоках, есть целый ряд методов.
Интерпретатор скриптов: «/usr/bin/evn tarantool», с помощью его можно иcполнить любой скрипт на lua.
Можно просто дать скрипт аргументом процессу он его выполнить и завершится: «tarantool my-script.lua»
Остались вопросы: