TDB Documentation portal logo
Помощь
Обновлена 30 июля 2026 г. в 16:49

Использование спейсов на движке vinyl

Доступно с версии 3.0.0.

Tarantool DB поддерживает дисковый движок vinyl. Рекомендации по настройке параметров vinyl приведены в разделе Методика настройки движка vinyl в Tarantool DataBase.

Особенности работы с vinyl

При работе с дисковым движком vinyl необходимо учитывать следующие особенности, отличающие его от движка memtx:

  • функция len() возвращает только приблизительное количество кортежей в спейсе. Если необходимо точное количество кортежей, используйте функцию count() или pairs():length(), но имейте в виду, что эти операции значительно медленнее;
  • операция delete не возвращает удалённый кортеж. Если нужно получить значение удаленного кортежа, перед его удалением выполните операцию get;
  • возможно переключение контекста файбером при чтении из vinyl, поскольку данные могут отсутствовать в памяти и придется обращаться к диску.

Подробнее о различиях между vinyl и memtx можно узнать в документации Tarantool.

Пример создания спейса на движке vinyl

В примере ниже на движке vinyl создан шардированный спейс messages для хранения пользовательских сообщений:

box.schema.space.create('messages', { engine = 'vinyl', if_not_exists = true })box.space.messages:format({    { name = 'id', type = 'number' },    { name = 'bucket_id', type = 'unsigned' },    { name = 'text', type = 'string' },    { name = 'created_at', type = 'datetime' },})box.space.messages:create_index('bucket_id', { parts = { 'bucket_id', 'id' }, if_not_exists = true })helpers.register_sharding_key('messages', { 'id' })

Составной первичный индекс

Спейс messages использует составной первичный индекс по двум полям:

box.space.messages:create_index('bucket_id', { parts = { 'bucket_id', 'id' }, if_not_exists = true })

Здесь:

При использовании движка vinyl создание отдельного вторичного индекса по bucket_id избыточно и неэффективно по двум причинам:

  • каждый вторичный индекс в vinyl представляет собой отдельное LSM-дерево, требующее дополнительное место на диске;
  • при поиске по вторичному индексу Tarantool сначала находит первичный ключ во вторичном индексе, а затем обращается к первичному индексу для получения полной записи. При выполнении range-запроса это приводит к случайным чтениям с диска.

Использование составного первичного индекса { bucket_id, id } дает возможность шардирования без издержек вторичного индекса.

Для настройки производительности индексов в vinyl доступны следующие параметры конфигурации:

  • vinyl.bloom_fpr — коэффициент ложноположительного срабатывания фильтра Блума. Чем ниже значение, тем точнее фильтр, но больше потребление памяти. Значение по умолчанию: 0.05;
  • vinyl.page_size — размер страницы при чтении и записи в байтах. Значение по умолчанию: 8192;
  • vinyl.range_size — максимальный размер диапазона по умолчанию (в байтах);
  • vinyl.run_count_per_level — максимальное количество .run-файлов на каждом уровне LSM-дерева. Чем больше значение, тем шире LSM-дерево. Значение по умолчанию: 2;
  • vinyl.run_size_ratio — соотношение между размерами уровней в LSM-дереве. Чем меньше значение, тем выше LSM-дерево. Значение по умолчанию: 3.5.

Задать настройки спейса, связанные с движком vinyl, можно двумя способами:

  • в YAML-конфигурации кластера в секции vinyl, например:

    vinyl:  bloom_fpr: 0.05  page_size:  8192  run_count_per_level: 2  run_size_ratio: 3.5
  • в опции index_opts при создании индекса через space_object:create_index():

    box.space.messages:create_index('bucket_id', { parts = { 'bucket_id', 'id' }, if_not_exists = true, bloom_fpr = 0.05 })

Подробную информацию о поддерживаемых опциях конфигурации для движка vinyl можно найти в документации Tarantool.

Регистрация ключа шардирования

Модуль CRUD по умолчанию вычисляет bucket_id по первичному ключу, поэтому в миграции необходимо явно указать id в качестве ключа шардирования:

helpers.register_sharding_key('messages', { 'id' })