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
假设我有一个 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