За свою жизнь я не могу понять, как правильно сделать эту работу.
Проблема похожа на то, что есть у других, например: Как сделать повторный запусккластер шавок
Однако мы используем Nginx / Passenger вместо Mongrel.
Проблема заключается в том, что при развертывании мы используем этот стандарт: задача рестарта:
task :restart, :roles => [:app], :except => {:no_release => true} do
run "cd #{deploy_to}/current && touch tmp/restart.txt"
end
Он затрагивает файл restart.txt на каждом веб-сервере, но все экземпляры пассажиров, которые в данный момент обслуживают запросы, должны завершиться до появления новых.Это создает серьезную задержку и приводит к тому, что наше приложение будет недоступно до 2 минут, пока все возвращается в исходное состояние.
Чтобы обойти это, план должен сделать следующее:
- код развертывания
- перейдите на сервер 1, удалите его из балансировщика нагрузки
- перезапустите nginx-passenger на сервере 1
- подождите 60 секунд
- добавьте сервер 1 обратно к балансировщику нагрузки
- перейдите на сервер 2 (повторите шаги 3 - 5)
Чтобы выполнить это, я попытался сделать следующее:
(фунт.txt - это файл, который ищет балансировщик нагрузки)
task :restart, :roles => [:app], :except => {:no_release => true} do
servers = find_servers_for_task(current_task)
servers.map do |s|
run "cd #{deploy_to}/current && echo '' > public/lb.txt", :host => s.host
run %Q{rvmsudo /etc/init.d/nginx-passenger restart > /dev/null}, :host => s.host
sleep 60
run "cd #{deploy_to}/current && echo 'ok' > public/lb.txt", :host => s.host
end
end
Этот почти работает, однако во время развертывания он, казалось, запускал цикл через серверы один раз для серверов, перечисленных в: роль приложения.В настоящее время у нас есть 6 серверов приложений, поэтому цикл запускается 6 раз, перезапуская nginx-passenger 6 раз на сервер.
Мне просто нужен этот цикл для запуска один раз.
Я знаю, что это кажетсячто в конечном итоге пассажир получит повторный перезапуск, но, похоже, он еще не существует.
Если это поможет, мы используем Capistrano 2.x и Rails 3
Любая помощь будет отличной.
Спасибо.