Классическая конфигурация box.cfg (legacy 1.x/2.x)

Рейтинг: 49% · 10 голосов
Исчерпывающий курс по Tarantool 3.x: модель данных, движки memtx и vinyl, Lua и файберы, транзакции и MVCC, SQL, конфигурация (box.cfg и декларативная 3.x), репликация и Raft, шардирование vshard, эксплуатация, безопасность. 47 уроков со схемами.
Ответить
Аватара пользователя
denis_tnt
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Классическая конфигурация box.cfg (legacy 1.x/2.x)

Сообщение denis_tnt »

Оглавление курса (47)
  1. Что такое Tarantool: in-memory СУБД и сервер приложений
  2. Архитектура изнутри: процесс, потоки, event-loop
  3. Установка и первый запуск: tt CLI, пакеты, Docker
  4. Интерактив: консоль, admin-консоль, первые команды
  5. Спейсы и кортежи: форматы, типы данных
  6. Типы индексов и их применимость
  7. Движки хранения: memtx vs vinyl
  8. DDL: схема, создание спейсов и индексов, миграции
  9. DML и выборки: insert/update/upsert, итераторы
  10. Персистентность: WAL, снапшоты, recovery
  11. Внутренности memtx: аллокаторы slab/arena, память
  12. Внутренности vinyl: LSM, компакция, тюнинг
  13. Lua и LuaJIT в Tarantool: box, модули, rocks
  14. Файберы: кооперативная многозадачность, каналы
  15. Транзакции: ACID, изоляция, MVCC
  16. Хранимые процедуры, модули, организация приложения
  17. net.box: удалённые вызовы, async
  18. Пулы соединений, балансировка, реконнект
  19. Ошибки и диагностика: box.error, pcall
  20. Типы и сериализация: MsgPack, decimal, datetime, uuid
  21. SQL в Tarantool: возможности и связь с box
  22. SQL: таблицы, JOIN, подзапросы, представления
  23. SQL: подготовленные выражения, транзакции, Lua-интероп
  24. Классическая конфигурация box.cfg (legacy 1.x/2.x) (вы здесь)
  25. Декларативная конфигурация 3.x: config.yaml, иерархия
  26. Роли и приложения в 3.x
  27. Централизованная конфигурация: etcd / config storage
  28. tt CLI глубоко: разработка, сборка, запуск
  29. Cartridge (официальный legacy) и миграция на 3.x
  30. Репликация: replicaset, топологии
  31. Механика репликации: WAL-стриминг, vclock
  32. Синхронная репликация и выборы лидера (Raft)
  33. Жизненный цикл узла: bootstrap, join, rejoin
  34. vshard: router/storage, виртуальные бакеты
  35. Решардинг и rebalancing бакетов
  36. Запросы поверх шардов: map-reduce, crud
  37. Мониторинг: метрики, Prometheus, Grafana
  38. Логирование и аудит
  39. Бэкапы и восстановление
  40. Безопасность: аутентификация, RBAC, TLS
  41. Производительность: профилирование, тюнинг
  42. Обновления: схема, rolling upgrade
  43. Деплой в продакшен: Docker, топология (официальные паттерны)
  44. Администрирование через официальный TCM (Tarantool Cluster Manager)
  45. Коннекторы: Python, Go, Java
  46. Ключевые модули (rocks): crud, metrics, queue, expirationd
  47. Capstone: шардированный отказоустойчивый кластер
Обзор: что такое box.cfg и init.lua

В версиях 1.x и 2.x у Tarantool не было отдельного файла-конфига. Экземпляр настраивался императивно, прямо в коде, через единственную точку входа - функцию box.cfg{}. Эта функция делает сразу две вещи: применяет параметры (память, порт, каталоги, журналирование) и запускает движок базы данных. До первого вызова box.cfg экземпляр - это просто Lua-интерпретатор без хранилища, спейсов и сети. После вызова появляется box.space, открывается бинарный порт, запускается WAL и работают репликация и снапшоты.

Сценарий запуска складывают в обычный Lua-скрипт. Исторически его называют init.lua. Tarantool просто исполняет этот скрипт построчно: сначала box.cfg{}, потом всё прикладное - создание спейсов, индексов, функции, назначение прав. Никакой магии: это последовательная Lua-программа, где box.cfg - первый значимый шаг.
Ключевая идея legacy-трека: конфигурация - это вызов функции, а не данные. Поэтому вы можете считать значения из переменных окружения, ветвиться по if, собирать параметры в цикле. Гибко, но проверка корректности и единый источник правды полностью на вас.
Механика: как box.cfg устроен внутри

Два режима вызова. box.cfg без скобок (как свойство) возвращает таблицу текущих значений всех параметров - удобно для интроспекции. box.cfg{...} со скобками (это синтаксический сахар Lua для вызова функции с одним табличным аргументом) применяет конфигурацию.

Первый вызов = recovery. Самый первый box.cfg{} после старта процесса запускает процедуру восстановления. Tarantool заходит в work_dir, находит в memtx_dir последний снапшот (.snap), загружает его в память, затем доигрывает все .xlog из wal_dir, записанные после снапшота. Так memtx-данные целиком воссоздаются из снапшота плюс журнала. Только после этого экземпляр готов обслуживать запросы. То есть box.cfg{} - это не просто присваивание настроек, а полноценная инициализация движка с чтением диска.

Динамические и статические параметры. Большинство параметров динамические: повторный box.cfg{} меняет их на лету. Часть - только на старте (Dynamic: no), например listen меняется, а memtx_dir или wal_mode - нет. Особый случай memtx_memory: динамический, но увеличивать можно, уменьшать нельзя (память уже роздана аллокатором small).

Переменные окружения. У каждого параметра есть зеркало в окружении с префиксом TT_ (TT_LISTEN, TT_MEMTX_MEMORY). Это пригодится при сравнении с 3.x, где переменные окружения - штатный способ переопределения.

Изображение
Запуск init.lua: box.cfg, параметры, recovery

Ключевой код: минимальный init.lua

Код: Выделить всё

-- init.lua: запускаем как tarantool init.lua
box.cfg{
    listen          = 3301,                  -- бинарный порт, по умолчанию nil
    memtx_memory    = 512 * 1024 * 1024,     -- 512 МБ под тапл-данные memtx
    work_dir        = '/var/lib/tarantool/app',
    wal_dir         = 'wal',                  -- относительно work_dir
    memtx_dir       = 'snap',                 -- .snap отдельно от .xlog
    wal_mode        = 'write',               -- write|fsync|none
    log             = 'file:tarantool.log',
    log_level       = 5,                     -- info
    checkpoint_interval = 3600,              -- автоснапшот раз в час
}

-- прикладная часть выполняется ПОСЛЕ box.cfg
box.once('schema_v1', function()
    local s = box.schema.space.create('users')
    s:format({{name='id', type='unsigned'}, {name='name', type='string'}})
    s:create_index('pk', {parts = {'id'}})
    box.schema.user.create('app', {password = 'secret', if_not_exists = true})
    box.schema.user.grant('app', 'read,write', 'space', 'users')
end)
Конструкция box.once гарантирует, что блок схемы выполнится ровно один раз за жизнь базы (отметка хранится в системном спейсе), а не при каждом рестарте. Это идиома legacy-трека для безопасной инициализации.

Изменить параметр на лету (из консоли):

Код: Выделить всё

box.cfg{ memtx_memory = 1024 * 1024 * 1024 }  -- увеличили лимит памяти
box.cfg.listen                                 -- посмотреть текущее значение
box.cfg{ checkpoint_count = 4 }                -- хранить 4 последних снапшота
box.snapshot()                                 -- ручной чекпойнт прямо сейчас
Ключевые параметры (шпаргалка)

Код: Выделить всё

ПАРАМЕТР          НАЗНАЧЕНИЕ                       ПО УМОЛЧАНИЮ   ДИНАМИЧ.
listen            бинарный порт/URI                nil           да
memtx_memory      память под таплы memtx           256 МБ        да (только рост)
work_dir          рабочий каталог (chdir)          текущий       нет
memtx_dir         где лежат .snap                  "."           нет
wal_dir           где лежат .xlog                  "."           нет
wal_mode          write / fsync / none             write         нет
read_only         режим только чтение (реплика)    false         да
checkpoint_interval авто-снапшот, сек              3600          да
checkpoint_count  сколько снапшотов хранить        2             да
log / log_level   назначение и уровень логов       stderr / 5    частично
net_msg_max       лимит сетевых сообщений          768           да
Двойной трек: тот же экземпляр на 3.x (config.yaml)

В Tarantool 3.0+ настройка в коде объявлена legacy. Рекомендуемый способ - декларативный YAML-файл, где описывается вся топология кластера, а не один экземпляр. Те же параметры превращаются в иерархию ключей. Сравните один в один:

Код: Выделить всё

# config.yaml - декларативный трек 3.x
credentials:
  users:
    app:
      password: 'secret'
      roles: [super]

iproto:
  listen:
    - uri: '127.0.0.1:3301'   # аналог box.cfg{listen=3301}

memtx:
  memory: 536870912            # аналог memtx_memory = 512 МБ

wal:
  mode: write                  # аналог wal_mode

groups:
  group-001:
    replicasets:
      rs-001:
        instances:
          instance-001: {}
Разница принципиальная. В box.cfg вы пишете императив - вызов функции с побочным эффектом. В config.yaml вы описываете желаемое состояние данными, а Tarantool сам приводит экземпляр к нему и умеет хранить конфиг централизованно (etcd). Внутри 3.x всё равно в итоге дергает тот же box.cfg, но это скрыто за слоем валидации и компоновки. Подробно декларативный трек разберём в следующих уроках - сейчас важно: 1.x/2.x = box.cfg{} в init.lua, 3.x = config.yaml.

Частые заблуждения и грабли
  • "box.cfg только настраивает". Нет: первый вызов запускает recovery с чтением снапшота и журнала. На большой базе он может идти минуты.
  • Снести .xlog "чтобы освободить место". Без снапшота за нужный момент удаление .xlog ломает восстановление: memtx живёт только в памяти, его источник правды - снапшот плюс журнал.
  • Ждать, что memtx_memory уменьшится на лету. Он только растёт. Для снижения нужен рестарт. И помните: это лимит на таплы, индексы и соединения едят память сверх него.
  • wal_mode = none на мастере. Узел без WAL не может быть мастером репликации и теряет данные при падении. Используйте только для временных или кеш-сценариев.
  • Относительные пути. wal_dir и memtx_dir считаются относительно work_dir, а work_dir выполняет chdir после старта. Путаница тут - классическая причина "база не находит файлы".
  • background = true под tt. Не включайте фоновый режим для приложений, запускаемых утилитой tt - демонизацией управляет supervisor.
Мини-лаба

Создайте файл init.lua: пропишите listen = 3301, memtx_memory = 256 МБ, отдельные wal_dir и memtx_dir, checkpoint_interval = 60. Запустите tarantool init.lua. В консоли выполните box.cfg (без скобок) и найдите свои значения. Затем выполните box.cfg{checkpoint_count = 3} и box.snapshot(). Проверьте, что в каталоге memtx_dir появился свежий .snap, а в wal_dir - .xlog. Остановите и запустите экземпляр заново - убедитесь, что данные восстановились (это и есть recovery в действии).

Контрольные вопросы
  • Что именно происходит при ПЕРВОМ вызове box.cfg{} помимо применения параметров, и из каких файлов восстанавливаются memtx-данные?
  • Почему memtx_memory можно увеличить динамически, но нельзя уменьшить без рестарта?
  • Чем отличается императивная настройка через box.cfg{} в init.lua от декларативной через config.yaml в 3.x - и куда в итоге сводится YAML внутри?
  • Как соотносятся work_dir, wal_dir и memtx_dir, и почему относительные пути считаются именно от work_dir?
👍7 ❤️1 🔥1 😄 🤔3
Ответить
← Предыдущая глава
SQL: подготовленные выражения, транзакции, Lua-интероп
Следующая глава →
Декларативная конфигурация 3.x: config.yaml, иерархия

Все главы курса «Tarantool: in-memory СУБД и сервер приложений с нуля до продакшена»

Поделиться темой: ✈ Telegram VK

Вернуться в «Tarantool: СУБД и сервер приложений»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость