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 thenw.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 thenlisten_address_schema:validate(cfg)elseerror("You need to set both host and port values")endend
В релизе 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.
В редакцию 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 thenerror('...')end
До версии 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: readymeta:last: &0active: *0alerts:...
Чтобы включить это новое поведение, нужно задать значение 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_totaltnt_memtx_tuples_data_read_viewtnt_memtx_tuples_data_garbagetnt_memtx_index_totaltnt_memtx_index_read_viewtnt_vinyl_memory_tupletnt_config_alertstnt_config_status