我正在使用Capistrano来管理在多个负载平衡服务器上运行的Java Web应用程序.某些任务(例如配置更改)需要重新启动服务器或应用程序重新部署,在此期间服务器将无响应.
如果Capistrano可以连续地在服务器上执行这些任务,而不是同时执行,那么服务器场中只有一台机器一次会停机,负载均衡器将确保没有请求丢失.但是,据我所知,Capistrano只能同时在服务器上执行操作.
要清楚,我不是要连续执行不同的任务.我正在尝试连续在不同的服务器上执行相同的任务.
在我的配置中,我可以想到一些黑客入侵的方法,但似乎应该有一个我可以在某处设置的标志.
有人知道怎么做吗?
我使用它来串行重启我的服务器,而不是并行:
task :my_task, :roles => :web do find_servers_for_task(current_task).each do |server| run "[task command here]", :hosts => server.host end end
您可以设置:max_hosts
任务以限制其并行度:
:max_hosts
- 指定一次应选择的最大主机数.如果此值小于选择运行的主机数,则主机将以max_hosts组的形式运行.默认值为nil,表示没有最大主机限制.请注意,这并不限制可以打开的SSH通道数,只限制将要调用它的主机数.
例:
desc "Say hello, one at a time" task :hello, :roles => :app, :max_hosts => 1 do run "echo serial hello ; sleep 0 ; echo serial hello DONE" # Note that task parameters do NOT get automatically passed on to # other tasks, i.e. a call to "deploy:restart" would be # unaffected by :max_hosts set here. Example: self.send(:normal_hello) end desc "Say hello, everybody" task :normal_hello, :roles => :app do run "echo 'normal (parallel) hello' ; sleep 10 ; echo normal hello DONE" end