Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Деплой и откат приложения и миграций БД

Деплой и откат приложения и миграций БД

Большинство компаний используют Kubernetes для деплоя приложений в dev и prod окружения. Но что делать, если в процессе эксплуатации что-то пошло не так и надо срочно откатить до предыдущего релиза? С помощью helm мы можем легко откатить само приложение, но что делать с базой данных? В рамках доклада обсудим, как можно откатывать миграции БД, как автоматизировать этот процесс и какие новые сложности это приносит в разработку.

Avatar for Romanov Alexey

Romanov Alexey

August 19, 2025
Tweet

More Decks by Romanov Alexey

Other Decks in Programming

Transcript

  1. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 ПЛАН ДОКЛАДА 2 Что мы хотим решить? Какие есть варианты решения? Какие операции SQL можно откатить? Сравнение решений для миграции БД: flyway vs. liquibase. Как устроен liquibase внутри? Пример: деплоим приложение в кластер k8s, откатываем и снова накатываем до последней версии. Откат миграций. Ограничения решения. Как настроить liquibase для применения отката миграций. Выводы: в чем польза такого решения?
  2. О СПИКЕРЕ 3 В индустрии более 13 лет. Co-founder Ed-Tech

    стартапа IT Enduro. Основная специализация – разработка Java / Kotlin. Работаю в роли Software Архитектора более 7 лет. Мы с вами встречались на других конференциях 🙂
  3. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 ЧТО МЫ ХОТИМ РЕШИТЬ? 4 Нам нужно тестировать features. Локально понять невозможно, потому что много сервисов. Но мы не можем создавать окружения для feature-веток. А значит вынуждены деплоить на существующий контур: 
 $ helm upgrade balance-calculator $REVISION --wait Ну и откатывать: 
 $ helm rollback $REVISION --wait А как откатывать миграции баз данных?
  4. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 КАКИЕ ЕСТЬ ВАРИАНТЫ РЕШЕНИЯ? 5 DROP DATABASE. pg-dump & pg-restore. Rollback migrations.
  5. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 6 ПРЯМЫЕ И ОБРАТНЫЕ SQL ОПЕРАЦИИ ПРЯМАЯ ОПЕРАЦИЯ ОБРАТНАЯ ОПЕРАЦИЯ CREATE TABLE (VIEW, INDEX, FUNCTION, TRIGGER, SEQUENCE) DROP ADD COLUMN DROP COLUMN ALTER COLUMN ALTER COLUMN ALTER ... RENAME TO ... ALTER ... RENAME TO ... DROP TABLE (VIEW, FUNCTION, TRIGGER, SEQUENCE) CREATE
  6. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 7 ПРЯМЫЕ И ОБРАТНЫЕ SQL ОПЕРАЦИИ ПРЯМАЯ ОПЕРАЦИЯ ОБРАТНАЯ ОПЕРАЦИЯ DROP COLUMN (NOT NULL) ADD COLUMN UPDATE ... SET ... ALTER COLUMN SET NOT NULL DROP CONSTRAINT DELETE ... (records, which not meet constraint) CREATE CONSTRAINT INSERT DELETE (can leave unmodified, if doesn't affect process) UPDATE UPDATE (can leave unmodified, if doesn't affect process) DELETE, TRUNCATE INSERT (if possible)
  7. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 8 FLYWAY VS. LIQUIBASE Задача скриптов миграции – контролируемое обновление базы данных. LIQUIBASE FLYWAY Прямая миграция + + Откат миграций + + (коммерческая версия) Несколько шагов в рамках одной миграции + – SQL + + Java + + SQL независимый синтаксис + – Запуск через CLI + + Условие запуска + –
  8. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 УСТРОЙСТВО LIQUIBASE 9 Liquibase использует три таблицы для контроля запущенных скриптов: DATABASECHANGELOG используется для записи запущенных миграций. DATABASECHANGELOGLOCK используется для контроля, что только один instance с миграциями был запущен в текущий момент времени. DATABASECHANGELOGHISTORY (только для платной версии) – таблица, где хранится информация обо всех изменениях, примененных к базе данных.
  9. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 УСТРОЙСТВО LIQUIBASE 10 В таблице DATABASECHANGELOG записывается запуск каждого changeSet: FILENAME – имя файла (по-умолчанию, путь до файла). EXECTYPE (EXECUTED, FAILED, SKIPPED, RERAN, MARK_RUN) – статус запуска. Если запуск завершился неудачно, то при рестарте он будет выполнен повторно. MD5SUM – checksum скрипта миграции, используется чтобы в миграциях не появилось измененных скриптов.
  10. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 11 ПРИМЕР РЕАЛИЗАЦИИ REST API Версия приложения и сборки 
 GET http://localhost:8080/api/v1/version Запрос на получение пользователей из БД 
 GET http://localhost:8080/api/v1/users Миграции базы данных Создание таблицы users. Изменение типа столица id на IDENTITY. Создание таблицы address и FK от users → address. Изменение поля status на enum. Изменение таблицы users на партиционирование. Увеличение размера поля login до 80 символов.
  11. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 12 ПРИМЕР РЕАЛИЗАЦИИ https://github.com/romanow/database-migration
  12. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 ДЕПЛОЙ ПРИЛОЖЕНИЯ 14 При деплое версия миграции указывается в поле description (в данном случае Image Tag = Database Migration Tag: $ helm upgrade \ migration-application \ romanow/java-service \ --values=k8s/migration-application/values.yaml \ --set image.tag="$IMAGE_VERSION" \ --description "$IMAGE_VERSION" \ --install \ —wait
  13. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 17 ДЕПЛОЙ ПРИЛОЖЕНИЯ $ helm history migration-application REVISION UPDATED STATUS CHART VERSION DESCRIPTION 1 Wed Aug 21 13:42:26 2024 superseded java-1.6.1 1.0 v1.0 2 Wed Aug 21 13:45:43 2024 superseded java-1.6.1 1.0 v2.0 3 Wed Aug 21 13:48:05 2024 superseded java-1.6.1 1.0 v3.0 4 Wed Aug 21 13:53:36 2024 superseded java-1.6.1 1.0 v4.0 5 Wed Aug 21 13:57:26 2024 superseded java-1.6.1 1.0 v5.0 6 Wed Aug 21 14:00:30 2024 deployed java-1.6.1 1.0 v6.0
  14. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 ОТКАТ МИГРАЦИЙ 18 При откате релиза через Helm используется номер ревизии: $ helm install \ --generate-name \ romanow/common-job \ --values=k8s/rollback-job/values.yaml \ --set rollbackTag="$VERSION" \ --wait $ REVISION=$(helm history --output json migration-application | \ jq 'map(select(.description=='\"$VERSION\"')) | \ first | .revision') $ helm rollback migration-application "$REVISION" --wait
  15. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 21 ОТКАТ МИГРАЦИЙ $ helm history migration-application REVISION UPDATED STATUS CHART VERSION DESCRIPTION 1 Wed Aug 21 13:42:26 2024 superseded java-1.6.1 1.0 v1.0 2 Wed Aug 21 13:45:43 2024 superseded java-1.6.1 1.0 v2.0 3 Wed Aug 21 13:48:05 2024 superseded java-1.6.1 1.0 v3.0 4 Wed Aug 21 13:53:36 2024 superseded java-1.6.1 1.0 v4.0 5 Wed Aug 21 13:57:26 2024 superseded java-1.6.1 1.0 v5.0 6 Wed Aug 21 14:00:30 2024 superseded java-1.6.1 1.0 v6.0 7 Wed Aug 21 14:31:31 2024 deployed java-1.6.1 1.0 Rollback to 3
  16. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 ОГРАНИЧЕНИЯ РЕШЕНИЯ 22 Не всем миграции можно откатить: INSERT, UPDATE, DELETE. Откат миграций требуется тщательно проверять отдельно: 
 ALTER TABLE ... RENAME TO ... изменяет кроме имени таблицы еще и зависимые CONSTRAINT, INDEX, SEQUENCE. Требуется связывать версию миграции и версию деплоя.
  17. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 НАСТРОЙКА LIQUIBASE 23 Liquibase выполняет откат по имени миграций (filename). При старте миграций из Spring Boot имя миграции будет: BOOT-INF/classes/db/liquibase/changelog/v1.0_CreateUserTable.xml 
 При откате миграций через docker контейнер нужно положить миграции по такому же пути: FROM liquibase/liquibase:4.20 COPY src/main/resources/db/liquibase /BOOT-INF/classes/db/liquibase COPY liquibase-container/drivers/postgresql-driver.jar /liquibase/lib COPY liquibase-container/config/liquibase.docker.properties /liquibase
  18. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 НАСТРОЙКА LIQUIBASE 24 В конец каждой миграции добавляем tag: 
 <changeSet id="3" author="aromanow" labels="v1.0"> 
 <tagDatabase tag="v1.0"/> 
 </changeSet> Добавляем проверку отката миграций: spring: 
 liquibase: change-log: classpath:db/liquibase/changelog.xml test-rollback-on-update: true
  19. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 ВЫВОДЫ 25 Откат миграций является сложным и хрупким механизмом, требующим большого контроля со стороны разработки. С другой стороны, он позволяет автоматически поддерживать схему и данные на тестовых стендах в актуальном состоянии даже в случае откатов релизов. Большинство миграций схемы можно откатить. С данными сложнее. Liquibase позволяет даже в бесплатной версии реализовать откат миграций.
  20. © IT Enduro «Деплой и откат приложения и миграций БД»,

    2024 @romanow romanowalex @it_enduro it-endu.ro ПОДПИСКА И КОЛОКОЛЬЧИК 26 БЛАГОДАРЮ ЗА ВНИМАНИЕ ПРИМЕР: DATABASE MIGRATION