Как развернуть ASP.NET применение с нулевым временем простоя
для развертывания новой версии нашего сайта мы делаем следующее:
- застегните новый код и загрузите его на сервер.
- на сервере live удалите весь код live из каталога веб-сайта IIS.
- распакуйте zip-файл новый код в пустой каталог IIS
этот процесс все по сценарию, и происходит довольно быстро, но все еще может быть 10-20 секунд простоя, когда старые файлы удаляются, а новые файлы развертываются.
любые предложения по 0-секундному методу простоя?
11 ответов:
вам нужно 2 сервера и балансировщик нагрузки. Вот в шагах:
- включить весь трафик на сервере 2
- развертывание на сервере 1
- Тестовый Сервер 1
- включить весь трафик на сервере 1
- развертывание на сервере 2
- Тестовый Сервер 2
- включить трафик на обоих серверах
дело в том, что даже в этом случае у вас все равно будут перезапуски приложений и потеря сеансов, если вы используете "липкие сеансы". Если у вас есть сеансы базы данных или сервера, то все должно быть нормально.
The Microsoft Web Deployment Tool поддерживает это в некоторой степени:
Включает Транзакционный Файл Windows Поддержка системы (TxF). Когда как txf поддержку включено, файловые операции являются атомные; то есть они либо преуспевают или полностью провалиться. Это обеспечивает данные целостность и предотвращает данные или файлы из существующих на "полпути" или коррумпированное государство. В MS Deploy TxF-это отключено по умолчанию.
похоже, что транзакция для всей синхронизации. Кроме того, TxF является функцией Windows Server 2008, поэтому эта функция транзакции не будет работать с более ранними версиями.
Я считаю, что можно изменить сценарий для 0-простоя, используя папки в качестве версий и метабазы IIS:
- для существующего пути / url:
- путь: \web\app\v2. 0\
- url:http://app
- скопировать новый (или изменено) сайт на сервер под
- \веб\приложения\В2.1\
- изменить метабазу IIS, чтобы изменить путь к веб-сайту
- С \web \ app\2.0\
- до \веб\приложения\В2.1\
этот метод предлагает следующие преимущества:
- в случае, если новая версия имеет проблему, вы можете легко откатиться к v2. 0
- для развертывания в нескольких физические или виртуальные серверы, вы можете использовать свой сценарий для развертывания файлов. Как только все серверы получат новую версию, вы можете одновременно изменить метабазы всех серверов с помощью средства веб-развертывания Microsoft.
вы можете добиться нулевого времени простоя развертывания на одном сервере, используя маршрутизацию запросов приложений в IIS в качестве балансировщика нагрузки программного обеспечения между двумя локальными сайтами IIS на разных портах. Это известно как стратегия развертывания синий зеленый где только один из двух сайтов доступен в балансировщик нагрузки в любой момент времени. Разверните на сайте, который находится "вниз", разогрейте его и внесите в балансировщик нагрузки (обычно путем передачи проверки работоспособности маршрутизации запросов приложений), а затем возьмите исходный сайт, который был вверх, из "пула" (опять же, сделав его проверку работоспособности неудачной).
Я недавно прошел через это, и решение, которое я придумал, состояло в том, чтобы настроить два сайта в IIS и переключаться между ними.
для моей конфигурации у меня был веб-каталог для каждого сайта A и B, как это: интерфейс\c:\Intranet\Live c:\Intranet\Live B \ Interface
в IIS у меня есть два одинаковых сайта (одни и те же порты, аутентификация и т. д.) Каждый со своим собственным пулом приложений. Один из сайтов запущен (A), а другой остановлен (B). у живого также есть прямую заголовка.
когда дело доходит до развертывания в реальном времени, я просто публикую в месте остановленного сайта. Поскольку я могу получить доступ к сайту B с помощью его порта, я могу предварительно разогреть сайт, чтобы первый пользователь не вызывал запуск приложения. Затем с помощью пакетного файла я копирую заголовок live host в B, останавливаю A и запускаю B.
С Помощью Microsoft.Сеть.Класс ServerManager администрирования вы можете разработать свой собственный агент развертывания.
трюк состоит в том, чтобы изменить физический путь VirtualDirectory, что приводит к онлайн-атомарному переключению между старыми и новыми веб-приложениями.
имейте в виду, что это может привести к тому, что старые и новые домены приложений будут выполняться параллельно!
проблема состоит в том, чтобы синхронизировать изменения в базы данных и т. д.
путем опроса на наличие доменов приложений со старыми или новыми физическими путями можно определить, когда старые Домены приложений завершились, и если новые домены приложений были запущены.
для запуска домена приложения необходимо выполнить HTTP-запрос (IIS 7.5 поддерживает функцию автозапуска)
теперь вам нужен способ блокировать запросы для нового домена приложений. Я использую именованный мьютекс, который создается и принадлежит агенту развертывания, обслуживается Application_Start нового веб-приложения, а затем выпускается агент развертывания после обновления базы данных.
(Я использую файл маркера в веб-приложении, чтобы включить поведение ожидания мьютекса) После запуска нового веб-приложения я удаляю файл маркера.
хорошо, так как все понижают ответ, который я написал еще в 2008 году*...
Я расскажу вам, как мы делаем это сейчас в 2014 году. Мы больше не используем веб-сайты, потому что мы используем ASP.NET теперь MVC.
нам, конечно, не нужен балансировщик нагрузки и два сервера, чтобы сделать это, это нормально, если у вас есть 3 сервера для каждого веб-сайта, который вы поддерживаете, но это полный перебор для большинства веб-сайтов.
кроме того, мы не полагаемся на последний мастер от Microsoft - слишком медленно и слишком много скрытой магии, и слишком склонна к изменению своего названия.
вот как мы делаем это:
У нас есть шаг сборки post, который копирует сгенерированные DLL в папку "bin-pub".
мы используем Beyond Compare (что отлично**) для проверки и синхронизации измененных файлов (по FTP, потому что это широко поддерживается) до производственного сервера
У нас есть безопасный URL на веб-сайте, содержащий кнопку, которая копирует все в "bin-pub" в " bin " (сначала создается резервная копия, чтобы включить быстрый откат). На этом этапе приложение перезапускается. Затем наш ORM проверяет, есть ли какие-либо таблицы или столбцы, которые необходимо добавить, и создает их.
Это только простоя миллисекунд. Перезапуск приложения может занять секунду или две, но во время перезапуска запросы буферизуются, так что фактически нулевое время простоя.
весь процесс развертывания занимает от 5 секунд до 30 минуты, в зависимости от того, сколько файлов было изменено и сколько изменений нужно просмотреть.
таким образом, вам не нужно копировать весь сайт в другой каталог, а только папку bin. Вы также имеете полный контроль над процессом, и точно знаете, что меняется.
**мы всегда делаем быстрый глазок изменений, которые мы развертываем - в последнюю минуту двойная проверка, поэтому мы знаем, что тестировать, и если что-то сломается, мы готовы. Мы используем вне сравнения, потому что это позволяет легко diff файлы по FTP. Я бы никогда не сделал этого без BC, вы понятия не имеете, что вы переписываете.
*прокрутите вниз, чтобы увидеть его :( кстати, я бы больше не рекомендовал веб-сайты, потому что они медленнее строятся и могут плохо работать с наполовину скомпилированными временными файлами. Мы использовали их в прошлом, потому что они позволяли более гибкое развертывание файла за файлом. Очень быстро исправить незначительную проблему, и вы можете увидеть именно то, что вы развертываете (если использование вне сравнения, конечно - в противном случае забудьте он.)
единственные методы нулевого простоя, которые я могу придумать, включают хостинг по крайней мере на 2 серверах.
Я бы уточнил ответ Джорджа немного, следующим образом, для одного сервера:
- используйте проект веб-развертывания для предварительной компиляции сайта в одну DLL
- заархивируйте новый сайт и загрузите его на сервер
- распакуйте его в новую папку, расположенную в папке с правильными разрешениями для сайта, поэтому распакованные файлы наследуют разрешения правильно (возможно e:\web, с вложенными папками v20090901, v20090916 и т.д.)
- используйте диспетчер IIS для измените имя папки, содержащей сайт
- держите старую папку вокруг на некоторое время, так что вы можете вернуться к нему в случае возникновения проблем
Шаг 4 приведет к перезапуску рабочего процесса IIS.
Это только нулевое время простоя, если вы не используете сеансы InProc; вместо этого используйте режим SQL, если можете (еще лучше, полностью избегайте состояния сеанса).
конечно, это немного сложнее, когда есть несколько серверов и/или базы данных изменения....
чтобы расширить ответ sklivvz, который полагался на наличие какого-то балансировщика нагрузки (или просто резервной копии на том же сервере)
- направить весь трафик на сайт / сервер 2
- дополнительно подождите немного, чтобы убедиться, что как можно меньше пользователей имеют ожидающие рабочие процессы на развернутой версии
- разверните на сайт / сервер 1 и прогрейте его как можно больше
- выполнить миграцию базы данных транзакционно (стремитесь сделать это возможно)
- немедленно направить весь трафик на сайт / сервер 1
- развертывание на сайте / сервере 2
- прямой трафик на оба сайта/сервера
можно ввести немного тестирования дыма, создав снимок/копию базы данных, но это не всегда возможно.
Если это возможно и необходимо, используйте "различия в маршрутизации", например, другой URL-адрес клиента: s (customerX.myapp.net) или разные пользователи, чтобы развернуть в неизвестной группе Гвинеи сначала свиньи. Если ничего не выходит из строя, отпустите всех.
Так как миграция базы данных вовлечена, откат к предыдущей версии часто невозможен.
в этих сценариях есть способы сделать приложения более приятными, например, с помощью очередей событий и механизмов воспроизведения, но поскольку мы говорим о развертывании изменений в том, что используется, на самом деле нет способа доказательства дурака.
вот как я это делаю:
абсолютный минимум системных требований:
1 сервер с
- 1 балансировщик нагрузки / обратный прокси (например, nginx) работает на порту 80
- 2 АСП.Объем-основной/моно реверс-прокси или FastCGI, в окружении chroot-тюрьмы или докер-контейнеры слушать на 2 разных портов TCP
(или даже просто два обратных прокси-приложения на 2 разных TCP-портах без какой-либо песочницы)документооборот:
запустить транзакцию myupdate
try Web-Service: Tell all applications on all web-servers to go into primary read-only mode Application switch to primary read-only mode, and responds Web sockets begin notifying all clients Wait for all applications to respond wait (custom short interval) Web-Service: Tell all applications on all web-servers to go into secondary read-only mode Application switch to secondary read-only mode (data-entry fuse) Updatedb - secondary read-only mode (switches database to read-only) Web-Service: Create backup of database Web-Service: Restore backup to new database Web-Service: Update new database with new schema Deploy new application to apt-repository (for windows, you will have to write your own custom deployment web-service) ssh into every machine in array_of_new_webapps run apt-get update then either apt-get dist-upgrade OR apt-get install <packagename> OR apt-get install --only-upgrade <packagename> depending on what you need -- This deploys the new application to all new chroots (or servers/VMs) Test: Test new application under test.domain.xxx -- everything that fails should throw an exception here commit myupdate; Web-Service: Tell all applications to send web-socket request to reload the pages to all clients at time x (+/- random number) @client: notify of reload and that this causes loss of unsafed data, with option to abort @ time x: Switch load balancer from array_of_old_webapps to array_of_new_webapps Decomission/Recycle array_of_old_webapps, etc. catch rollback myupdate switch to read-write mode Web-Service: Tell all applications to send web-socket request to unblock read-only mode end try
Я бы предложил сохранить старые файлы там и просто перезаписать их. Таким образом, время простоя ограничено временем перезаписи одного файла, и одновременно отсутствует только один файл.
Не уверен, что это помогает в "веб-приложении", хотя (я думаю, вы говорите, что это то, что вы используете), поэтому мы всегда используем "веб-сайты". Кроме того, при развертывании" веб-сайтов " не перезапускается ваш сайт и не удаляются все пользовательские сеансы.
Comments