使用Chef,如何仅运行一次Rails迁移?

5
我正在运行一个Rails应用程序,有三个Web服务器和一个数据库服务器(AWS RDS服务器)。我使用Chef Solo进行部署。目前,我在我的rails_app recipe中设置“migrate true”,并且“rake db:migrate”在每个Web服务器上运行一次。
当迁移很短时,这通常不是问题。(第一个成功,第二个和第三个被跳过,因为schema_migrations表列出了最新的模式版本。)但是当迁移需要很长时间时,第二个和第三个Web服务器会在第一个完成之前尝试进行迁移。它们失败并导致Chef退出失败。请注意,迁移已成功(至少在我尝试过的情况下),但新版本的整体部署失败。(如果我再次运行它,一切都会成功,因为迁移已经运行。)
我的问题是,确保迁移仅运行一次的最佳/规范方法是什么?

你可以收听这个播客:http://foodfightshow.org/2013/01/application-deployment.html - StephenKing
3个回答

0

不要让所有节点都运行迁移,我会使用节点属性,这样只有一个收敛运行迁移。

在“rails_app”配方中,您的migrate属性将是;

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

然后在您的节点属性 JSON 文件中,为您想要执行它的一个节点;

"rails" : { "migrate" : true }

而对于另外两个

"rails" : { "migrate" : false }

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


0
也许你可以检查一下 db/migrate.rb 文件的内容是否有变化。如果有变化,那么有条件地调用 migrate true。如果你正在使用 git,你可以检查执行 "git diff HEAD@{1} HEAD db/migrate",如果存在任何更改,那么就使用 migrate true。

0
我会为你的三个Web服务器之一设立一个领导角色,并只在该角色上运行db:migrate。
另一个选择是将代码部署到db服务器上,直接在那里运行db:migrate。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接