Обновление веб-приложения без простоя

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

31 голос | спросил gAMBOOKa 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 08 Sep 2009 23:54:02 +0400 2009, 23:54:02

5 ответов


43

Что мы обычно делаем, на работе:

  • Перед обновлением корневой каталог сервера:
    • в /www /app-2009-09-01
    • , но доступен через символическую ссылку, называемую /www /application
  • мы помещаем всю новую базу кода в /www /app-2009-09-08
  • как только вся база кода находится:
    • мы удаляем старую символическую ссылку
    • мы создаем новую символическую ссылку, которая все еще называется /www /application , но которая указывает на новые источники: /www /app-2009-09-08
  • мы перезагружаем apache, чтобы заставить эту модификацию принять во внимание.

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

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


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

Конечно, это не мешает вам тестировать новую версию на промежуточном сервере, прежде чем ставить ее на производство, но, кто знает ... Иногда возникает очень большая ошибка, которой никто не смог видеть во время тестирования :-(
Например, поскольку на промежуточной машине не выполняется проверка нагрузки, выполняемая на регулярной основе.
(Я видел, что «откат» использовал что-то вроде 4 или 5 раз в 3 года - каждый раз он сохранял день - и веб-сайты ^^)


Вот какой-то быстрый пример: предположим, что у меня есть этот VirtualHost в моей конфигурации Apache:

  <VirtualHost *>
        ServerName example.com
        DocumentRoot /www /application
        <Directory /www /application>
            # Все, что вам может понадобиться здесь (этот пример скопирован с тестового сервера и тестового приложения ^^)
            Параметры индексов FollowSymLinks MultiViews + SymLinksIfOwnerMatch
            AllowOverride All
            php_value error_reporting 6135
            php_value short_open_tag on
        & Lt; /Справочник & GT;
& Lt; /VirtualHost & GT;
 

Довольно «стандартный» ... Единственное, что /www /application не является реальным каталогом: это просто символическая ссылка на текущую версию источников.
Что означает, что когда вы поставили источники на сервер, но еще не переключились, у вас будет что-то вроде этого:

  корень @ акула: /WWW
# 11
всего 8
drwxr-xr-x 2 root root 4096 2009-09-08 22:07 app-2009-09-01
drwxr-xr-x 2 root root 4096 2009-09-08 22:07 app-2009-09-08
lrwxrwxrwx 1 root root 19 2009-09-08 22:08 application -> /WWW /приложение-2009-09-01
 

Обратите внимание, что symlinc указывает на «старую версию»

Теперь, когда новая версия полностью загружена на сервер, давайте переключимся:

  корень @ акула: /WWW
# rm /www /application
корень @ акула: /WWW
# ln -s /www /app-2009-09-08 /www /application
 

И теперь /www /application указывает на новую версию источников:

  корень @ акула: /WWW
# 11
всего 8
drwxr-xr-x 2 root root 4096 2009-09-08 22:07 app-2009-09-01
drwxr-xr-x 2 root root 4096 2009-09-08 22:07 app-2009-09-08
lrwxrwxrwx 1 root root 19 2009-09-08 22:09 application -> /WWW /приложение-2009-09-08
 

И нам просто нужно перезапустить Apache:

  корень @ акула: /WWW
# /etc/init.d/apache2 перезапуск
 * Перезапуск веб-сервера apache2
 

Три шага « удалить ссылку, создать новую ссылку, перезапустить apache » нужно сделать быстро; т.е. автоматическим сценарием, а не человеком.

Используя это решение:

  • вы можете взять столько времени, сколько потребуется для загрузки новой версии источников: apache не будет использовать их, пока символ не был изменен.
  • , когда все в порядке, просто переключите символическую ссылку: она будет работать быстрее, чем изменение даже 1 или 2 файлов ... Это означает, что практически нет простоев: -)

И если использовать некоторый кеш-код операции, такой как APC с опцией stat в 0, это может означать еще меньший риск простоя, я полагаю.


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


Надеюсь, что это более понятно: -)

ответил Pascal MARTIN 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 08 Sep 2009 23:59:14 +0400 2009, 23:59:14
2

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

ответил 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 08 Sep 2009 23:58:31 +0400 2009, 23:58:31
1

Настройте второй сервер с обновленной кодовой базой и переключите их как можно быстрее. : -)

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

ответил Wim ten Brink 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 00:00:11 +0400 2009, 00:00:11
1

Во-первых, я часто использую и люблю метод, похожий на ответ Паскаля МАРТИНА.

Другим методом, который мне также нравится, является использование моего SCM для ввода нового кода. Точный процесс зависит от вашего типа SCM (git vs svn vs ...). Если вы используете svn, мне нравится создавать ветку «онлайн» или «производство», которую я проверяю в качестве корня документа на сервере. Затем, когда я хочу нажать новый код из другого ветки /тега /соединительной линии, я просто передаю новый код в ветку «онлайн» и запустим обновление svn в корневом каталоге документа. Это позволяет очень легко откатываться, так как есть полный журнал изменений того, что было вверх /вниз на сервере, и кто это сделал и когда. Вы также можете легко запустить эту «онлайн-ветвь» на тестовом поле, что позволит вам проверить приложение, которое вы собираетесь нажать.

Процесс похож на git и другие стили SCM, только что измененные, чтобы быть более естественными для их стиля работы.

Хотите вывести /опросить, а не нажимать обновления? Просто выполняйте задание cron или другое, более умный механизм автоматически запускает обновление svn.

Дополнительно: Вы также можете использовать этот процесс для резервного копирования файлов, которые ваше приложение записало на диск. Просто выполняйте задание cron или какой-либо другой механизм, выполняющий svn commit. Теперь файлы, созданные вашим приложением, резервируются в вашем SCM, журнал изменений и т. Д. (Например, если пользователь обновляет файл на диске, но хочет, чтобы вы его вернули, просто нажмите старую ревизию).

ответил 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 02:00:11 +0400 2009, 02:00:11
0

Я использую аналогичный подход и к Pascal MARTIN. Но вместо того, чтобы загружать несколько версий моего приложения на рабочий сервер, я сохраняю «сборки» за моим брандмауэром, каждый в отдельном каталоге с номером сборки и датой. Когда я хочу загрузить новую версию, я использую простой скрипт, который включает в себя «rsync -avh -delay-updates». Флаг «delay = updates» будет загружать все (то есть другое) во временную папку до тех пор, пока не появятся все обновления, а затем переместит все по очереди в конце передачи в соответствующие пути, чтобы приложение никогда не было в полу-старое-полу-новое состояние. Он имеет тот же эффект, что и метод выше, за исключением того, что я сохраняю только одну версию приложения на производственном сайте (лучше всего иметь только голые существенные файлы на рабочем сервере, IMO).

ответил 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 10:58:20 +0400 2009, 10:58:20

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132