Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

Tarantool 3.2

Дата выпуска: 26 августа 2024 г.

Релизы на GitHub: 3.2.1, 3.2.0

В релизе 3.2 Tarantool добавлены следующие основные функциональные возможности и улучшения для редакций Community и Enterprise:

  • Редакция Community (CE)
  • Новый экспериментальный модуль для валидации конфигурации ролей.
  • Начальная поддержка кодирования структурированных данных с помощью Protobuf.
  • Итераторы следующего и предыдущего префикса.
  • Поддержка всех версий UUID.
  • Автоматическая загрузка наиболее часто используемых встроенных модулей в окружение консоли.
  • Редакция Enterprise (EE)
  • Time-to-live (TTL) для ключей в хранилище конфигурации на базе Tarantool.

Разработка приложений

Валидация конфигурации

В Tarantool 3.2 добавлен новый экспериментальный модуль для валидации конфигурации ролей с использованием декларативной схемы. Например, можно проверять тип значений конфигурации, задавать массив допустимых значений или указывать пользовательскую функцию валидации.

Предположим, пример пользовательской роли 'http-api' может принимать значения конфигурации host и port:

roles: [ http-api ]roles_cfg:  http-api:    host: '127.0.0.1'    port: 8080

Сначала нужно загрузить модуль experimental.config.utils.schema:

local schema = require('experimental.config.utils.schema')

Функцию validate_port() можно использовать для проверки того, что значение порта находится в диапазоне от 1 до 65535:

local function validate_port(port, w)    if port <= 1 or port >= 65535 then        w.error("'port' should be between 1 and 65535, got %d", port)    endend

Затем можно создать схему, используемую для валидации:

  • host должно быть одним из указанных строковых значений.

  • port должно быть числом, которое проверяется с помощью объявленной выше функции validate_port(). .. code-block:: lua

local listen_address_schema = schema.new('listen_address', schema.record({

: host = schema.enum({ '127.0.0.1', '0.0.0.0' }), port = schema.scalar({ type = 'integer', validate = validate_port, }),

}))

Наконец, можно передать указанную схему в функцию роли validate():

local function validate(cfg)    if cfg.host and cfg.port then        listen_address_schema:validate(cfg)    else        error("You need to set both host and port values")    endend

Кодировщик Protobuf

В релизе 3.2 добавлена начальная поддержка кодирования структурированных данных с использованием Protocol buffers. Сначала нужно загрузить модуль protobuf:

local protobuf = require('protobuf')

Для кодирования данных нужно определить протокол:

local customer_protocol = protobuf.protocol({    -- Define a message and enum --})

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

  • Сообщение задает структуру данных, в частности, поля и их типы.

  • Перечисление определяет набор перечисляемых констант внутри сообщения. Для создания сообщения и перечисления используйте функции message() и enum() соответственно:

local customer_protocol = protobuf.protocol({    protobuf.message('Customer', {        id = { 'int32', 1 },        firstName = { 'string', 2 },        lastName = { 'string', 3 },        customerType = { 'CustomerType', 4 }    }),    protobuf.enum('CustomerType', {        active = 0,        inactive = 1,    })})

После того как протокол определен, используйте метод encode() для кодирования данных:

local sample_customer = customer_protocol:encode(    'Customer',    {        id = 3,        firstName = 'Andrew',        lastName = 'Fuller',        customerType = 1    })

Итераторы следующего и предыдущего префикса

В этот релиз добавлены два новых итератора для TREE-индексов: np (следующий префикс) и pp (предыдущий префикс). Если ключ является строковым значением, префикс –- это общая начальная подстрока, разделяемая несколькими ключами.

Предположим, спейс products содержит следующие значения:

application:instance001> box.space.products:select()---- - ['clothing_pants']  - ['clothing_shirt']  - ['electronics_laptop']  - ['electronics_phone']  - ['electronics_tv']  - ['furniture_chair']  - ['furniture_sofa']  - ['furniture_table']...

Если использовать тип итератора np и задать для ключа значение electronics, результат должен выглядеть следующим образом:

application:instance001> box.space.products:select({ 'electronics' }, { iterator = 'np' })---- - ['furniture_chair']  - ['furniture_sofa']  - ['furniture_table']...

Аналогичным образом можно использовать итератор pp:

application:instance001> box.space.products:select({ 'electronics' }, { iterator = 'pp' })---- - ['clothing_shirt']  - ['clothing_pants']...

Обратите внимание, что новые итераторы работают только для движка memtx.

Хранилище конфигурации Tarantool: поддержка TTL для ключей (EE)

В редакцию Enterprise добавлена поддержка времени жизни (TTL) для ключей в хранилище конфигурации на базе Tarantool. Значение TTL можно указать в вызове config.storage.put() следующим образом:

config.storage.put('/foo/bar', 'v1', { ttl = 60 })

Аналогичным образом можно настроить TTL в config.storage.txn():

config.storage.txn({    predicates = { { 'revision', '==', revision } },    on_success = { { 'put', '/foo/bar', 'v1', { ttl = 60 } } }})

С помощью нового поля config.storage.info.features.ttl можно проверить, поддерживает ли текущая версия хранилища конфигурации запросы с TTL. В примере ниже метод conn:call() используется для удаленного вызова, чтобы получить значение поля ttl:

local info = conn.call('config.storage.info')if info.features == nil or not info.features.ttl then    error('...')end

Поддержка всех версий UUID

До версии 3.2 Tarantool поддерживал только UUID, соответствующие правилам RFC 4122 версии 4. В версии 3.2 значения UUID всех версий (включая новые 6, 7 и 8) могут быть распознаны с помощью модуля uuid. Это улучшает совместимость со сторонними источниками данных, данные которых обрабатываются Tarantool.

Администрирование и обслуживание

Интерактивная консоль

В этом релизе как Tarantool, так и tt интерактивные консоли автоматически добавляют наиболее часто используемые встроенные модули в окружение. Это означает, что можно начать использовать модуль без его загрузки с помощью директивы require.

В интерактивной сессии ниже модуль config используется для получения состояния конфигурации экземпляра сразу после подключения к этому экземпляру:

application:instance001> config:info('v2')---- status: ready  meta:    last: &0     active: *0  alerts: ...

Чтобы включить это новое поведение, нужно задать значение new для параметра console_session_scope_vars compat:

compat:  console_session_scope_vars: 'new'

Наблюдаемость

В релизе 3.2 добавлены следующие улучшения, связанные с наблюдаемостью:

  • С помощью нового поля box.info.config можно получить доступ к статусу конфигурации экземпляра.
  • box.info.synchro.queue теперь включает поля age и confirm_lag:
  • age – показывает, сколько времени самая старая запись в очереди ожидала кворума.
  • confirm_lag – показывает, сколько времени последняя успешно подтвержденная запись ожидала сбора кворума.
  • Добавлены новые метрики:
  • tnt_memtx_tuples_data_total
  • tnt_memtx_tuples_data_read_view
  • tnt_memtx_tuples_data_garbage
  • tnt_memtx_index_total
  • tnt_memtx_index_read_view
  • tnt_vinyl_memory_tuple
  • tnt_config_alerts
  • tnt_config_status