Создаем свою первую базу данных на Tarantool
Первым делом давайте установим Tarantool, запустим его и создадим простую базу данных.
Вы можете установить Tarantool и работать с ним либо локально, либо в Docker – как вам удобнее.
Для практики и тестирования мы рекомендуем использовать официальные образы Tarantool для Docker. Официальный образ содержит определенную версию Tarantool и все популярные внешние модули для Tarantool. Все необходимое уже установлено и настроено на платформе Linux. Данные образы - это самый простой способ установить и запустить Tarantool.
Примечание
Если вы никогда раньше не работали с Docker, рекомендуем сперва прочитать эту обучающую статью.
Если Docker не установлен на вашей машине, следуйте официальным инструкциям по установке для вашей ОС.
Чтобы использовать полнофункциональный экземпляр Tarantool, запустите контейнер с минимальными настройками:
$ docker run \
--name mytarantool \
-d -p 3301:3301 \
-v /data/dir/on/host:/var/lib/tarantool \
tarantool/tarantool:1
Эта команда запускает новый контейнер с именем „mytarantool“. Docker запускает его из официального образа „tarantool/tarantool:1“ с предустановленным Tarantool’ом 1.10
и всеми внешними модулями.
Tarantool будет принимать входящие подключения по адресу localhost:3301
. Можно сразу начать его использовать как key-value хранилище.
Tarantool сохраняет данные внутри контейнера. Чтобы ваше тестовые данные остались доступны после остановки контейнера, эта команда также монтирует директорию /data/dir/on/host
(здесь необходимо указать абсолютный путь до существующей локальной директории), расположенную на машине, в директорию /var/lib/tarantool
(Tarantool традиционно использует эту директорию в контейнере для сохранения данных), расположенную в контейнере. Таким образом все изменения в смонтированной директории, внесенные на стороне контейнера, также отражаются в расположенной на пользовательском диске директории.
Модуль Tarantool для работы с базой данных уже настроен и запущен в контейнере. Ручная настройка не требуется, если только вы не используете Tarantool как сервер приложений и не запускаете его вместе с приложением.
Примечание
Если ваш контейнер рушится вскоре после запуска, перейдите на эту страницу, чтобы найти возможное решение.
Чтобы подключиться к запущенному в контейнере экземпляру Tarantool, выполните эту команду:
$ docker exec -i -t mytarantool console
Эта команда:
- Дает Tarantool команду открыть порт с интерактивной консолью для входящих подключений.
- Подключается через стандартный Unix-сокет к Tarantool-серверу, запущенному внутри контейнера, из-под пользователя
admin
.
Tarantool показывает приглашение командной строки:
tarantool.sock>
Теперь вы можете вводить запросы в командной строке.
Примечание
На боевых серверах интерактивный режим Tarantool предназначен только для системных администраторов. Мы же используем его в большинстве примеров в данном руководстве, потому что интерактивный режим хорошо подходит для обучения.
Подключившись к консоли, создадим простую тестовую базу данных.
Сначала создайте первый спейс (с именем tester
):
tarantool.sock> s = box.schema.space.create('tester')
Форматируйте созданный спейс, указав имена и типы полей:
tarantool.sock> s:format({
> {name = 'id', type = 'unsigned'},
> {name = 'band_name', type = 'string'},
> {name = 'year', type = 'unsigned'}
> })
Создайте первый индекс (с именем primary
):
tarantool.sock> s:create_index('primary', {
> type = 'hash',
> parts = {'id'}
> })
Это первичный индекс по полю id
в каждом кортеже.
Вставьте в созданный спейс три кортежа (наш термин для записей):
tarantool.sock> s:insert{1, 'Roxette', 1986}
tarantool.sock> s:insert{2, 'Scorpions', 2015}
tarantool.sock> s:insert{3, 'Ace of Base', 1993}
Для выборки кортежей по первичному индексу primary
выполните команду:
tarantool.sock> s:select{3}
Теперь вывод в окне терминала выглядит следующим образом:
tarantool.sock> s = box.schema.space.create('tester')
---
...
tarantool.sock> s:format({
> {name = 'id', type = 'unsigned'},
> {name = 'band_name', type = 'string'},
> {name = 'year', type = 'unsigned'}
> })
---
...
tarantool.sock> s:create_index('primary', {
> type = 'hash',
> parts = {'id'}
> })
---
- unique: true
parts:
- type: unsigned
is_nullable: false
fieldno: 1
id: 0
space_id: 512
name: primary
type: HASH
...
tarantool.sock> s:insert{1, 'Roxette', 1986}
---
- [1, 'Roxette', 1986]
...
tarantool.sock> s:insert{2, 'Scorpions', 2015}
---
- [2, 'Scorpions', 2015]
...
tarantool.sock> s:insert{3, 'Ace of Base', 1993}
---
- [3, 'Ace of Base', 1993]
...
tarantool.sock> s:select{3}
---
- - [3, 'Ace of Base', 1993]
...
Для добавления вторичного индекса по полю band_name
используйте эту команду:
tarantool.sock> s:create_index('secondary', {
> type = 'hash',
> parts = {'band_name'}
> })
Для выборки кортежей по вторичному индексу secondary
выполните команду:
tarantool.sock> s.index.secondary:select{'Scorpions'}
---
- - [2, 'Scorpions', 2015]
...
Чтобы удалить индекс, выполните:
tarantool> s.index.secondary:drop()
---
...
После завершения тестирования для корректной остановки контейнера выполните эту команду:
$ docker stop mytarantool
Это был временный контейнер, поэтому после остановки содержимое его диска/памяти обнулилось. Но так как вы монтировали локальную директорию в контейнер, все данные Tarantool сохранились на диске вашей машины. Если вы запустите новый контейнер и смонтируете в него ту же директорию с данными, Tarantool восстановит все данные с диска и продолжит с ними работать.
Для реальных условий эксплуатации мы рекомендуем устанавливать Tarantool с помощью официального менеджера пакетов. Можно выбрать одну из трех версий: LTS, stable или beta. Автоматическая система сборки создает, тестирует и публикует пакеты после каждого коммита в соответствующую ветку репозитория Tarantool на GitHub.
Чтобы скачать и установить подходящий пакет, откройте командную строку и введите инструкции, которые даны для вашей операционной системы на странице для скачивания.
Чтобы начать работу с Tarantool, выполните эту команду:
$ tarantool
$ # при этом создается новый экземпляр Tarantool
Tarantool запускается в интерактивном режиме и показывает приглашение командной строки:
tarantool>
Теперь вы можете вводить запросы в командной строке.
Примечание
На боевых серверах интерактивный режим Tarantool предназначен только для системных администраторов. Мы же используем его в большинстве примеров в данном руководстве, потому что интерактивный режим хорошо подходит для обучения.
Далее объясняется, как создать простую тестовую базу данных после установки Tarantool.
Чтобы Tarantool хранил данные в определенном месте, создайте предназначенную специально для тестов директорию:
$ mkdir ~/tarantool_sandbox $ cd ~/tarantool_sandbox
Ее можно удалить после окончания тестирования.
Проверьте доступность порта, используемого по умолчанию для прослушивания на экземпляре базы данных.
В зависимости от версии, Tarantool может во время установки запустить экземпляр
example.lua
, который настроен на прослушивание по порту3301
по умолчанию. В файлеexample.lua
показана базовая конфигурация; его можно найти в директории/etc/tarantool/instances.enabled
или/etc/tarantool/instances.available
.Тем не менее, мы предлагаем провести установку самостоятельно с целью обучения.
Убедитесь, что свободен порт, используемый по умолчанию:
Чтобы проверить статус работы демонстрационного экземпляра, выполните команду:
$ lsof -i :3301 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME tarantool 6851 root 12u IPv4 40827 0t0 TCP *:3301 (LISTEN)
Если он запущен, отключите соответствующий процесс. В данном примере:
$ kill 6851
Чтобы запустить модуль Tarantool для работы с базой данных и сделать так, чтобы запущенный экземпляр принимал TCP-запросы на порт
3301
, выполните эту команду:tarantool> box.cfg{listen = 3301}
Создайте первый спейс (с именем
tester
):tarantool> s = box.schema.space.create('tester')
Форматируйте созданный спейс, указав имена и типы полей:
tarantool> s:format({ > {name = 'id', type = 'unsigned'}, > {name = 'band_name', type = 'string'}, > {name = 'year', type = 'unsigned'} > })
Создайте первый индекс (с именем
primary
):tarantool> s:create_index('primary', { > type = 'hash', > parts = {'id'} > })
Это первичный индекс по полю
id
в каждом кортеже.Вставьте в созданный спейс три кортежа (наш термин для записей):
tarantool> s:insert{1, 'Roxette', 1986} tarantool> s:insert{2, 'Scorpions', 2015} tarantool> s:insert{3, 'Ace of Base', 1993}
Для выборки кортежей по первичному индексу
primary
выполните команду:tarantool> s:select{3}
Теперь вывод в окне терминала выглядит следующим образом:
tarantool> s = box.schema.space.create('tester') --- ... tarantool> s:format({ > {name = 'id', type = 'unsigned'}, > {name = 'band_name', type = 'string'}, > {name = 'year', type = 'unsigned'} > }) --- ... tarantool> s:create_index('primary', { > type = 'hash', > parts = {'id'} > }) --- - unique: true parts: - type: unsigned is_nullable: false fieldno: 1 id: 0 space_id: 512 name: primary type: HASH ... tarantool> s:insert{1, 'Roxette', 1986} --- - [1, 'Roxette', 1986] ... tarantool> s:insert{2, 'Scorpions', 2015} --- - [2, 'Scorpions', 2015] ... tarantool> s:insert{3, 'Ace of Base', 1993} --- - [3, 'Ace of Base', 1993] ... tarantool> s:select{3} --- - - [3, 'Ace of Base', 1993] ...
Для добавления вторичного индекса по полю
band_name
используйте эту команду:tarantool> s:create_index('secondary', { > type = 'hash', > parts = {'band_name'} > })
Для выборки кортежей по вторичному индексу
secondary
выполните команду:tarantool> s.index.secondary:select{'Scorpions'} --- - - [2, 'Scorpions', 2015] ...
Теперь, чтобы подготовиться к примеру в следующем разделе, попробуйте следующее:
tarantool> box.schema.user.grant('guest', 'read,write,execute', 'universe')
В запросе box.cfg{listen = 3301}
, который мы отправили ранее, параметр listen
может принимать в качестве значения URI (унифицированный идентификатор ресурса) любой формы. В нашем случае это просто локальный порт 3301
. Вы можете отправлять запросы на указанный URI, используя:
telnet
,- коннектор,
- другой экземпляр Tarantool (с помощью модуля console),
- утилиту tarantoolctl.
Давайте попробуем вариант с tarantoolctl
.
Переключитесь на другой терминал. Например, в Linux-системе для этого нужно запустить еще один экземпляр Bash. В новом терминале можно сменить текущую рабочую директорию на любую другую, необязательно использовать ~/tarantool_sandbox
.
Запустите утилиту tarantoolctl
:
$ tarantoolctl connect '3301'
Данная команда означает «использовать утилиту tarantoolctl
для подключения к Tarantool-серверу, который слушает по адресу localhost:3301
».
Введите следующий запрос:
localhost:3301> box.space.tester:select{2}
Это означает «послать запрос тому Tarantool-серверу и вывести результат на экран». Результатом в данном случае будет один из кортежей, что вы вставляли ранее. В окне терминала теперь должно отображаться примерно следующее:
$ tarantoolctl connect 3301
/usr/local/bin/tarantoolctl: connected to localhost:3301
localhost:3301> box.space.tester:select{2}
---
- - [2, 'Scorpions', 2015]
...
Вы можете посылать запросы box.space...:insert{}
и box.space...:select{}
неограниченное количество раз на любом из двух запущенных экземпляров Tarantool’а.
Закончив тестирование, выполните следующие шаги:
- Для удаления спейса:
s:drop()
- Для остановки
tarantoolctl
: ctrl+C или ctrl+D - Чтобы остановить Tarantool (другой способ): стандартная Lua-функция os.exit()
- Для остановки Tarantool (из другого терминала):
sudo pkill -f tarantool
- Для удаления директории-песочницы:
rm -r ~/tarantool_sandbox