Инструменты пользователя

Инструменты сайта


databases:tarantool

Это старая версия документа!


Tarantool

Сведения

:!: Установка
  # Общее
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), бывают как минимум два типа:

  • HASH - значения уникальны, например key/value- хранилища (Map)
  • TREE - не уникальны, получается массив, у которого могут быть пропущены элементы
  • RTREE и BITSET - поиск на двумерной плоскости и работа с битовыми данными

Работа

После запуска инсталляции, подключится в режиме консоли можно:

# tarantoolctl enter <name>

Пользователи

:!: Максимальное количество пользователей - 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() для удаления)

  • read (write) - чтение/запись данных
  • execute - например вызов ф-ции или использование роли
  • create - box.schema.space.create
  • alter - box.space.x.inde.y:alter
  • drop - box.sequence.x:drop
  • usage - допустимо ли какое либо д-е независимо от других привилегий.. хз
  • session - может ли пользователь подключаться

Для создания объектов, нужна привилегия 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»

:!:
 

Пространства

box.space._space

box.space._priv

box.space._user

:!:
 

Остались вопросы:

  • перечень запущенных/рабочих инстансов
:!:
 
databases/tarantool.1640242582.txt.gz · Последнее изменение: 2021/12/23 06:56 — admin