我们在负载均衡器后面有 2 个实例,与乘客运行相同的 rails 应用程序。当我们部署时,服务器启动时间会导致请求超时。因此,我们有一个脚本,它通过从 LB 中取出一个 Web 服务器来单独更新每个 Web 服务器,使用 cap 进行部署,测试动态页面加载,然后将其放回 LB。
我们怎样才能让 capistrano 用一个命令为我们做这件事呢?我已经能够将其设置为同时部署到所有实例,但它们都同时重新启动并导致站点在 20 秒内不可用。
我在这里想念什么?似乎这应该是一种常见的模式。
我们在负载均衡器后面有 2 个实例,与乘客运行相同的 rails 应用程序。当我们部署时,服务器启动时间会导致请求超时。因此,我们有一个脚本,它通过从 LB 中取出一个 Web 服务器来单独更新每个 Web 服务器,使用 cap 进行部署,测试动态页面加载,然后将其放回 LB。
我们怎样才能让 capistrano 用一个命令为我们做这件事呢?我已经能够将其设置为同时部署到所有实例,但它们都同时重新启动并导致站点在 20 秒内不可用。
我在这里想念什么?似乎这应该是一种常见的模式。
在 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
.