Миграции
Миграция — это любое изменение схемы данных: добавление или удаление поля, создание или удаление индекса, изменение формата поля и так далее. Создание спейса также является миграцией. С помощью миграций можно отслеживать эволюцию схемы данных начиная с ее первоначального состояния. В 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.