Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 21 октября 2026 г. в 10:46

Tarantool 3.1

Дата выпуска: 16 апреля 2024 г.

Релизы на GitHub:

В релизе 3.1 продолжается развитие нового подхода к конфигурации кластера, представленного в версии 3.0, и добавляются следующие основные возможности и улучшения для редакций Community и Enterprise:

  • Community Edition (CE)
    • Улучшен опыт разработчиков при обработке ошибок с помощью модуля box.error.
    • Добавлены числовые типы фиксированного размера: uint8, int8, uint16 и другие.
    • Добавлена функциональность RPC для доступа к пользовательским ролям из конфигурации.
    • Утилита tt, используемая для управления экземплярами, полностью совместима с последней версией Tarantool.
  • Enterprise Edition (EE)
    • Добавлен внешний координатор для автоматического и ручного переключения при отказе.
    • Повышена стабильность работы с централизованной конфигурацией, хранящейся в etcd.

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

Обработка ошибок

В этом релизе процесс обработки ошибок при разработке стал проще благодаря модулю box.error. Ниже перечислены наиболее значимые возможности и изменения.

Поля полезной нагрузки ошибки

В релизе 3.1 можно добавлять пользовательскую полезную нагрузку к ошибке. Полезная нагрузка передается в виде пар «ключ-значение», где ключ – строка, а значение – любой Lua-объект. В примере ниже ключ description используется для хранения пользовательской полезной нагрузки.

custom_error = box.error.new({ type = 'CustomInternalError',                               message = 'Internal server error',                               description = 'Some error details'  -- payload})

Получить значение поля полезной нагрузки можно через точечную нотацию:

tarantool> custom_error.description---- Some error details...

Стеки ошибок

В релизе 3.1 упрощено создание цепочек ошибок. В более ранних версиях для указания причины ошибки использовался метод set_prev(error_object), например:

local ok, err = pcall(my_func)if not ok then    local err2 = box.error.new{type = "MyAppError", message = "my_func failed"}    err2:set_prev(err)    err2:raise()end

При таком подходе требуется создать новую ошибку без её выброса, затем указать её причину с помощью set_prev() и только после этого выбросить. Начиная с версии 3.1 при создании ошибки можно использовать новый аргумент prev:

local ok, err = pcall(my_func)if not ok then    box.error{type = "MyAppError", message = "my_func failed", prev = err}end

Улучшения сериализации ошибок

В релизе 3.1 можно повысить детализацию сериализации ошибок. До релиза 3.1 сериализованное представление ошибки содержало только сообщение об ошибке:

tarantool> box.error.new({ type = 'CustomInternalError', message = 'Internal server error'})---- Internal server error...

Начиная с версии 3.1 сериализованная ошибка также содержит другие поля, которые могут быть полезны при анализе ошибок:

tarantool> box.error.new({ type = 'CustomInternalError', message = 'Internal server error'})---- code: 0  base_type: CustomError  type: CustomInternalError  custom_type: CustomInternalError  message: Internal server error  trace:  - file: '[C]'    line: 4294967295...

При журналировании ошибки с помощью встроенного модуля журналирования выводится сообщение об ошибке, за которым следуют знак табуляции (\t) и все поля полезной нагрузки в виде JSON-объекта, например:

main/104/app.lua/tarantool I> Internal server error {"code":0,"base_type":"CustomError","type":"CustomInternalError", ... }

Поскольку это изменение может повлиять на поведение существующего кода, добавлен новый параметр compat – box_error_serialize_verbose. Чтобы попробовать повышенную детализацию сериализации ошибок, установите для этого параметра значение new:

tarantool> require('compat').box_error_serialize_verbose = 'new'---...

Числовые типы фиксированного размера

В релизе 3.1 добавлены числовые типы фиксированного размера, которые могут быть полезны для хранения данных в массиве без кодирования для эффективного сканирования. Добавлены следующие числовые типы:

  • uint8: целое число в диапазоне [0 .. 255].
  • int8: целое число в диапазоне [-128 .. 127].
  • uint16: целое число в диапазоне [0 .. 65,535].
  • int16: целое число в диапазоне [-32,768 .. 32,767].
  • uint32: целое число в диапазоне [0 .. 4,294,967,295].
  • int32: целое число в диапазоне [-2,147,483,648 .. 2,147,483,647].
  • uint64: целое число в диапазоне [0 .. 18,446,744,073,709,551,615].
  • int64: целое число в диапазоне [-9,223,372,036,854,775,808 .. 9,223,372,036,854,775,807].
  • float32: 32-битное число с плавающей точкой.
  • float64: 64-битное число с плавающей точкой.

Экспериментальный модуль 'connpool'

Новый модуль experimental.connpool предоставляет набор возможностей для удаленного подключения к любому экземпляру кластера или выполнения удаленных вызовов процедур на экземпляре, удовлетворяющем заданным критериям. Чтобы загрузить модуль experimental.connpool, используйте директиву require():

sharded_cluster:router-a-001> connpool = require('experimental.connpool')---...

В версии 3.1 этот модуль предоставляет следующий API:

  • Функция connect() принимает имя экземпляра и возвращает активное подключение к этому экземпляру:

    sharded_cluster:router-a-001> conn = connpool.connect("storage-b-002")---...

    Получив подключение, можно выполнять запросы к удаленному экземпляру, например, выбирать данные из спейса:

    sharded_cluster:router-a-001> conn.space.bands:select({}, { limit = 5 })---- - [3, 804, 'Ace of Base', 1987]  - [7, 693, 'The Doors', 1965]  - [9, 644, 'Led Zeppelin', 1968]  - [10, 569, 'Queen', 1970]...
  • Функция filter() возвращает имена экземпляров, удовлетворяющих заданным условиям. В примере ниже функция возвращает список экземпляров с ролью storage и указанным значением метки:

    sharded_cluster:router-a-001> connpool.filter({ roles = { 'storage' }, labels = { dc = 'east' }})---- - storage-b-002  - storage-a-002...
  • Функцию call() можно использовать для выполнения функции на удаленном экземпляре. В примере ниже указаны следующие условия для выбора экземпляра, на котором будет выполнена функция vshard.storage.buckets_count:

    • Экземпляр имеет роль storage.
    • Экземпляр имеет метку dc со значением west.
    • Экземпляр доступен для записи.
    sharded_cluster:router-a-001> connpool.call('vshard.storage.buckets_count', nil, { roles = { 'storage' }, labels = { dc = 'west' }, mode = 'rw' })sharded_cluster:router-a-001> connpool.call('vshard.storage.buckets_count', nil, { roles = { 'storage' }, labels = { dc = 'west' }, mode = 'rw' })---- 500...

Подробнее см. в описании модуля experimental.connpool.

Доступ к конфигурации других членов кластера

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

Функция config:instances() выводит список всех экземпляров кластера:

sharded_cluster:router-a-001> require('config'):instances()---- storage-a-001:    group_name: storages    instance_name: storage-a-001    replicaset_name: storage-a  storage-b-002:    group_name: storages    instance_name: storage-b-002    replicaset_name: storage-b  router-a-001:    group_name: routers    instance_name: router-a-001    replicaset_name: router-a  storage-a-002:    group_name: storages    instance_name: storage-a-002    replicaset_name: storage-a  storage-b-001:    group_name: storages    instance_name: storage-b-001    replicaset_name: storage-b...

Чтобы получить указанное значение конфигурации для определенного экземпляра, передайте имя экземпляра в качестве аргумента в config:get():

sharded_cluster:router-a-001> require('config'):get('iproto', {instance = 'storage-b-001'})---- readahead: 16320  net_msg_max: 768  listen:  - uri: 127.0.0.1:3304  threads: 1  advertise:    peer:      login: replicator    client: null    sharding:      login: storage...

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

Координатор переключения при отказе (EE)

В Tarantool Enterprise Edition 3.1 добавлен внешний координатор переключения при отказе (failover coordinator), который отслеживает состояние кластера Tarantool и выполняет автоматическую смену лидера, если текущий лидер набора реплик недоступен.

Для работы координатора переключения при отказе параметр replication.failover должен быть установлен в значение supervised:

replication:  failover: supervised# ...

Чтобы запустить координатор переключения при отказе, выполните команду tarantool с параметром failover и передайте путь к YAML-файлу конфигурации:

$ tarantool --failover --config /path/to/config

Координатор переключения при отказе подключается ко всем экземплярам, опрашивает их статус и контролирует, чтобы в каждом наборе реплик с параметром replication.failover, установленным в значение supervised, был только один экземпляр, доступный для записи.

При необходимости время ожидания переключения при отказе и другие параметры можно настроить в секции failover на глобальном уровне:

failover:  call_timeout: 1  lease_interval: 15  renew_interval: 5  stateboard:    renew_interval: 1    keepalive_interval: 5

Шардирование

В релиз 3.1 добавлены новые параметры шардирования, обеспечивающие дополнительную гибкость при настройке шардированного кластера. Новый параметр sharding.weight задает относительный объем данных, который может хранить набор реплик. В примере ниже набор реплик storage-a может хранить в два раза больше данных, чем storage-b:

# ...replicasets:  storage-a:    sharding:      weight: 2    # ...  storage-b:    sharding:      weight: 1    # ...

Параметр sharding.rebalancer_mode определяет, будет ли балансировщик выбран вручную или автоматически. Этот параметр может принимать одно из трех значений:

  • auto (по умолчанию): если нет наборов реплик с ролью шардирования rebalancer (sharding.roles), набор реплик с балансировщиком будет выбран автоматически среди всех наборов реплик.
  • manual: один из наборов реплик должен иметь роль шардирования rebalancer. Балансировщик будет находиться в этом наборе реплик.
  • off: балансировка отключена независимо от того, существует ли набор реплик с ролью шардирования rebalancer или нет.

Совместимость с утилитой tt

В этом релизе утилита tarantoolctl, используемая для администрирования экземпляров Tarantool, полностью удалена из пакетов Tarantool. Последняя версия утилиты tt полностью совместима с Tarantool 3.1 и покрывает всю необходимую функциональность:

  • Настройка среды разработки: инициализация среды и установка различных версий Tarantool.

  • Различные возможности для разработки кластерных приложений: создание приложений на основе шаблонов, управление модулями, сборка и упаковка приложений.

  • Управление экземплярами кластера: запуск и остановка экземпляров, подключение к удаленным экземплярам для администрирования и т. д.

  • Импорт и экспорт данных (только для Enterprise Edition).

Подробнее о миграции с tarantoolctl на tt см. в разделе tarantoolctl-migration-to-tt.