【发布时间】:2011-09-30 13:44:19
【问题描述】:
在我的一生中,我无法弄清楚如何使它正常工作。
问题和其他人类似,如:How to do a rolling restart of a cluster of mongrels
然而,我们正在使用 Nginx/Passenger 而不是 Mongrel。
问题在于,如果我们使用此标准进行部署:重新启动任务:
task :restart, :roles => [:app], :except => {:no_release => true} do
run "cd #{deploy_to}/current && touch tmp/restart.txt"
end
它涉及每个 Web 服务器上的 restart.txt 文件,但当前服务请求的任何乘客实例都需要在新的请求生成之前完成。这会造成严重的延迟,并导致我们的应用在一切恢复正常时最多有 2 分钟不可用。
为了解决这个问题,计划执行以下操作:
- 部署代码
- 转到服务器 1,将其从负载平衡器中删除
- 在服务器 1 上重新启动 nginx-passenger
- 等待 60 秒
- 将服务器 1 添加回负载平衡器
- 转到服务器 2(重复步骤 3 - 5)
为了做到这一点,我尝试了这个:
(lb.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
这几乎可以工作,但是,在部署过程中,它似乎在 :app 角色中列出的每个服务器上运行一次循环。我们目前有 6 台应用服务器,因此循环运行 6 次,每台服务器重启 nginx-passenger 6 次。
我只需要这个循环运行一次。
我知道乘客似乎最终会得到滚动重启,但它们似乎还不存在。
如果有帮助,我们正在使用 Capistrano 2.x 和 Rails 3
任何帮助都会很棒。
谢谢。
【问题讨论】:
-
我发现了一些额外的东西,可能有帮助也可能没有帮助......如果循环中没有“运行”行,那么每个任务只执行一次,这意味着它可以满足我的要求的循环。但是,添加“运行”行的那一刻,它会在角色中的每个服务器重复一次,所以回到 6 次而不是 1 次。
标签: ruby-on-rails deployment nginx passenger capistrano