Комментарии 6
Распределенные блокировки в Liquibase
Liquibase создает таблицу DATABASECHANGELOGLOCK
, в которой содержится одна запись.
| ID | LOCKED | LOCKEDBY | LOCKGRANTED |
|:---|:-------|:---------|:------------|
| 1 | false | null | null |
Блокировка для большинства СУБД происходит следующим образом:
-- acquire lock
SELECT LOCKED FROM DATABASECHANGELOGLOCK WHERE ID = 1;
-- Если false, делаем запрос на взятие блокировки
UPDATE DATABASECHANGELOGLOCK SET LOCKED = true .. WHERE ID = 1;
-- Если UPDATE вернул 0, то блокировку взять не удалось, повторим взятие блокировки через 1 секунду.
-- run migrations..
-- release lock
UPDATE DATABASECHANGELOGLOCK SET LOCKED = false WHERE ID = 1;
В текущем виде этот подход не позволит получить корректно распределенную блокировку для YDB, так как на данный момент UPDATE не возвращает количество обновленных строк. Этот способ становится рабочим, если взятие блокировки делать в транзакции уровня SERIALIZABLE
.
На этом уровне изоляции транзакция фиксирует состояние записи согласно модели MVCC. Если другая транзакция изменяет те же данные, текущая транзакция становится недействительной, поскольку она работала с уже неактуальной версией данных.
-- acquire lock
SELECT LOCKED FROM DATABASECHANGELOGLOCK WHERE ID = 1;
-- Если false, делаем запрос на взятие блокировки
UPDATE DATABASECHANGELOGLOCK SET LOCKED = true .. WHERE ID = 1;
COMMIT;
-- Transaction lock invalidated - означет, что блокировку не удалось взять, кто - то нас обогнал
Клиенты, которые не получили блокировку пытаются получить ее снова с интервалом 1 секунда.
Привет @KirillKurdyukov, попытался запустить это в докере локально (предварительно скачав драйвер и диалект), с такой конфигурацией
version: '3'
services:
ydb-migrate-local:
image: flyway/flyway
command: -url=jdbc:ydb:grpc://localhost:2136/local -locations=/flyway/migration migrate
volumes:
- ./db/migration:/flyway/migration
- ./db/drivers:/flyway/libexec/drivers
- ./db/lib:/flyway/libexec/lib
- ./db/ydb_certs:/ydb_certs
- ./db/ydb_data:/ydb_data
depends_on:
- ydb-local
ydb-local:
image: cr.yandex/yc/yandex-docker-local-ydb:latest
environment:
GRPC_TLS_PORT: 2135
GRPC_PORT: 2136
MON_PORT: 8765
YDB_DEFAULT_LOG_LEVEL: NOTICE
YDB_USE_IN_MEMORY_PDISKS: true
hostname: localhost
ports:
- "2135:2135"
- "2136:2136"
- "8765:8765"
выдаёт ошибку
2024-10-15 14:02:40 ERROR: No database found to handle jdbc:ydb:grpc://ydb-local:2136/local
CLI check
ydb -e grpc://localhost:2136 -d /local scheme ls
.sys_health .sys
Выглядит так, как-будто это проблема не в докере / сети / хоста.
Добрый день!
Я воспроизвел вашу проблему у себя локально. И сделал пару наблюдений:
1. Не увидел flyway/libexec/lib в образе
2. Боюсь, что список баз данных в образе ограничен
Продолжу изучать вопрос.
Добрый! Спасибо за ответ!
В образ с flyway я монтирую это в виде volume
- ./db/lib:/flyway/libexec/lib
Предварительно скачав положив в папку проекта /db/lib файлflyaway-ydb-dialect.jar
, хотя собственно он не особо должен влиять именно на запуск контейнера, т.к. это диалект YQL для flyway
структура выглядит так
root-folder
|-- db
|---- drivers
|-------- ydb-jdbc-driver-shaded-2.2.11.jar
|---- lib
|-------- flyway-ydb-dialect.jar
|---- migration
|-------- V1_initial.sql
|---- ydb_certs
|---- ydb_data
|
|docker-compose.yml
В этом комментарии на похожий issue или обратный моему чуть больше контекста
Мне кажется, что Docker образ Flyway не поддерживает кастомные расширения databaseType. (сущность, расширяющая flyway).
https://github.com/flyway/flyway-docker/issues/159 завел ишью по этому поводу.
Обратите внимание какие директории доступны flyway/libexec/lib
гипотеза: /flyway/libexec/lib - зашита в образе
Спасибо вам за подробное разъяснение вашей проблемы!
Спасибо!
Кстати этот образ flyway/flyway является вроде бы OpenSource версией.
Я даже пробовал другой - "официальный" образ от redgate ссылка на который упоминается в официальной документации YDB/migrations/Flyway
Для работы с YDB через Flyway CLI требуется установить flyway утилиту любым из рекомендованных способов.
Сейчас не уверен, проверю ещё раз, но там кажется проблема не решалась, и воспроизводилась.
Миграции схемы данных YDB с Flyway и распределенные блокировки