Что такое Tarantool?

«Что такое Tarantool?» — вопрос из категории Базы данных, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Tarantool — это open-source платформа, сочетающая в себе функции in-memory NoSQL базы данных и сервера приложений. С точки зрения DevOps, это высокопроизводительное решение для работы с данными, где критичны скорость отклика и низкая задержка.

Ключевые архитектурные особенности:

  • In-Memory хранение: Все данные по умолчанию хранятся в оперативной памяти, что обеспечивает микросекундную скорость доступа. Для обеспечения сохранности (persistence) используется Write-Ahead Log (WAL) и периодические снапшоты (snapshots) на диск.
  • Сервер приложений на Lua: В ядро встроен LuaJIT, позволяющий выполнять бизнес-логику (хранимые процедуры, триггеры) непосредственно на стороне БД, минимизируя сетевые задержки. Это подход "вычисления рядом с данными".
  • Горизонтальное масштабирование: Поддерживает асинхронную репликацию (master-replica) и шардинг данных через встроенный роутер (Tarantool Cartridge).

С точки зрения эксплуатации (DevOps):

  • Развертывание: Поставляется как единый исполняемый файл, что упрощает упаковку в Docker-контейнеры (tarantool/tarantool официальный образ) или развертывание на bare-metal/virtual машинах.
  • Конфигурация: Основной файл конфигурации — tarantool.yaml (или .lua), где задаются параметры инстанса, пути к WAL/snapshots, настройки репликации.
  • Мониторинг: Предоставляет HTTP-админ-интерфейс (на порту по умолчанию 8081) и метрики в формате Prometheus (/metrics). Ключевые метрики — использование памяти, латенси операций, lag репликации.
  • Типичные use-cases: Кэширование, сессионные хранилища, бэкенд для реального времени (чат, игры), агрегация метрик, очередь сообщений (через модуль queue).

Пример простого Lua-скрипта для инициализации пространства (space):

-- box - ядро СУБД Tarantool
box.cfg { listen = 3301 } -- настраиваем порт для подключений

-- Создаем пространство (аналог таблицы) для пользователей
users = box.schema.space.create('users', { if_not_exists = true })

-- Создаем первичный индекс по полю id
users:create_index('primary', {
    type = 'hash',
    parts = {1, 'unsigned'},
    if_not_exists = true
})

-- Вставляем тестовую запись
users:insert({1, 'Alice', 'alice@example.com'})