Я думаю, что эта проблема состоит из двух частей.
Во-первых, это управление схемой базы данных и ее изменениями. Мы делаем это с помощью South, сохраняя как рабочие модели, так и файлы миграции в нашем репозитории SCM. В целях безопасности (или паранойи) мы делаем дамп базы данных перед (и, если нам действительно страшно, после) выполнения каких-либо миграций. До сих пор Юг отвечал всем нашим требованиям.
Во-вторых, изменение схемы выходит за рамки простого запуска файла миграции, созданного South. По моему опыту, изменение базы данных обычно требует изменения развернутого кода. Если у вас есть даже небольшая веб-ферма, синхронизация развернутого кода с текущей версией схемы базы данных может оказаться нетривиальной задачей - ситуация ухудшится, если учесть различные уровни кэширования и влияние на уже активного пользователя сайта. На разных сайтах эта проблема решается по-разному, и я не думаю, что есть универсальный ответ.
Решить вторую часть этой проблемы не всегда просто. Я не верю, что существует универсальный подход, и недостаточно информации о вашем веб-сайте и среде, чтобы предложить решение, наиболее подходящее для вашей ситуации. Однако я думаю, что есть несколько соображений, которые можно иметь в виду, чтобы помочь при развертывании в большинстве ситуаций.
В некоторых случаях можно отключить весь сайт (веб-серверы и базу данных). Это, безусловно, самый простой способ управлять обновлениями. Но частые простои (даже если они запланированы) могут быть хорошим способом быстро начать нашу работу, утомительно развертывать даже небольшие изменения кода и могут занять много часов, если у вас большой набор данных и / или сложная миграция. Тем не менее, для сайтов, которыми я помогаю управлять (которые являются внутренними и обычно используются только в рабочее время в рабочие дни), этот подход творит чудеса.
Будьте осторожны, если вы вносите изменения в копию своей основной базы данных. Основная проблема здесь в том, что ваш сайт все еще активен и предположительно принимает записи в базу данных. Что происходит с данными, записанными в основную базу данных, пока вы заняты переносом клона для дальнейшего использования? Ваш сайт должен быть либо отключен все время, либо временно переведен в состояние только для чтения, иначе вы потеряете их.
Если ваши изменения обратно совместимы и у вас есть веб-ферма, иногда вы можете обойтись без обновления рабочего сервера производственной базы данных (что, я думаю, неизбежно в большинстве ситуаций), а затем постепенно обновляя узлы в ферме, вынимая их из балансировщик нагрузки на короткий период. Это может работать нормально - однако основная проблема здесь заключается в том, что если узел, который уже был обновлен, отправляет запрос на URL-адрес, который не поддерживается более старым узлом, вы получите сбой, поскольку вы не можете управлять этим на уровне балансировщика нагрузки.
Я видел / слышал несколько других способов, которые работают хорошо.
Во-первых, все изменения кода заключаются в блокировку функции, которая затем настраивается во время выполнения с помощью некоторых параметров конфигурации для всего сайта. По сути, это означает, что вы можете выпустить код, в котором все ваши изменения отключены, а затем после того, как вы сделали все необходимые обновления на своих серверах, вы измените параметр конфигурации, чтобы включить эту функцию. Но это делает довольно тяжелый код ...
Второй - позволить коду управлять миграцией. Я слышал о сайтах, где изменения в коде написаны таким образом, что перенос выполняется во время выполнения. Он может определять версию используемой схемы и формат данных, которые он получил обратно - если данные из старой схемы, он выполняет миграцию на месте, если данные уже из новой схемы, он ничего не делает. . Из естественного использования сайта большая часть ваших данных будет перенесена людьми, использующими сайт, остальное вы можете сделать с помощью сценария миграции, когда захотите.
Но я думаю, что в этот момент Google станет вашим другом, потому что, как я уже сказал, решение очень зависит от контекста, и я беспокоюсь, что этот ответ станет бессмысленным ... Найдите что-то вроде «развертывание с нулевым временем простоя», и вы ' Я получу такие результаты, как это с куча идей ...
person
Mark Streatfield
schedule
02.06.2012