Можно ли развернуть корпоративное приложение ASP.NET и изменения схемы SQL с нулевым временем простоя? - PullRequest
19 голосов
/ 05 января 2011

У нас есть огромное веб-приложение ASP.NET, которое необходимо развернуть в LIVE с нулевым или почти нулевым временем простоя. Позвольте мне отметить, что я прочитал следующий вопрос / ответы , но, к сожалению, это не решает наши проблемы, поскольку наша архитектура немного сложнее.

Допустим, в настоящее время у нас есть два сервера IIS, отвечающих на запросы, и оба подключены к одному и тому же серверу MSSQL. Решение кажется легким, но не из-за серьезных изменений схемы, которые мы должны время от времени применять. Из-за огромных размеров простое резервное копирование базы данных занимает около 8 минут, что стало неприемлемым, но это необходимо перед каждым новым развертыванием по соображениям безопасности.

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

В настоящее время лучшей идеей, которую мы придумали, является покупка другого сервера SQL, который будет настроен как копия исходной БД. Из балансировщика нагрузки мы будем направлять весь новый трафик на один из двух веб-серверов IIS. Когда второй веб-сервер свободен от запуска сессий, мы можем развернуть новый код. Теперь самое сложное. На этом этапе мы переходим в автономный режим с веб-сайтом, отключаем репликацию между двумя SQL-серверами, чтобы у нас был моментальный снимок базы данных в надежном согласованном состоянии (экономит 7,5 из 8 минут). Наконец, мы должны обновить схему базы данных на главном сервере SQL и направить весь трафик через обновленный веб-сервер, пока мы обновляем второй веб-сервер до новой версии.

Пожалуйста, поделитесь своими мыслями по поводу этого решения. Можем ли мы как-то избавиться от необходимости переходить в автономный режим с веб-сайтом? Как компании Bluechip с веб-приложениями Mammut делают развертывание?

Каждая идея или предложение приветствуются! Покупка нового оборудования или программного обеспечения на самом деле не является проблемой - мы просто упускаем из виду новую идею Заранее спасибо за помощь!

Изменить 1 (2010.01.12):
Другим требованием является устранение ручного вмешательства, поэтому на самом деле мы ищем способ, который может быть применен автоматически.

Позвольте мне напомнить вам список требований:
1. Резервное копирование базы данных
2а. Развертывание сайта
2b. Обновление схемы базы данных
3. Перейдите на обновленный сайт.
4 (необязательно): простой способ вернуться на старый сайт, если что-то пойдет не так.

Ответы [ 9 ]

8 голосов
/ 12 января 2011

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

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

4 голосов
/ 18 января 2011

Окружающая среда:

  1. Актуальные веб-сайты в реальном времени
  2. Текущая живая база данных
  3. Новая версия веб-сайта (ов)
  4. Новая версия базы данных

Подход:

  1. Установите фид (например, репликацию, хранимую процедуру и т. Д.), Чтобы текущий сервер баз данных отправлял обновления данных в новую версию базы данных.
  2. Измените маршрутизатор, чтобы новые запросы указывали на новую версию веб-сайта до тех пор, пока старые сайты больше не будут обслуживать запросы.
  3. Сноси старый сайт и базу данных.

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

3 голосов
/ 19 января 2011

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

Таким образом, все изменения сводятся к минимуму, ошибки исправляются своевременно, в разработке не наблюдается сползания, и поскольку это происходит так часто, КАЖДЫЙ мотивирован, чтобы процесс развертывания был автоматическим и без сбоев. насколько возможно.

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

Для этих больших изменений схемы мы разработали модель «преодоления разрыва». То есть мы реализуем слой преобразования базы данных, который будет работать почти в режиме реального времени, обновляя оперативную копию данных схемы new style во второй базе данных на основе текущих данных в текущем развернутая система.

Мы копировали бы это пару раз в день в систему UAT и использовали его в качестве основы для тестирования (следовательно, у тестировщиков всегда есть реалистичный набор данных для тестирования, и слой преобразования тестируется как часть этого).

Таким образом, изменение в базе данных постоянно запущено, и развертывание новой системы - это просто случай:

  1. заморозить всех
  2. Отключение слоя преобразования
  3. Включение нового прикладного уровня
  4. Переключение пользователей на новый уровень приложений
  5. Разморозить все

Здесь откат становится чем-то вроде проблемы. Если новая система работает в течение часа, откат к старой системе не является легким. Слой обратного преобразования был бы идеальным, но я не думаю, что у нас когда-либо был кто-то, кто мог бы купить идею потратить время на него.

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

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

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

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

3 голосов
/ 07 января 2011

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

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

When you come to do a release you do the following:
1. Change database schema, ensuring no stored procedures of the previous 
   version are broken.
2. Release the next version of stored procedures
3. Change the global setting, which switches the application to use the 
   next set of stored procedures/new schema.

Хитрая частьгарантирует, что вы ничего не сломаете при изменении схемы базы данных.

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

Это должно означать почти нулевое время простоя, если вы можете сделать это правильно.

1 голос
/ 07 сентября 2012

Смотрите мой ответ здесь: Как развернуть приложение ASP.NET с нулевым временем простоя

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

1 голос
/ 18 января 2011

Я видел этот пост некоторое время назад, но никогда не использовал его, поэтому не могу ручаться за простоту использования / пригодность, но у MS есть бесплатная среда развертывания веб-фермы, которая может вам подойти:

http://weblogs.asp.net/scottgu/archive/2010/09/08/introducing-the-microsoft-web-farm-framework.aspx

1 голос
/ 18 января 2011

Поскольку вы говорите, что у вас нет проблем с приобретением нового сервера, я предлагаю лучший способ, чтобы сначала на вашем сервере развернуть ваше приложение. Выполните следующие шаги:
1. Добавьте любые сертификаты, если требуется, на этот новый сервер и протестируйте приложение с новыми настройками.
2. Завершите работу своего старого сервера и назначьте его IP-адрес новому серверу, время простоя будет таким же, как если бы сервер отключился, а вы назначаете новый IP-адрес новому серверу.
3. Если вы видите, что новый Deploy не работает, вы всегда можете вернуться обратно, выполнив шаг 2 снова.
Что касается резервной копии вашей базы данных, вам придется установить расписание резервного копирования.

1 голос
/ 16 января 2011

Я бы рекомендовал использовать службы Analysis Services вместо ядра базы данных для ваших нужд по отчетности. Затем вы можете обработать свои кубы .. переместить базу данных .. изменить строку подключения, повторно обработать ваши кубы и, таким образом - иметь нулевое время простоя.

Серьезно серьезно ... В мире нет лучшего продукта, чем службы Analysis Services для такого рода вещей.

0 голосов
/ 22 апреля 2011

Я только что ответил на аналогичный вопрос здесь: Развертывание веб-сайта ASP.NET и обновление базы данных MSSQL с нулевым временем простоя

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...