5

我正在运行一个带有三个 Web 服务器和一个数据库服务器(一个 AWS RDS 服务器)的 Rails 应用程序。我与 Chef Solo 一起部署。目前,我在 rails_app 配方中设置了“migrate true”,并且“rake db:migrate”在每个 Web 服务器上运行一次。

当迁移时间很短时,这通常不是问题。(第一个成功,第二个和第三个被跳过,因为 schema_migrations 表列出了最新的模式版本。)但是当迁移需要很长时间时,第二个和第三个 Web 服务器会在第一个完成之前尝试进行迁移. 他们失败了,厨师也没有成功退出。请注意,迁移已经成功(至少在我尝试过的时候),但是新版本的整体部署失败了。(如果我再次运行它,一切都会成功,因为迁移已经运行。)

我的问题是,确保迁移只运行一次的最佳/规范方法是什么?

4

3 回答 3

0

可能您可以检查 db/migrate.rb 文件的内容是否已更改。如果是,则有条件地调用 migrate true。如果你使用 git,你可以检查

执行“git diff HEAD@{1} HEAD db/migrate”

如果存在任何更改,则使用 migrate true。

于 2013-04-23T05:42:05.323 回答
0

我将为您的三个网络服务器之一担任领导角色,并且仅在该角色上运行 db:migrate。

另一种选择是将您的代码也部署到 dbserver,并在此处运行 db:migrate。

于 2016-07-21T16:19:13.050 回答
0

我将使用节点属性,而不是所有节点都运行迁移,这样只有一个会聚运行迁移。

在“rails_app”配方中,您的migrate财产将是;

migrate node['rails']['migrate']

然后在您想要执行的一个节点的节点属性 json 文件中;

"rails" : { "migrate" : true }

对于另外两个

"rails" : { "migrate" : false }

显然,您可以根据需要更改属性的路径/名称。

于 2016-05-04T16:05:12.390 回答