我正在运行带有三个Web服务器和一个数据库服务器(AWS RDS服务器)的Rails应用程序。我与Chef Solo一起部署。目前我在rails_app配方中设置'migrate true',并且“rake db:migrate”在每个Web服务器上运行一次。
当迁移很短时,这通常不是问题。 (第一个成功,第二个和第三个被跳过,因为schema_migrations表列出了最新的模式版本。)但是当迁移需要很长时间时,第二个和第三个Web服务器会在第一个和第三个Web服务器完成迁移之前尝试迁移。他们失败,厨师退出失败。请注意,迁移已成功(至少在我尝试过时),但新版本的整体部署失败。 (如果我再次运行它,一切都会成功,因为已经运行了迁移。)
我的问题是,确保迁移只运行一次的最佳/规范方法是什么?
答案 0 :(得分:0)
可以检查db / migrate.rb文件的内容是否已更改。如果是,则有条件地调用migrate true。如果您使用的是git,可以查看
执行“git diff HEAD @ {1} HEAD db / migrate”
如果存在任何更改,请使用migrate true。
答案 1 :(得分:0)
我将使用节点属性代替所有运行迁移的节点,因此只有一个融合运行迁移。
在'rails_app'配方中,您的migrate
属性将是;
migrate node['rails']['migrate']
然后在你的节点属性json文件中找到你要做的一个节点;
"rails" : { "migrate" : true }
和其他两个
"rails" : { "migrate" : false }
显然可以根据需要更改属性的路径/名称。
答案 2 :(得分:0)
我会为你的三个网络服务器中的一个做一个领导角色,并且只对该角色运行db:migrate。
另一个选择是将代码部署到dbserver,然后在那里运行db:migrate。