假设我有一个运行基于加载和时间的扩展的OpsWorks Rails应用程序。
如果我在运行多个应用程序服务器的情况下部署代码,在应用程序服务器上执行多个rake db:migrate
,会发生什么?
Rails有没有防范这个?或者我是否需要指定一个负责运行迁移的服务器?
我也很想知道AWS上Rails + RDS(Postgresql)的迁移策略。
答案 0 :(得分:1)
答案是是的,Rails防范了这种情况
首先,RDS本身可以缓存您的查询。例如,您的两个实例同时运行一个CREATE INDEX
查询,RDS本身就可以处理它。
其次,Rails自动创建一个名为schema_migrations
的表。当您的某个实例运行db:migrate
时,表schema_migrations
可以帮助其他实例知道数据库已经迁移(就像版本管理系统一样)
但是,在db/migrate/***.rb
文件中编写了一些自定义查询有一种不好的做法,那么RDS可能无法正确处理您的查询。
如果您必须执行自定义域更新数据之类的操作,则应编写rake任务并手动执行。
因此,如果您只使用db:migrate
来更新数据结构,那么已经为您处理了所有内容,即使您有数百个实例。
有关详细信息,请参阅Rails's document