Rails 横向扩展应用的迁移策略

Rails migration strategies on horizontally scaled apps

假设我有一个 OpsWorks Rails 应用程序 运行 基于负载和时间的扩展。

如果我在有多个应用程序服务器 运行 的地方部署代码,其中多个 rake db:migrate 跨应用程序服务器执行,会发生什么情况?

Rails有什么防范措施吗?或者我是否特别需要指定负责 运行 迁移的单个服务器?

我也很想知道 Rails + RDS (Postgresql) 在 AWS 上的迁移策略。

答案是是的,Rails对这种情况有所防范

首先,RDS 本身可以缓存您的查询。因此,例如,您的 2 个实例 运行 一个 CREATE INDEX 同时查询,RDS 本身可以处理。

其次,Rails自动创建一个名为schema_migrations的table。当你的一个实例 运行 db:migrate 时, table schema_migrations 可以帮助其他实例知道数据库已经向上迁移(就像版本管理系统一样)

但是,如果您在 db/migrate/***.rb 文件中编写了一些自定义查询,那么 RDS 可能无法正确处理您的查询。

如果您必须执行自定义域更新数据之类的操作,您应该编写一个 rake 任务并手动执行它。

所以,如果您只使用 db:migrate 来更新数据结构,那么一切都已经为您处理了,即使您有数百个实例。

更多信息请参考Rails's document