2013-04-22 48 views
5

我使用三台Web服务器和一台数据库服务器(AWS RDS服务器)运行Rails应用程序。我和Chef Solo一起部署。目前我在我的rails_app配方中设置了“migrate true”,并且“rake db:migrate”在每台Web服务器上运行一次。随着厨师,我如何只运行一次Rails迁移?

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

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

+0

您可以收听播客:http://foodfightshow.org/2013/01/application-deployment.html – StephenKing 2013-04-23 10:10:43

回答

0

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

执行 “git的差异HEAD @ {1} HEAD DB /迁移”

如有变化存在,那么使用迁移如此。

+0

这是不太不幸的问题.. – 2014-01-25 07:32:52

0

而不是所有运行迁移的节点,我会使用节点属性,以便只有一个收敛运行迁移。

在“rails_app”食谱你migrate财产会;

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

然后在你的节点属性json文件中为你想要做的一个节点;

"rails" : { "migrate" : true } 

和其他两个

"rails" : { "migrate" : false } 

,您看合适明显改变属性的路径/名称。

0

我将为您的三个Web服务器之一创建一个领导角色,并且只对该角色运行db:migrate。

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

相关问题