Управление эволюциями в производственной среде

Мы находимся в процессе развертывания нового приложения, использующего игру 2.1.1 для производства, и у него есть некоторые реальные проблемы, и очень ограниченная документация не помогла...

Итак, пришло время обновиться до новой версии, мы запустили обычные скрипты stop/upgrade/start, но они не удались. По какой-то причине игра отказывалась применять эволюцию. Когда он начинал, он говорил:

Не удается запустить сервер. @6elnj89fh: для базы данных требуется дефолт!

Это было даже при том, что мы попытались установить applyEvolutions.default=true как через командную строку, так и в файл application_prod.conf. Он также жаловался, что

ВНИМАНИЕ! Этот script содержит эволюции DOWNS, которые, вероятно, разрушают

который не имеет большого смысла для меня, так как мы поднимаемся в версии, поэтому нисходящие ни в коем случае не должны применяться. Но, похоже, это было причиной того, что он отказывался применять эволюцию.

В этот момент я не был так обеспокоен, как я предположил, что есть какой-то ручной способ применения эволюций. После обширного поиска это выглядит так... Поддержка была в игре 1, но не в игре 2. В режиме dev вы можете просто нажать кнопку в браузере, чтобы применить эволюцию, но в режиме prod я мог найти NO WAY OF OF ВНЕШНЕЕ ПРИМЕНЕНИЕ ЭВОЛЮЦИЙ. Это правда или я пропустил это? Я действительно думаю, что это важная функция! (На заднем плане я мог бы применить скрипты вручную и отключить плагин эволюции, но тогда я бы потерял отслеживание эволюции, что полезно..)

Я также задаюсь вопросом, как вы собираетесь "поддерживать" свою базу данных, поскольку я уверен, что мы достигнем точки, когда нам нужно это сделать в какой-то момент. Если бы был ручной способ сделать это, у него, вероятно, был бы необязательный аргумент версии для понижения базы данных. Например. если вы находитесь в версии 5 и вам нужно вернуться к 4, вы запустите play apply-evolutions 4, который затем применил бы сокращения от версии 5 и соответствующим образом обновил db эволюции. Я мог бы применить пачки вручную, но опять же проблема в эволюции db снова будет в недопустимом состоянии...

Получив отчаяние, я попробовал все настройки, которые мог найти, чтобы снова запустить сервер и добавил параметр -DapplyDownEvolutions.default=true. Я предположил, что этот параметр будет применяться к спадам только при выборе возможности понизить базу данных (хотя, похоже, такой опции нет), но на самом деле это было применение всплывающих окон, а затем мгновенное применение спадов (я выяснил это позже при поиске и устранении неисправностей как теперь сервер, наконец, начался - без какого-либо сообщения, но дал сообщение об ошибке при посещении сайта). Это то, что должен делать этот параметр? Если я не понимаю, почему настройка существует. Я не могу придумать ни одного сценария, в котором вы хотели бы применить взлеты, а затем мгновенно сбрасывается при переходе на новую версию базы данных. Может кто-то пролить свет на эту настройку?

В этот момент я могу, наконец, снова запустить приложение, вручную перезапустив соответствующие "UP".

На этом этапе мы работаем над тем, чтобы в основном перезаписывать сценарии для обработки эволюций самостоятельно, чтобы иметь лучший контроль над тем, что запускается и чтобы вернуться. Было бы намного лучше использовать функции воспроизведения для это так, я надеюсь, кто-то может пролить свет на это. Если нет, возможно, эта напыщенность может помочь кому-то в подобной ситуации...

Ответ 1

Изменить: обновлено для Play 2.5


Мы используем Play эволюции для производства примерно с 3 лет и никогда не сталкивались с серьезными проблемами.

Я рекомендую иметь промежуточную среду, в которой вы сначала запускаете эволюцию в тестовой базе данных. База данных теста должна иметь ту же версию, что и производственная база данных. Вы будете ошибаться в своих эволюциях, и это способ найти их, прежде чем они отправятся на производственный сервер.

Рекомендуемые настройки

Для нашей производственной системы, мы включили следующий параметр:

play.evolutions.db.default.autoApply=true

Настройка autoApply гарантирует, что эволюция применяется автоматически, без взаимодействия с пользователем. Очевидно, именно это мы хотим при обновлении нашей производственной базы данных.

Для нашей системы постановки/тестирования у нас есть обе настройки:

play.evolutions.db.default.autoApply=true
play.evolutions.db.default.autoApplyDowns=true

Вторая настройка applyDownEvolutions гарантирует, что изменения DOWNS будут применены автоматически. Мы НЕ хотим этого в нашей производственной системе, потому что это может привести к потере данных (поскольку эволюции DOWNS часто содержат такие вещи, как DROP TABLE и т.д.).

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

Восстановление после отказа эволюции

Имейте в виду, что если одна эволюция выходит из строя из-за ошибки SQL (в системе производства или тестирования), вам придется восстановить базу данных в нормальное состояние вручную. Вы можете сделать это, посмотрев таблицу play_evolutions. Там Play отслеживает прикладные эволюции и их ошибки. Последняя запись показывает последнюю прикладную эволюцию, а также ошибку, с которой столкнулась.

Из сообщения об ошибке вы обычно можете отследить плохой SQL и исправить свои эволюции script. Затем вы можете вернуть базу данных в предыдущую версию эволюции и удалить неудачную запись об эволюции из таблицы play_evolutions. Игра затем думает, что новая эволюция еще не была применена, и снова запустит ее.

Надеюсь, что это поможет.