5

我们在负载均衡器后面有 2 个实例,与乘客运行相同的 rails 应用程序。当我们部署时,服务器启动时间会导致请求超时。因此,我们有一个脚本,它通过从 LB 中取出一个 Web 服务器来单独更新每个 Web 服务器,使用 cap 进行部署,测试动态页面加载,然后将其放回 LB。

我们怎样才能让 capistrano 用一个命令为我们做这件事呢?我已经能够将其设置为同时部署到所有实例,但它们都同时重新启动并导致站点在 20 秒内不可用。

我在这里想念什么?似乎这应该是一种常见的模式。

4

1 回答 1

2

在 capistrano 中序列化部署实际上并不是那么简单,它喜欢在服务器之间并行化其所有操作。重申一下这个问题,您似乎有几台服务器,并且希望按顺序使每台服务器脱机以更新部署。

deploy:create_symlink诀窍是在部署配置中覆盖任务:

def perform_task_offline options
  sudo "take_this_server_offline", options
  yield
  sudo "put_this_server_online", options
end

def create_symlink_task options
  # does what your existing deploy:create_symlink did, something like:
  run "rm -f /web/current && ln -s #{release_path} /web/current", options
end

namespace :deploy do

  task :create_symlink, {once: true, except: {no_release: true}} do
    deployed_servers = Array.new

    roles[:app].servers.each do |current_server|
      options = {hosts: current_server}
      deployed_servers.push current_server
      perform_task_offline(options) { create_symlink_task options }
    end
  end
end

在这种情况下perform_task_offline,包括在指定的服务器上执行的命令,这些命令options将其从负载均衡器中删除,而它yield是块create_symlink_task,包括 创建部署符号链接。

然后您应该能够运行标准cap命令进行部署,您会看到服务器依次离线,创建“当前”符号链接,然后重新启动。

请注意,上面的代码跟踪已成功部署到的服务器deployed_servers。如果您希望能够仅在先前已部署到的服务器上回滚活动失败的部署(即,失败发生on_rollback do部署本身),您将需要在块内进行类似的循环,但仅在deployed_servers.

于 2016-02-10T01:53:21.173 回答