Развертывание веб-приложения PHP на нескольких экземплярах EC2 за Elastic Load Balancer

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

Пример:
Я запускаю веб-приложение, которое распределено по нескольким экземплярам AWS EC2 за AWS Elastic Load Balancer.

Цели:
а) При развертывании нового кода приложения (php) он должен автоматически распространяться на все экземпляры EC2.
б) При добавлении новых экземпляров EC2 они должны автоматически "загружаться" с последним кодом приложения.

Мои мысли до сих пор:
ad a)
phing (http://phing.info), вероятно, является ответом на эту часть. я бы, вероятно, добавил несколько целей для каждого экземпляра EC2, и при запуске развертывания он будет развернут на всех машинах. наверное к сожалению не параллельно. но это может быть даже полезно при написании сценария таким образом, что экземпляр EC2 «приостанавливается» в балансировщике нагрузки, обновляется, снова «возобновляется» и переходит к следующему экземпляру.

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

Буду рад увидеть ваши настройки для таких задач и услышать ваши советы и идеи для такой ситуации.

Спасибо,

Джошуа


person Joshua    schedule 15.02.2011    source источник


Ответы (4)


Это можно сделать с помощью phing. Однако я не уверен, почему вы хотите, чтобы новые экземпляры автоматически извлекали код приложения? Вы очень часто получаете дополнительный экземпляр? И чтобы a) развернуть код на несколько инстансов, ему все равно нужно их знать?

Для этой настройки требуется главный сервер развертывания и используется стратегия push. Главному серверу требуется phing, все необходимые пакеты phing и, возможно, ключи ssh для инстансов EC2.

Предложение а)

(Это всего лишь общие сведения о необходимых задачах проверки связи)

  • Получить список экземпляров (либо файл конфигурации, либо заданные параметры)
  • Экспорт кода приложения из репозитория на главный сервер (например, SubVersion)
  • Код приложения Tar
  • scp tarball во все экземпляры EC2 (в папку развертывания)
  • С помощью rsh распаковать архив на инстансах EC2
  • С помощью rsh обновите символическую ссылку на экземплярах EC2, чтобы папка веб-сервера указывала на новую папку развертывания.
  • Очистите все кеши на веб-сервере

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

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

Раньше я использовал подобные настройки, но не пробовал с такими сервисами, как EC2.

person Kåre Werner Storgaard    schedule 16.02.2011

а) Взгляните на Capistrano и, поскольку вы не используете Ruby (и RoR), используйте railsless-deploy. Capistrano может развертываться на нескольких серверах.

б) У меня не было никакого опыта в этом, но я не удивлюсь, если для Capistrano нет плагина/гема, который может сделать это за вас.

person Htbaa    schedule 15.02.2011
comment
Спасибо за ответ! Я уже проверил Капистрано. Что меня немного беспокоит, так это то, что он основан на Ruby, а у меня нет опыта работы с Ruby. Надеюсь, будут еще ответы, может быть, даже от людей, которые уже решали подобные задачи. Это может быть очень интересной темой для многих людей, использующих масштабируемые (или, надеюсь, масштабируемые) веб-приложения. - person Joshua; 15.02.2011
comment
Я понимаю, откуда вы :-). Однажды я задал аналогичный вопрос для инструмента развертывания на основе Lua или Perl, поскольку я не знал Ruby и был слишком ленив, чтобы его изучать. В конце концов я попробовал Capistrano и до сих пор им пользуюсь. Настройка может занять некоторое время, но это значительно упрощает развертывание. - person Htbaa; 15.02.2011

Я считаю, что phing - хороший инструмент для этого. Капистрано тоже может помочь.

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

person Muc    schedule 23.06.2012

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

Мы используем OpsCode Chef для управления инфраструктурой. У него есть цель deploy_revision, которая поддерживает репозитории SVN и Git, а также для развертывания кода приложения, а нож (основной инструмент командной строки Chef) имеет подключаемый модуль EC2, который позволяет вам с помощью одной команды запустить новый EC2. экземпляр с любыми ролями и средами, которые вы определили в Chef, и разверните код своего приложения.

Для управления этим с несколькими экземплярами EC2 за ELB мы использовали библиотеку Python boto для записи очень простые сценарии, которые подключаются к ELB, получают список всех экземпляров, подключенных к этому ELB, и один за другим удаляют экземпляр из ELB, запускают обновление Chef для этого экземпляра (которое развертывает новый код приложения и любую конфигурацию машины изменения), повторно прикрепляет экземпляр к ELB и переходит к следующему экземпляру.

person PatL    schedule 12.10.2012