Использование спейсов на движке vinyl
Доступно с версии 3.0.0.
Tarantool DB поддерживает дисковый движок vinyl. Рекомендации по настройке параметров vinyl приведены в разделе Методика настройки движка vinyl в Tarantool DataBase.
При работе с дисковым движком vinyl необходимо учитывать следующие особенности, отличающие его от движка memtx:
- функция
len()возвращает только приблизительное количество кортежей в спейсе. Если необходимо точное количество кортежей, используйте функциюcount()илиpairs():length(), но имейте в виду, что эти операции значительно медленнее; - операция
deleteне возвращает удалённый кортеж. Если нужно получить значение удаленного кортежа, перед его удалением выполните операциюget; - возможно переключение контекста файбером при чтении из vinyl, поскольку данные могут отсутствовать в памяти и придется обращаться к диску.
Подробнее о различиях между vinyl и memtx можно узнать в документации Tarantool.
В примере ниже на движке 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 })
Здесь:
bucket_id— идентификатор виртуального сегмента, используемый для шардирования;id— идентификатор сообщения.
При использовании движка 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.05page_size: 8192run_count_per_level: 2run_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' })