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



для развертывания новой версии нашего сайта мы делаем следующее:




  1. застегните новый код и загрузите его на сервер.

  2. на сервере live удалите весь код live из каталога веб-сайта IIS.

  3. распакуйте zip-файл новый код в пустой каталог IIS


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



любые предложения по 0-секундному методу простоя?

639   11  

11 ответов:

вам нужно 2 сервера и балансировщик нагрузки. Вот в шагах:

  1. включить весь трафик на сервере 2
  2. развертывание на сервере 1
  3. Тестовый Сервер 1
  4. включить весь трафик на сервере 1
  5. развертывание на сервере 2
  6. Тестовый Сервер 2
  7. включить трафик на обоих серверах

дело в том, что даже в этом случае у вас все равно будут перезапуски приложений и потеря сеансов, если вы используете "липкие сеансы". Если у вас есть сеансы базы данных или сервера, то все должно быть нормально.

The Microsoft Web Deployment Tool поддерживает это в некоторой степени:

Включает Транзакционный Файл Windows Поддержка системы (TxF). Когда как txf поддержку включено, файловые операции являются атомные; то есть они либо преуспевают или полностью провалиться. Это обеспечивает данные целостность и предотвращает данные или файлы из существующих на "полпути" или коррумпированное государство. В MS Deploy TxF-это отключено по умолчанию.

похоже, что транзакция для всей синхронизации. Кроме того, TxF является функцией Windows Server 2008, поэтому эта функция транзакции не будет работать с более ранними версиями.

Я считаю, что можно изменить сценарий для 0-простоя, используя папки в качестве версий и метабазы IIS:

  • для существующего пути / url:
  • скопировать новый (или изменено) сайт на сервер под
    • \веб\приложения\В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 - слишком медленно и слишком много скрытой магии, и слишком склонна к изменению своего названия.

вот как мы делаем это:

  1. У нас есть шаг сборки post, который копирует сгенерированные DLL в папку "bin-pub".

  2. мы используем Beyond Compare (что отлично**) для проверки и синхронизации измененных файлов (по FTP, потому что это широко поддерживается) до производственного сервера

  3. У нас есть безопасный URL на веб-сайте, содержащий кнопку, которая копирует все в "bin-pub" в " bin " (сначала создается резервная копия, чтобы включить быстрый откат). На этом этапе приложение перезапускается. Затем наш ORM проверяет, есть ли какие-либо таблицы или столбцы, которые необходимо добавить, и создает их.

Это только простоя миллисекунд. Перезапуск приложения может занять секунду или две, но во время перезапуска запросы буферизуются, так что фактически нулевое время простоя.

весь процесс развертывания занимает от 5 секунд до 30 минуты, в зависимости от того, сколько файлов было изменено и сколько изменений нужно просмотреть.

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

**мы всегда делаем быстрый глазок изменений, которые мы развертываем - в последнюю минуту двойная проверка, поэтому мы знаем, что тестировать, и если что-то сломается, мы готовы. Мы используем вне сравнения, потому что это позволяет легко diff файлы по FTP. Я бы никогда не сделал этого без BC, вы понятия не имеете, что вы переписываете.

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

единственные методы нулевого простоя, которые я могу придумать, включают хостинг по крайней мере на 2 серверах.

Я бы уточнил ответ Джорджа немного, следующим образом, для одного сервера:

  1. используйте проект веб-развертывания для предварительной компиляции сайта в одну DLL
  2. заархивируйте новый сайт и загрузите его на сервер
  3. распакуйте его в новую папку, расположенную в папке с правильными разрешениями для сайта, поэтому распакованные файлы наследуют разрешения правильно (возможно e:\web, с вложенными папками v20090901, v20090916 и т.д.)
  4. используйте диспетчер IIS для измените имя папки, содержащей сайт
  5. держите старую папку вокруг на некоторое время, так что вы можете вернуться к нему в случае возникновения проблем

Шаг 4 приведет к перезапуску рабочего процесса IIS.

Это только нулевое время простоя, если вы не используете сеансы InProc; вместо этого используйте режим SQL, если можете (еще лучше, полностью избегайте состояния сеанса).

конечно, это немного сложнее, когда есть несколько серверов и/или базы данных изменения....

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

  1. направить весь трафик на сайт / сервер 2
  2. дополнительно подождите немного, чтобы убедиться, что как можно меньше пользователей имеют ожидающие рабочие процессы на развернутой версии
  3. разверните на сайт / сервер 1 и прогрейте его как можно больше
  4. выполнить миграцию базы данных транзакционно (стремитесь сделать это возможно)
  5. немедленно направить весь трафик на сайт / сервер 1
  6. развертывание на сайте / сервере 2
  7. прямой трафик на оба сайта/сервера

можно ввести немного тестирования дыма, создав снимок/копию базы данных, но это не всегда возможно.

Если это возможно и необходимо, используйте "различия в маршрутизации", например, другой 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

    Ничего не найдено.