Интерактив: консоль, admin-консоль, первые команды

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

Интерактив: консоль, admin-консоль, первые команды

Сообщение 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: шардированный отказоустойчивый кластер
О чём урок

В прошлых уроках мы поставили инстанс и научили его подниматься. Теперь нужно с ним поговорить. У Tarantool есть несколько каналов связи с живым процессом, и они принципиально разные по протоколу, правам и назначению. Разобравшись в их механике, вы перестанете путать "почему здесь admin без пароля, а там guest и access denied".

Три способа подключиться:
  • Интерактивная консоль tt - обёртка от утилиты tt, которой вы пользуетесь чаще всего.
  • Admin-сокет (console socket) - текстовый административный канал, Unix-сокет, пользователь всегда admin.
  • net.box - программный клиент по бинарному протоколу iproto, тот же канал, что использует приложение.
Как это устроено внутри

У работающего инстанса есть два разных слушающих интерфейса, и это ключ ко всему уроку.

Бинарный порт (iproto). Задаётся через iproto.listen (в 3.x) или box.cfg{listen=...} (классика). По нему общаются драйверы, репликация и net.box. Протокол двоичный, на базе MessagePack, называется iproto. Подключение требует аутентификации: если логин/пароль не передали, вы входите как guest - пользователь с минимальными правами. Поэтому "голый" net.box к чужому инстансу часто упирается в access denied: guest по умолчанию почти ничего не может.

Admin-сокет (console). Это отдельный канал. Утилита tt при старте инстанса автоматически создаёт Unix-сокет в рабочем каталоге (обычно var/run/<инстанс>/tarantool.control). По нему работает текстовый протокол: вы шлёте строку Lua, сервер скармливает её встроенному интерпретатору и возвращает результат в YAML. Здесь нет аутентификации по паролю - сам факт доступа к файлу-сокету и есть авторизация (доступ к нему регулируется правами ОС на файл). Поэтому текущий пользователь в admin-консоли всегда admin со всеми правами. Это локальный канал для оператора, не для приложений.

Что делает tt connect. Команда умеет оба режима и выбирает его по аргументу:
  • Передали имя инстанса (create_db:instance001) - tt идёт через локальный admin-сокет. Аутентификация не нужна, вы admin.
  • Передали URI (127.0.0.1:3301 или user:pass@host:port) - tt открывает удалённое соединение по бинарному порту (фактически net.box внутри). Без креденшелов вы guest, со связкой user:pass - указанный пользователь.
Эта развилка - источник львиной доли путаницы новичков. Одна и та же команда tt connect даёт совершенно разные права в зависимости от того, дали вы ей имя или адрес.

Изображение
Три канала к инстансу: tt, admin-сокет, net.box

Первые команды

Поднимаем инстанс из прошлого урока и проверяем статус:

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

$ tt start create_db
$ tt status create_db
INSTANCE               STATUS   PID   MODE  CONFIG  BOX      UPSTREAM
create_db:instance001  RUNNING  8685  RW    ready   running  --
Подключение через admin-сокет (по имени).

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

$ tt connect create_db:instance001
   • Connecting to the instance...
   • Connected to create_db:instance001

create_db:instance001>
Внутри - обычный Lua. Любое выражение исполняется, результат печатается в YAML:

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

create_db:instance001> box.info.ro
---
- false
...
create_db:instance001> 2 + 2
---
- 4
...
Проверим, что мы действительно admin, и создадим простую схему:

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

box.session.user()        -- 'admin'
box.schema.space.create('bands')
box.space.bands:format({
    { name = 'id',        type = 'unsigned' },
    { name = 'band_name', type = 'string'   },
    { name = 'year',      type = 'unsigned' }
})
box.space.bands:create_index('primary', { parts = { 'id' } })
box.space.bands:insert{ 1, 'Roxette', 1986 }
box.space.bands:select{ 1 }
Выйти из консоли - Ctrl+D или \q (это не останавливает инстанс, закрывается только клиент).

Подключение по URI (бинарный порт). Та же утилита, но уже net.box-канал и guest:

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

$ tt connect 127.0.0.1:3301
Если в config.yaml guest не выдали прав, вы получите ошибку доступа. Чтобы попробовать удалённый канал в учебных целях, выдайте guest минимальное право (в проде так делать нельзя - это открывает удалённое исполнение кода):

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

-- выполнить ОДИН раз в admin-консоли
box.schema.user.grant('guest', 'execute', 'universe', nil, { if_not_exists = true })
net.box из кода. Тот же бинарный протокол, но программно. Откройте вторую admin-консоль и наберите:

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

local netbox = require('net.box')
local conn = netbox.connect('127.0.0.1:3301')
conn:ping()                              -- true
conn.space.bands:select{ 1 }             -- удалённый select
conn:call('box.info')                    -- вызов функции на той стороне
conn:eval('return 2 + 2')                -- выполнить Lua удалённо (нужно право execute)
conn:close()
Обратите внимание: conn.space.bands:select{...} выглядит как локальный вызов, но под капотом это сетевой запрос iproto к удалённому инстансу. Именно так работает приложение в проде - через net.box, а не через admin-сокет.

Частые заблуждения и грабли
"tt connect всегда даёт права админа." Нет. Права админа вы получаете только по admin-сокету (подключение по имени инстанса). По URI вы guest, пока не указали пользователя.
  • access denied у guest. Сообщение вида "Execute access denied for user 'guest'" или "Read access denied" означает, что вы зашли по бинарному порту без прав. Решение для учёбы - grant guest; для прода - заведите отдельного пользователя с точечными правами.
  • Admin-сокет - это не сетевой порт. Это файл на диске. Удалённо по нему не подключиться: нужен либо доступ к файловой системе хоста, либо проброс. Не путайте его с iproto.listen.
  • Опасность grant execute на universe. Это фактически удалённое исполнение произвольного Lua кем угодно, кто достучался до порта. Годится только для локальной песочницы.
  • Ctrl+C против Ctrl+D. В консоли Ctrl+D (или \q) закрывает клиента. Инстанс продолжает работать. Остановить его - отдельной командой tt stop.
  • Переключение языка. В консоли можно переключиться на SQL командой \set language sql и обратно \set language lua. По умолчанию активен Lua.
  • Текстовый YAML-вывод - только для людей. Не парсите его из скриптов; для программного доступа есть net.box с нативными Lua-значениями.
Мини-лаба
  • Запустите create_db и зайдите через admin-сокет по имени. Выполните box.session.user() и убедитесь, что вы admin.
  • Создайте спейс bands со схемой и primary-индексом, вставьте пару кортежей.
  • Выдайте guest право execute на universe. Откройте net.box-соединение к 127.0.0.1:3301, сделайте conn:ping() и удалённый select из bands.
  • Сравните: какой пользователь активен в admin-консоли и какой - при подключении по URI без креденшелов?
Контрольные вопросы
  • Чем admin-сокет отличается от бинарного порта по протоколу, по транспорту и по аутентификации?
  • Почему tt connect create_db:instance001 даёт права admin, а tt connect 127.0.0.1:3301 - права guest?
  • Что технически происходит при conn.space.bands:select{1} в net.box: это локальный или сетевой вызов?
  • Почему grant 'guest','execute','universe' удобно в песочнице, но недопустимо в проде?
👍3 ❤️2 🔥2 😄 🤔
Ответить
← Предыдущая глава
Установка и первый запуск: tt CLI, пакеты, Docker
Следующая глава →
Спейсы и кортежи: форматы, типы данных

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

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

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

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

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