Документация на русском языке
поддерживается сообществом
Руководство для начинающих Создаем свою первую базу данных на Tarantool

Создаем свою первую базу данных на 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.

  1. Чтобы Tarantool хранил данные в определенном месте, создайте предназначенную специально для тестов директорию:

    $ mkdir ~/tarantool_sandbox $ cd ~/tarantool_sandbox 

    Ее можно удалить после окончания тестирования.

  2. Проверьте доступность порта, используемого по умолчанию для прослушивания на экземпляре базы данных.

    В зависимости от версии, Tarantool может во время установки запустить экземпляр example.lua, который настроен на прослушивание по порту 3301 по умолчанию. В файле example.lua показана базовая конфигурация; его можно найти в директории /etc/tarantool/instances.enabled или /etc/tarantool/instances.available.

    Тем не менее, мы предлагаем провести установку самостоятельно с целью обучения.

    Убедитесь, что свободен порт, используемый по умолчанию:

    1. Чтобы проверить статус работы демонстрационного экземпляра, выполните команду:

      $ lsof -i :3301 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME tarantool 6851 root 12u IPv4 40827 0t0 TCP *:3301 (LISTEN) 
    2. Если он запущен, отключите соответствующий процесс. В данном примере:

      $ kill 6851 
  3. Чтобы запустить модуль Tarantool для работы с базой данных и сделать так, чтобы запущенный экземпляр принимал TCP-запросы на порт 3301, выполните эту команду:

    tarantool> box.cfg{listen = 3301} 
  4. Создайте первый спейс (с именем tester):

    tarantool> s = box.schema.space.create('tester') 
  5. Форматируйте созданный спейс, указав имена и типы полей:

    tarantool> s:format({  > {name = 'id', type = 'unsigned'},  > {name = 'band_name', type = 'string'},  > {name = 'year', type = 'unsigned'}  > }) 
  6. Создайте первый индекс (с именем primary):

    tarantool> s:create_index('primary', {  > type = 'hash',  > parts = {'id'}  > }) 

    Это первичный индекс по полю id в каждом кортеже.

  7. Вставьте в созданный спейс три кортежа (наш термин для записей):

    tarantool> s:insert{1, 'Roxette', 1986} tarantool> s:insert{2, 'Scorpions', 2015} tarantool> s:insert{3, 'Ace of Base', 1993} 
  8. Для выборки кортежей по первичному индексу 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] ... 
  9. Для добавления вторичного индекса по полю band_name используйте эту команду:

    tarantool> s:create_index('secondary', {  > type = 'hash',  > parts = {'band_name'}  > }) 
  10. Для выборки кортежей по вторичному индексу secondary выполните команду:

    tarantool> s.index.secondary:select{'Scorpions'} --- - - [2, 'Scorpions', 2015] ... 
  11. Теперь, чтобы подготовиться к примеру в следующем разделе, попробуйте следующее:

    tarantool> box.schema.user.grant('guest', 'read,write,execute', 'universe') 

В запросе box.cfg{listen = 3301}, который мы отправили ранее, параметр listen может принимать в качестве значения URI (унифицированный идентификатор ресурса) любой формы. В нашем случае это просто локальный порт 3301. Вы можете отправлять запросы на указанный URI, используя:

  1. telnet,
  2. коннектор,
  3. другой экземпляр Tarantool (с помощью модуля console),
  4. утилиту 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
Нашли ответ на свой вопрос?
Обратная связь