【发布时间】:2015-03-14 04:53:27
【问题描述】:
我目前正在第一次学习如何使用 Capistrano 部署 Rails 应用程序。我看到 capistrano/rails 的默认流程包括在“发布”新符号链接之前在主机上运行 db:migrate。但是,当同时在多个 Web 节点上运行部署时,我会遇到一些时间问题。
- 如果您在旧版本的应用程序仍在运行时迁移数据库,则旧代码会与更改的数据库通信,这可能会导致未定义的行为。
- 如果您在运行迁移之前关闭应用,但每个节点上的部署速度不同,则一个节点可能仍在运行旧应用,而另一个节点已经在运行迁移。
- 如果两个节点同时调用 db:migrate,您会不会因为它们都认为新的迁移尚未运行(通过查阅表格)而陷入竞争状态,然后两者都尝试同时运行迁移?
在我看来,唯一合理的解决方案是尝试将默认流程重新设计为以下三个阶段:
- 每个节点上的正常部署流程直到但不包括 db:migrate 任务——所以现在安装了新版本,运行了捆绑程序,编译了资产,建立了链接,一切准备就绪(但尚未通过当前符号链接发布)。最后的附加步骤:停止旧应用。
- 在所有主机完成第 1 阶段后,然后仅在一个节点上运行 db:migrate(可能是随机选择的,或者只是列表中的第一个)。
- 完成后,在所有主机上恢复正常流程的后半部分,并在 deploy:published 任务之后添加一个用于再次启动应用程序的任务。
我现在对自己的推理有点缺乏信心,因为虽然我搜索了文档并在谷歌上搜索了帖子,但我还没有真正看到任何人谈论这些多节点问题,即使我不得不假设它影响了几乎所有人......
【问题讨论】:
标签: ruby-on-rails deployment capistrano database-migration rails-migrations