Работа со словарём с ограниченными правами | Tdb
Руководство пользователя Словари Работа со словарём с ограниченными правами

Работа со словарём с ограниченными правами

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

Содержание:

Пользователь словарей

Для выполнения операций со словарями не требуются широкие права доступа (super-права). Достаточно отдельного пользователя, который может:

  • выполнять операции чтения, записи, обновления и удаления данных в словарях через API модуля dictionary;

  • выгружать и загружать данные словарей с помощью команд tt export и tt import.

Пользователь словарей не имеет доступа к операциям модуля CRUD, а также к пользовательским спейсам и функциям приложения.

Для корректной работы со словарями требуется назначить такому пользователю в конфигурации роль dictionary_api_executor. Роль dictionary_api_executor разрешает вызов методов API словаря. Привилегии на спейсы позволяют работать с данными словарей и использовать команды tt export, tt import и tt connect. Узнать больше: Начало работы с модулем dictionary.

Пользователей словарей может быть несколько. В этом руководстве такой пользователь имеет название dictionary_user.

credentials:
  users:
    dictionary_user:
      password: 'secret'
      roles: [ dictionary_api_executor ]
      privileges:
        - permissions: [ read, write ]
          spaces: [ dictionary_data, dictionary_vclock ]
        - permissions: [ execute ]
          universe: true

Пререквизиты

Для выполнения примера требуются:

  • установленный Docker-образ Tarantool DB;

  • приложение Docker Compose;

  • утилита tt CLI;

  • исходные файлы примера dictionary_user.

    Примечание

    Есть два способа получить исходные файлы примера:

    • Архив с полной документацией Tarantool DB, полученный по почте или скачанный в личном кабинете tarantool.io. Пример архива: tarantooldb-documentation-3.0.0.tar.gz. Пример dictionary_user расположен в таком архиве в директории ./doc/examples/dictionary_user/.

    • Отдельный архив dictionary_user.tar.gz, скачанный c сайта Tarantool.

Запуск стенда и подключение к узлам

Для успешного запуска должны быть свободны следующие порты:

  • 2379

  • 3301–3308

  • 8081

Перейдите в папку с примером dictionary_user

cd ./doc/examples/dictionary_user

Запустите стенд:

make start

Команда развернет стенд, который состоит из:

  • кластера Tarantool DB:

    • 2 роутера;

    • 2 набора реплик по 3 хранилища;

  • кластера etcd из 3 узлов;

  • 1 узла Tarantool Cluster Manager (TCM).

После запуска должны работать все контейнеры, кроме init_host.

Также после запуска кластера становится доступен веб-интерфейс TCM. Для входа в TCM откройте в браузере адрес http://localhost:8081. Логин и пароль для входа:

  • Username: admin

  • Password: secret

Все операции со словарями в примере ниже выполняются через пользователя dictionary_user.

Запись данных в словарь

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

  • Terminal 1 — подключение к одному узлу кластера для записи данных;

  • Terminal 2 — подключение к другому узлу для проверки данных.

Для добавления новых элементов словаря подключитесь к кластеру в терминале (далее – Terminal 1) через пользователя словарей:

tt connect dictionary_user:secret@localhost:3301

В примере ниже задается словарь categories, который содержит категории денежных трат. Добавьте несколько элементов с соответствующими им ключами в словарь categories с помощью метода dictionary_router_set():

box.schema.func.call('dictionary_router_set', 'categories', '1', 'Shops')
box.schema.func.call('dictionary_router_set', 'categories', '2', 'Food delivery')
box.schema.func.call('dictionary_router_set', 'categories', '3', 'Transport')

Чтение данных с другого узла

Словари автоматически реплицируются между всеми узлами кластера. Чтобы проверить это, откройте вторую вкладку терминала (далее – Terminal 2) и подключитесь к другому узлу кластера:

tt connect dictionary_user:secret@localhost:3302

Проверьте записанные в словарь данные с помощью метода dictionary_router_get():

box.schema.func.call('dictionary_router_get', 'categories', '1')
box.schema.func.call('dictionary_router_get', 'categories', '2')
box.schema.func.call('dictionary_router_get', 'categories', '3')

Видно, что изменения словаря автоматически синхронизируются между всеми узлами кластера.

Выгрузка и загрузка словаря через утилиту tt CLI

Экспорт и импорт словарей можно использовать:

  • для переноса словарей между окружениями;

  • при восстановлении словарей из резервной копии;

  • для массового редактирования данных вне кластера.

Экспорт словаря

Выполните экспорт системных спейсов словарей, используя один из способов ниже (пример для узла хранилища localhost:3303):

  • tt export localhost:3303 dictionary_data:dictionary_data.csv \
    --username dictionary_user --password secret --header
    
  • tt export dictionary_user:secret@localhost:3303 \
      dictionary_data:dictionary_data.csv --header
    

Редактирование данных вне кластера

Выгрузка словарей через tt export используется в тех случаях, когда требуется работать с содержимым словаря вне кластера, без прямого доступа к Tarantool.

Типовые сценарии:

  • Массовое наполнение или правка словаря – при добавлении или изменении большого количества записей;

  • Перенос словарей между окружениями – например, перенос из тестового окружения в staging или production без копирования прикладных данных;

  • Восстановление словарей из резервной копии – в случае потери данных или необходимости отката содержимого словаря к известному состоянию;

  • Подготовка данных в изолированной среде – если редактирование словаря должно происходить без доступа к кластеру (например, на локальной машине или в CI).

Во всех этих сценариях словарь выгружается в виде CSV-файлов, редактируется вне кластера, а затем загружается обратно с помощью tt import.

Обогащение CSV-файла словаря

После экспорта файл dictionary_data.csv можно дополнить новыми записями. Добавьте в словарь несколько новых категорий:

categories,4,Entertainment,11111111-1111-1111-1111-111111111111,1766583269000000000,00000000000000000000000000000000
categories,5,Health,22222222-2222-2222-2222-222222222222,1766583269000000001,00000000000000000000000000000000
categories,6,Education,33333333-3333-3333-3333-333333333333,1766583269000000002,00000000000000000000000000000000
categories,7,Subscriptions,44444444-4444-4444-4444-444444444444,1766583269000000003,00000000000000000000000000000000

Таким образом можно массово дополнить словарь вне кластера, а затем загрузить обновлённые данные обратно с помощью tt import.

Полученные CSV-файлы можно отредактировать вручную, например добавить новые строки или изменить существующие значения. Этот шаг выполняется вне Tarantool и не требует доступа к кластеру.

Note

При редактировании CSV-файлов вручную не рекомендуется менять существующие значения uuid и vclock, если нет полного понимания последствий такого решения.

Импорт обновлённых данных

После редактирования файлов загрузите их обратно в кластер, используя один из способов ниже (пример для другого узла хранилища localhost:3306):

  • tt import localhost:3306 --username dictionary_user \
      --password secret dictionary_data.csv:dictionary_data --header
    
  • tt import dictionary_user:secret@localhost:3306 \
      dictionary_data.csv:dictionary_data --header
    

Чтобы проверить загруженные данные словаря, подключитесь к любому узлу кластера. В примере используется подключение к узлу из Terminal 1:

tt connect dictionary_user:secret@localhost:3301

Затем проверьте записанные в словарь данные:

box.schema.func.call('dictionary_router_get', 'categories', '4')
box.schema.func.call('dictionary_router_get', 'categories', '5')
box.schema.func.call('dictionary_router_get', 'categories', '6')
box.schema.func.call('dictionary_router_get', 'categories', '7')

Обновлённые значения доступны на всех узлах кластера.

Остановка стенда

Чтобы остановить стенд, выполните в локальном терминале следующую команду:

make stop
Found what you were looking for?
Feedback