Tarantool CE/EE Documentation portal logo
Помощь

Миграции

Миграция — это любое изменение схемы данных: добавление или удаление поля, создание или удаление индекса, изменение формата поля и так далее. Создание спейса также является миграцией. С помощью миграций можно отслеживать эволюцию схемы данных начиная с ее первоначального состояния. В Tarantool миграции представляют собой Lua-код, изменяющий схему данных с помощью встроенного Lua API.

Существует два типа миграций:

  • простые миграции — не требуют дополнительных действий над существующими данными

  • сложные миграции — включают изменения как схемы, так и самих данных

Простые миграции

Существует два типа миграций схемы, не требующих миграции данных:

  • Создание индекса. Новый индекс можно создать в любой момент. Подробнее о создании индексов см. Индексы и справку space_object:create_index().

  • Добавление поля в конец спейса. Чтобы добавить поле, обновите формат спейса так, чтобы он включал все его поля, а также новое поле. Например:

    local users = box.space.writerslocal fmt = users:format()table.insert(fmt, { name = 'age', type = 'number', is_nullable = true })users:format(fmt)

    У поля должен быть задан параметр is_nullable. В противном случае возникнет ошибка, если спейс содержит кортежи старого формата.

Сложные миграции

Остальные типы миграций более сложны и требуют дополнительных действий для обеспечения целостности данных.

Миграции возможны в двух случаях:

  • При запуске Tarantool, когда базой данных еще не пользуются клиенты

  • Во время обработки запросов, когда базой данных уже пользуются активные клиенты В первом случае достаточно написать и протестировать код миграции. Наиболее сложная задача — миграция данных при наличии активных клиентов. Это следует учитывать еще при первоначальном проектировании схемы данных.

При наличии активных клиентов возникают следующие проблемы:

  • Связанные данные могут изменяться атомарно.
  • Система должна уметь передавать данные с использованием как новой, так и старой схемы.
  • При переносе данных в новый спейс доступ к данным должен учитывать, что они могут находиться в одном спейсе или в другом.
  • Запросы на запись не должны мешать миграции.

Распространенный подход — выполнять запись в соответствии с новой схемой данных.

Эти проблемы могут быть как актуальными, так и неактуальными в зависимости от приложения и его требований к доступности.

В Tarantool предусмотрены следующие возможности, упрощающие и повышающие безопасность миграций:

  • Механизм транзакций. Полезен при написании миграции, так как обеспечивает атомарную работу с данными. Однако перед использованием механизма транзакций следует изучить его ограничения. Подробнее см. раздел Транзакции.

  • Функция space:upgrade() (только EE). С помощью space:upgrade() можно включить сжатие и выполнить миграцию, включая уже созданные кортежи. Подробнее см. раздел Обновление схемы спейса.

  • Механизм централизованного управления миграциями (только EE). Реализован в Enterprise-версии утилиты tt и в TCM. Этот механизм позволяет выполнять миграции и отслеживать их статус в кластерах с репликацией. Подробнее см. Централизованное управление миграциями.

Применение миграций

Код миграции выполняется на работающем экземпляре Tarantool. Важно: ни один метод не гарантирует транзакционное применение миграций на всем кластере.

Метод 1: включить миграции в код приложения

Это достаточно просто: при перезагрузке кода данные мигрируются в нужный момент, и схема базы данных обновляется. Однако этот метод подходит не всем. Возможно, перезапустить Tarantool или обновить код с помощью механизма hot-reload не удастся.

Метод 2: утилита tt

Подключитесь к нужному экземпляру с помощью tt connect.

$ tt connect admin:password@localhost:3301
  • Если миграция написана в Lua-файле, ее можно выполнить с помощью dofile(). Вызовите эту функцию и укажите путь к файлу миграции в качестве первого аргумента. Это выглядит так:

    tarantool> dofile('0001-delete-space.lua')---...
  • (или) Скопируйте код скрипта миграции, вставьте его в консоль и выполните.

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

$ tt connect admin:password@localhost:3301 -f 0001-delete-space.lua

Централизованное управление миграциями

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

Механизм централизованного управления миграциями реализован в Enterprise-версии утилиты tt и в TCM.

Подробнее об управлении миграциями в кластерах Tarantool EE из командной строки см. Централизованные миграции с помощью tt. Подробнее об использовании этого механизма через веб-интерфейс TCM см. на странице документации TCM.