Начало работы с модулем dictionary¶
Tarantool DB поддерживает два способа работы со словарями:
доступ через API модуля
dictionary
;прямой доступ к данным словарей через спейс
dictionary_data
.
В этом разделе описано, как настроить Tarantool DB для каждого из этих способов работы, а также приведено несколько примеров использования словарей.
Содержание:
Управление доступом¶
Чтобы работать с данными словарей через API модуля dictionary, назначьте пользователю роль
dictionary_api_executor
.
Это можно сделать в файле config.yml
, используя опцию credentials.users.<username>.roles.
В примере ниже роль dictionary_api_executor
задана пользователю sampleuser
:
credentials:
users:
sampleuser:
password: '123456'
roles: [ dictionary_api_executor ]
Внимание
Если используется Tarantool DB версии ниже 2.2.0, для работы с данными словарей через API требуется выполнить дополнительный шаг – назначить роль dictionary_api_service
пользователю кластера, который указан в разделе конфигурации iproto.advertise.peer. Пример:
credentials:
users:
replicator:
password: 'secret'
roles:
- replication
- dictionary_api_service
Узнать больше об управлении пользователями и ролями можно в документации Tarantool.
Чтобы получить прямой доступ к данным словарей через спейс dictionary_data
:
Назначьте пользователю роль
dictionary_api_executor
.Выдайте пользователю права на чтение спейса
dictionary_data
и запись данных в него, используя опцию конфигурации credentials.users.<username>.privileges:credentials: users: sampleuser: password: '123456' roles: [ dictionary_api_executor ] privileges: - permissions: [ read, write ] spaces: [ dictionary_data ]
В частности, такие права на чтение и запись необходимы для импорта и экспорта данных через утилиту tt CLI.
Определение конфигурации словарей¶
Когда доступ к данным для пользователя настроен, задайте в файле config.yml
:
технологические роли
roles.dictionary-router
иroles.dictionary-storage
. Их можно включить в секцияхgroups.routers.roles
иgroups.storages.roles
соответственно (см. опцию roles). Пример:groups: routers: replication: failover: manual sharding: roles: [router] roles: - roles.crud-router - roles.metrics-export - roles.dictionary-router - roles.dictionary-storage
Узнать больше: Включение и настройка ролей.
конфигурацию ролей
dictionary
для роутера и хранилищ. Ее можно задать с помощью опции roles_cfg. Пример:roles_cfg: roles.dictionary-router: update_instances_list_period: 300 roles.dictionary-storage: batch_size: 1000 worker_sleep_in_second: 60 update_instances_list_period: 300 connect_timeout: 3
Узнать больше про настройку конфигурации ролей можно в документации Tarantool в разделе Настройка ролей. Полный список поддерживаемых опций конфигурации
dictionary
приведен в разделе roles.dictionary-<router_or_storage>.
Работа со словарями через API¶
Для работы используются методы встроенного модуля dictionary
.
Полный список поддерживаемых методов приведен в разделе Модуль dictionary.
Подробный пример работы со словарями через API приведен в разделе Запись и получение данных в словаре.
В примере ниже в словарь записывается элемент с помощью метода dictionary_set(). Затем записанные данные элемента словаря проверяются с помощью dictionary_get():
if dictionary_set('categories', '1', 'Food') then
local value = dictionary_get('categories', '1')
end
В примере ниже работа со словарем выполняется в транзакции:
dictionary_set('categories', '1', {})
box.begin()
local data = dictionary_get('categories', '1')
data.list= 'Food'
if dictionary_set('categories', '1', data) then
box.commit()
dictionary_try_sync()
else
box.rollback()
end
Прямой доступ к данным словарей¶
Данные словарей хранятся в спейсе dictionary_data
.
Этот спейс содержит следующие поля:
entity_name
– название словаря;key
– идентификатор элемента словаря;value
– данные элемента словаря.
Кроме того, спейс dictionary_data
содержит служебные поля, которые автоматически рассчитываются перед записью.
Спейс dictionary_data
можно использовать напрямую для записи и чтения данных, все изменения при этом будут переданы на другие узлы.
Удаление данных при работе напрямую с dictionary_data
не поддерживаются.
В примере в спейс dictionary_data
добавляется кортеж,
а затем записанные данные словаря проверяются и записываются в переменную value
:
box.space.dictionary_data:replace({'categories', '1', 'Food'})
local value = box.space.dictionary_data:get({'categories', '1'})
Импорт данных¶
Данные словарей можно загрузить напрямую в спейс dictionary_data
из файла .csv
.
Для импорта требуются три поля:
entity_name
– название словаря;key
– идентификатор элемента словаря;value
– данные элемента словаря.
Пример файла для импорта (import_example.csv
):
entity_name,key,value
categories,1,Food
categories,2,House
categories,3,Transport
categories,4,Clothes
categories,5,Shoes
categories,6,Gifts
categories,7,Travel
Загрузить данные из файла можно в любой экземпляр с ролью roles.dictionary-storage
, используя команду tt import
:
tt import admin:test-cluster-cookie@localhost:3101 import_example.csv:dictionary_data --header
После загрузки данные распространяются по другим узлам за время, примерно равное значению опции dictionary.worker_sleep_in_second.
Команда tt import
позволяет явно указать столбцы, которые нужно импортировать.
Это полезно в таких случаях:
в загружаемом файле больше столбцов, чем нужно для загрузки;
нужные столбцы имеют названия, отличные от названий полей (
entity_name
,key
,value
). нужные.
Пример файла для импорта (test.csv
), для которого потребуется явно указать столбцы:
csv_dict,csv_key,csv_value,writer_uid,dt,fingerprint
categories,1,Food,bbbbbbbb-0000-0000-0000-000000000001,1710759004038591461,36d105b8b513422c33677dd59d0be27e
categories,2,House,bbbbbbbb-0000-0000-0000-000000000001,1710759004039152609,6fb4851069662836519d660a7a59ed09
categories,3,Transport,bbbbbbbb-0000-0000-0000-000000000001,1710759004039490086,dc6c35589f567f7683dfda8567949b5b
categories,4,Clothes,bbbbbbbb-0000-0000-0000-000000000001,1710759004039879589,c69658a6989824a428a2b01df21c2721
categories,5,Shoes,bbbbbbbb-0000-0000-0000-000000000001,1710759004040017977,c149a6d5b1667c05c3853ee9f873b361
categories,6,Gifts,bbbbbbbb-0000-0000-0000-000000000001,1710759004040344064,3b722413b54c323207e5f787cb5dc63c
categories,7,Travel,bbbbbbbb-0000-0000-0000-000000000001,1710759004040469779,135a471b56847a908ef5d0d1ff4c1244
Чтобы загрузить первые три столбца из файла выше (csv_dict
,csv_key
,csv_value
), вызовите команду tt import
с опцией --match
:
tt import \
admin:test-cluster-cookie@localhost:3101 \
test.csv:dictionary_data \
--header \
--match "entity_name=csv_dict;key=csv_key;value=csv_value"
Примечание
В спейс напрямую также можно импортировать данные, которые ранее были выгружены из этого же спейса вместе со служебными полями.
В этом случае данные из источника должны подаваться отсортированными по полю dt
.
Экспорт данных¶
Выгрузить содержимое спейса dictionary_data
можно с помощью команды tt export
:
tt export admin:test-cluster-cookie@localhost:3101 dictionary_data:out.csv --header
Пример выгруженного файла out.csv
:
entity_name,key,value,writer_uid,dt,fingerprint
categories,1,Food,bbbbbbbb-0000-0000-0000-000000000001,1710759004038591461,36d105b8b513422c33677dd59d0be27e
categories,2,House,bbbbbbbb-0000-0000-0000-000000000001,1710759004039152609,6fb4851069662836519d660a7a59ed09
categories,3,Transport,bbbbbbbb-0000-0000-0000-000000000001,1710759004039490086,dc6c35589f567f7683dfda8567949b5b
categories,4,Clothes,bbbbbbbb-0000-0000-0000-000000000001,1710759004039879589,c69658a6989824a428a2b01df21c2721
categories,5,Shoes,bbbbbbbb-0000-0000-0000-000000000001,1710759004040017977,c149a6d5b1667c05c3853ee9f873b361
categories,6,Gifts,bbbbbbbb-0000-0000-0000-000000000001,1710759004040344064,3b722413b54c323207e5f787cb5dc63c
categories,7,Travel,bbbbbbbb-0000-0000-0000-000000000001,1710759004040469779,135a471b56847a908ef5d0d1ff4c1244