Я пытаюсь добиться развертывания без простоев, чтобы я мог развертывать меньше в нерабочее время и больше в «более медленные» часы - или в любое время, теоретически.
Моя текущая настройка несколько упрощена:
- Веб-сервер A (приложение .NET)
- Веб-сервер B (приложение .NET)
- Сервер базы данных (SQL Server)
Мой текущий процесс развертывания:
- «Остановить» сайты на веб-сервере A и B
- Обновите схему базы данных для версии развертываемого приложения.
- Обновить веб-сервер A
- Обновить веб-сервер B
- Верните все в онлайн
Текущая проблема
Это приводит к небольшому количеству простоев каждый месяц - около 30 минут. Я делаю это в нерабочее время, так что это не большая проблема, но я бы хотел от этого уйти.
Кроме того, нет никакого способа действительно вернуться назад. Я обычно не делаю сценарии отката БД - только сценарии обновления.
Использование балансировщика нагрузки
Я хотел бы иметь возможность обновлять один веб-сервер одновременно. Извлеките веб-сервер A из балансировщика нагрузки, обновите его, снова включите, а затем повторите для веб-сервера B.
Проблема в базе данных. Каждую версию моего программного обеспечения нужно будет выполнять с другой версией базы данных, поэтому я как бы "застрял".
Возможное решение
Текущее решение, которое я рассматриваю, заключается в принятии следующих правил:
- Никогда не удаляйте таблицу базы данных.
- Никогда не удаляйте столбец базы данных.
- Никогда не переименовывайте столбец базы данных.
- Никогда не переупорядочивайте столбец.
- Каждая хранимая процедура должна быть версионной.
- Значение - spFindAllThings станет spFindAllThings_2 при редактировании.
- Затем он становится «spFindAllThings_3» при повторном редактировании.
- То же правило относится к представлениям.
Хотя это кажется немного экстремальным - я думаю, что это решает проблему. Каждая версия приложения будет бесперебойно работать с БД. Код ожидает определенных результатов от представлений / хранимых процедур - и это сохраняет этот «контракт» действительным. Проблема в том, что он просто просачивается. Я знаю, что могу вычистить старые хранимые процедуры после того, как приложение будет развернуто некоторое время, но оно просто кажется грязным. Кроме того - это зависит от всех разработчиков, придерживающихся этого правила, что в основном произойдет, но я предполагаю, что кто-то допустит ошибку.
Наконец - мой вопрос
- Это неряшливый или хакерский?
- Кто-нибудь еще делает это так?
- Как другие люди решают эту проблему?