Как стать автором
Обновить

Комментарии 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. Боюсь, что список баз данных в образе ограничен

Продолжу изучать вопрос.

Добрый! Спасибо за ответ!

  1. В образ с 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 утилиту любым из рекомендованных способов.

Сейчас не уверен, проверю ещё раз, но там кажется проблема не решалась, и воспроизводилась.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий