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