Как решить проблему с жидкостью, ожидающей проблему блокировки журнала изменений в нескольких модулях в кластере OpenShift? - PullRequest
0 голосов
/ 23 апреля 2020

Пожалуйста, скажите что-нибудь об этой проблеме:

Мы поддерживаем несколько микросервисов, написанных на Java с использованием Spring Boot и развернутых в OpenShift. Некоторые микросервисы связываются с базами данных. Мы часто запускаем один микросервис в нескольких модулях в одном развертывании. Когда запускается каждый микросервис, он запускает liquibase, которая пытается обновить базу данных. Проблема в том, что иногда один модуль не работает с ожиданием проблемы блокировки журнала изменений. Когда по какой-то причине это происходит в производственном кластере OpenShift, мы ожидаем, что другие модули будут давать сбой при перезапуске из-за той же проблемы с проблемой блокировки журнала изменений. Таким образом, в худшем случае все модули будут ожидать снятия блокировки.

Мы хотим, чтобы liquidbase автоматически подготавливал схемы нашей базы данных при запуске модуля.

Так что, пожалуйста, расскажите лучший способ решить эту проблему? Хорошо ли хранить эту логику c в каждом микросервисе? Как мы можем автоматически решить проблему, когда появляется проблема блокировки журнала изменений в жидкой базе? Нужно ли помещать логи подготовки базы данных c в отдельное развертывание?

Спасибо

# Обновлено

Так что, возможно, мне следует перефразировать мой вопрос. Каков наилучший способ запустить миграцию БД с точки зрения микросервисной архитектуры? Может быть, мы не должны использовать миграцию БД в каждом модуле? Может быть, лучше сделать это с отдельным развертыванием или с какой-то дополнительной работой Jenkins, а не в OpenShift вообще?

1 Ответ

0 голосов
/ 23 апреля 2020

Когда Liquibase запускается во время развертывания весенней загрузки, он выполняет (на очень высоком уровне) следующие шаги:

  1. блокирует базу данных (создает запись в databasechangeloglock)
  2. execute changeLogs;
  3. удалить блокировку базы данных;

Так что, если вы прервете развертывание приложения, пока Liquibase находится между шагами 1 и 3, ваша база данных останется заблокированной. Поэтому, когда вы попытаетесь повторно развернуть свое приложение, Liquibase потерпит неудачу, потому что он будет обрабатывать вашу базу данных как заблокированную.

Поэтому вам необходимо разблокировать базу данных перед повторным развертыванием приложения.

Там мне известны два варианта:

  1. Очистить databasechangeloglock таблицу или установить locked на false. Это DELETE FROM databasechangeloglock или UPDATE databasechangeloglock SET locked=0
  2. Выполнить команду liquibase releaseLocks. Вы можете найти документацию об этом здесь и здесь .
...