Tarantool 3.5
Дата выпуска: 2025-08-27
Релизы на GitHub: 3.5.0
В версии Tarantool 3.5 добавлены следующие важные возможности и улучшения для редакций Community и Enterprise:
- Community Edition (CE)
- Поддержка 4 типов данных с фиксированной точкой, включая
decimal32иdecimal64. - Memtx: новый алгоритм сортировки вторичных ключей со сложностью O(n).
- Новый тег
fail_ifдля ролей и скриптов. - Более быстрая перезагрузка больших кластеров (500+).
- Поддержка 4 типов данных с фиксированной точкой, включая
- Enterprise Edition (EE)
- Настройка синхронной репликации для 3 зон доступности в режиме
failover = 'supervised'. - Координатор аварийного переключения не производит переключение RW-экземпляра при наличии нерабочих экземпляров.
- Поддержка типов данных с фиксированной точкой в MemCS.
- Поддержка BRIN-индексов в MemCS.
- Улучшение производительности MemCS.
- Ускорение пакетных вставок по вторичным ключам в MemCS.
- Оптимизированный формат хранения и более быстрое сканирование строк в MemCS.
- Настройка синхронной репликации для 3 зон доступности в режиме
Tarantool теперь поддерживает 4 типа данных с фиксированной точкой:
decimal32, decimal64, decimal128, and decimal256.
Они различаются количеством значимых десятичных знаков: * decimal32 -
9 * decimal64 - 18 * decimal128 - 38 * decimal256 - 76
Также у этих типов данных есть дополнительный параметр, scale
(масштаб), который определяет позицию десятичного разделителя.
Его также можно рассматривать как подразумеваемый десятичный показатель
степени со значением -scale. Например: * decimal32 со scale = 4
может принимать значения от -99999.9999 до 99999.9999. *
decimal32 со scale = -2 может принимать значения от
-999999999 × 10² до 999999999 × 10².
Пример 1. Создание спейса с полем, где одно из полей имеет тип данных с фиксированной точкой: .. code-block:: lua s = box.schema.create_space('test', {format = { {'a', 'unsigned'}, {'b', 'decimal32', scale = 4}, }})
Работа с этими типами данных ведется с помощью модуля decimal.
Для поддержки новых типов данных с фиксированной точкой в этот модуль были внесены следующие доработки: * Снято ограничение на показатель степени. * Точность увеличена до 76 десятичных знаков. * Печать теперь выполняется в научной нотации.
local decimal = require('decimal')s = box.schema.create_space('test', {format = {{'a', 'unsigned'}, {'b', 'decimal32', scale = 4},}})s:create_index('pk')s:insert({1, decimal.new(13333)})s:insert({2, decimal.new(0.0017)})
Теперь Tarantool позволяет сортировать вторичные ключи, используя новый
алгоритм сортировки со сложностью O(n). Этот алгоритм использует
дополнительные данные, записанные в снимок данных. Эту функцию можно
включить с помощью новой опции memtx_use_sort_data в
box.cfg или memtx.use_sort_data в
конфигурации экземпляра. Если для параметра установлено значение true,
дополнительные данные сохраняются в отдельный файл .sortdata во время
создания снимка и используются во время восстановления. Значение по
умолчанию – false, поэтому при необходимости пользователь должен
явно установить значение true.
Параметр можно изменять во время выполнения. Например, вы можете
включить его во время восстановления, чтобы использовать новый алгоритм
сортировки по вторичному ключу, и отключить его перед созданием нового
снимка, так что будет создан только файл .snap, а O(n)-сортировка по
вторичному ключу для этого снимка будет недоступна.
Влияние этого параметра на производительность зависит от скорости чтения/записи в постоянное хранилище и количества кортежей и дополнительных ключей в спейсах (чем больше кортежей и ключей, тем более эффективен новый алгоритм).
Кроме того, в этом алгоритме используется только одно ядро процессора. Недостатком является то, что это создает дополнительные накладные расходы при восстановлении (до ~45 байт на кортеж) и накладные расходы при создании снимка (из-за записи данных сортировки в постоянное хранилище).
Tarantool позволяет задавать новый тег fail_if для ролей и скриптов.
Если значение тега fail_if является строкой-выражением, то при
загрузке роли или скрипта будет выдана ошибка, если значение выражения
равно true.
Теперь Tarantool обрабатывает конфигурацию экземпляра только при явном
доступе к нему, например, с помощью вызова
config:get(<...>, {instance = <...>}). Это значительно ускоряет запуск
и перезагрузку конфигурации, особенно для больших кластеров.
В режиме replication.failover = supervised добавилась возможность
настройки синхронной репликации с кворумом в 3 зонах доступности. Этот
релиз включает в себя несколько более ранних патчей, которые делают
работу appoint_commit более безопасной в некоторых ситуациях, и
основной патч, который добавляет вызов box.ctl.promote() к
appoint_commit в случае, если флаг
failover.replicasets.<replicaset_name>.synchro_mode выставлен в
true.
[EE] Координатор аварийного переключения не производит переключение RW-экземпляра при наличии нерабочих экземпляров
При применении централизованных обновлений конфигурации, координатор аварийного переключения в Tarantool больше не производит переключение RW-экземпляра в наборе реплик при наличии нерабочих экземпляров. В новом релизе упрощается процесс обновления конфигурации для координатора аварийного переключения. Ранее любое изменение приводило к полному перезапуску всех сервисов, что приводило к ненужному простою.
Теперь система различает несколько возможных ситуаций, и большинство настроек можно применять динамически без необходимости перезапуска.
Перезапуск произойдет только в том случае, если вы измените важные
параметры ядра, в частности, любые параметры в разделе failover.* или
failover.stateboard.* (за исключением failover.replicasets). Такой
подход сводит к минимуму аварийные переключения и значительно повышает
доступность координатора.
Теперь можно задать поле с типом данных
decimal32/64/128/256 (десятичное число с фиксированной
точкой): * Операции Insert/Replace/Get/Select для десятичных значений
с фиксированной точкой представлены в виде стандартных десятичных знаков
(MP_DECIMAL) во всех движках (MemTX, Vinyl, MemCS, Quiver (если
применимо)). * Внутреннее представление десятичных значений с
фиксированной точкой остается таким же, как и существующее десятичное
представление (decNumber) во всех движках, кроме MemCS и Quiver. * В
движках MemCS и Quiver появилась возможность пакетной вставки и
сканирования десятичных значений с фиксированной точкой в формате Apache
Arrow.
В этом релизе представлено новое семейство фильтров ArrowStream,
называемых логическими комбинаторами. Они позволяют комбинировать другие
фильтры с помощью логических операций AND и OR. Проверка выполняется
рекурсивно от корня. Обратите внимание, что сложные фильтры не
оптимизированы; каждый дочерний фильтр оценивается последовательно до
тех пор, пока не будет выполнено общее условие.
В этом релизе улучшена производительность движка MemCS, в частности,
улучшена совместимость и скорость вставки. В вычислениях Arrow-массива
null_count устранена проблема для пользователей Rust Arrow C API.
Кроме того, пакетная вставка в колонки в формате RLE теперь работает
значительно быстрее: производительность увеличилась в 2,5 раза для
колонок, заполненных на 10%, и в 11 раз для колонок, заполненных на
1%.
В этом релизе представлен новый метод next_row, который значительно
ускоряет пакетную вставку и создание вторичного индекса. Этот метод
заменяет старый итератор на основе кортежей, используя маску колонки для
обработки только необходимых данных и возвращая необработанную
информацию о строках, чтобы исключить дорогостоящие преобразования в
MsgPack. Производительность при вводе вторичного индекса улучшилась
более чем на 550%, а скорость ввода выросла с ~ 10 тыс. до 62 тыс.
строк в секунду.
Этот релиз включает в себя новый оптимизированный формат хранения для коротких строк и мощный механизм просмотра для формата Apache Arrow, что значительно повышает производительность сканирования строк.
Нововведения по формату хранения: * Строки длиной менее 13 символов
теперь хранятся в виде 16-байтового вектора, что значительно повышает
скорость доступа к обычным данным, состоящим из коротких строк. * Новый
параметр force_view_types для Arrow-потоков (по умолчанию отключен)
позволяет переключаться на "двоичный формат просмотра с переменным
размером", что значительно повышает производительность при
использовании представлений для чтения (read view). * Функция API
memcs_column_data_size() теперь разделена на
memcs_column_int_data_size() и memcs_column_ext_data_size() для
учета нового двойного формата хранения.
Проверка производительности сканирования была проведена для 3 различных
наборов строк (длины распределялись случайным образом в диапазоне 1-12,
1-100, 1-1000) и 2 различных режимов (notouch и touch). В режиме
notouch строки сканировались только пакетно, без доступа к ним; в
режиме touch строки сканировались и проверялся первый внешний символ:
- Строки длиной 1-12 символов: до 4,8 раз быстрее в режиме
notouchи в 3,2 раза быстрее в режимеtouch.
- Строки длиной 1-100 символов: до 3,1 раза быстрее в режиме
notouchи в 1,8 раза быстрее в режимеtouch.
- Строки длиной 1-1000 символов: до 10 раз быстрее в режиме
notouchи в 2,9 раза быстрее в режимеtouch. .