Я думал об этом методе обновления файлов сервера без простоя:
Есть ли недостатки в этом? Есть ли способ лучше?
Могут ли быть какие-либо ошибки состояния гонки, когда к файлу обращаются в момент момента перезапуска?
Нет единого способа, который всегда будет работать - даже если вы подготовите и развернете новый сервер, а затем измените балансировщик нагрузки, чтобы указать на новую машину. Кто-то мог просто запросить страницу с исходного сервера, а затем извлечь части страницы из новой копии сайта на новом компьютере. На практике это вряд ли вызовет большую проблему.
На более крупных объектах, со сложными потребностями, все будет сложнее и дорого. Большинство сайтов имеют более простые требования. Даже миграция базы данных может быть запланирована на минимальные сбои - но также будет сложной и должна быть проработана с запланированным временем простоя.
Поскольку переключение между копиями сайта на одном и том же компьютере (или небольшом числе машин) легко (эффективно перемещая Apache или Nginx DocumentRoot
) технику, которая легко доступна (и не требует нескольких машин и балансировки нагрузки для достижения ):
composer install
или извлечение/подготовка объекта по мере необходимостиНа практике это то, что делает Capistrano (и другие подобные инструменты). Базовый каталог выложен следующим образом:
base-directory
releases
20151010-0925/
vendor/ (composer-installed files)
web/index.php
20151120-1007/
vendor/ (composer-installed files)
web/index.php
current (symlink to ../releases/20151010-0925/)
shared/ (files shared between releases)
При развертывании новой версии веб-сайта - создайте новую полностью сформированную версию, а затем, когда она будет завершена, измените "текущую" символическую ссылку.
Корень документа Apache в этом экземпляре будет указывать на .../base/current/web/
через символическую ссылку на базу веб-сайта.
Если в любой момент развертывание не будет готово, вы можете просто прервать его и, возможно, удалить выпущенную версию, которую вы пытались развернуть, а не изменять символическую ссылку.
Я использовал эту технику из тривиальных, одностраничных, HTML/CSS-сайтов в трехкомпонентные кластеры, на которых работают тысячи одновременных пользователей.
Лучшим решением было бы установить балансировщик нагрузки для высокой доступности (например, HAProxy) вашего сервера.
В противном случае у вас всегда будет простой. Подумайте о следующих случаях: сброс apache, обновление базы данных, обновление активов, непредвиденные ошибки во время обновления и т.д.