【问题标题】:Partitioning Heroku Production Database -- Possible?对 Heroku 生产数据库进行分区——可能吗?
【发布时间】:2013-08-22 23:38:12
【问题描述】:

我正在考虑为生产数据库支付 50 美元/月,这样我就可以将 PostGIS 与我的 rails 4 应用程序一起使用。我的问题是我想继续使用“暂存”环境进行开发,但还不能证明为两个生产数据库付费是合理的。 Staging 显然只是生产环境的克隆,因此仅将两个应用程序指向同一个 DB url (post) 可能会导致一些重大问题。

有没有办法对数据库进行分区,或者您推荐的其他策略?

heroku 支持的初步回答是否定的,但我希望有一个草率的解决方法。

谢谢!

【问题讨论】:

  • 乍一看,我认为您可以使用 Postgres 模式来实现这一点,尽管它可能会很混乱。我将在几分钟内整理出一个示例。如果您有 Railscasts Pro,请查看#389 Multitenancy with PostgreSQL
  • 太棒了。我应该把它录在我的显示器上,“总是检查 Railscast”

标签: ruby-on-rails heroku postgis heroku-postgres


【解决方案1】:

Heroku Schemas 是另一种解决方法;它是一个 Heroku 插件,基本上可以让您运行一个命令来应用 Benjamin Manns 的多模式解决方案。

【讨论】:

  • 非常酷!我最终使用了 Benjamin 的解决方案,但这听起来更容易
【解决方案2】:

首先,我强烈建议您每月支付额外的 50 美元。为此,您会得到各种很酷的东西,例如forkingpipelines,以及这有点骇人听闻的事实。老实说,当您清除暂存数据库时,我真的不知道这是否最终会擦除您的生产数据。请在尝试之前进行备份。

我将此答案视为对技术挑战而非业务决策的回答。废话不多说,

使用 Heroku Postgres 模式在同一个数据库上设置多个环境

首先,我删除了现有的开发数据库并将生产数据库添加到我的生产应用程序中。

heroku addons:add heroku-postgresql:crane

> Adding heroku-postgresql:crane on test-shared-app... done, v# ($50/mo)
> Attached as HEROKU_POSTGRESQL_RED_URL

这在RED 颜色下附加了一个数据库,因此请将HEROKU_POSTGRESQL_RED_URL 替换为适合您应用的颜色。

这会将数据库附加到生产应用程序,但我们需要连接到同一个应用程序以进行暂存。首先,创建暂存模式

heroku run "bundle exec rails runner 'ActiveRecord::Base.connection.execute(%q{CREATE SCHEMA staging})'"

接下来,创建临时应用程序。请参阅Managing Multiple Environments for an App 了解更多信息。

heroku create --remote staging test-shared-app-staging
heroku config:set RACK_ENV=staging RAILS_ENV=staging --remote staging

然后,从现有应用中复制环境数据。 在网址末尾添加?schema_search_path=staging

heroku config --remote heroku --shell
# make note of your database URLs
heroku config:set --remote staging \
  DATABASE_URL=postgres://...?schema_search_path=staging \
  HEROKU_POSTGRESQL_RED_URL=postgres://...?schema_search_path=staging

然后推送到登台

git push staging master

现在,在 staging 上运行迁移

heroku run --remote staging bundle exec rake db:migrate

然后尝试一下。

我的“应用程序”在http://test-shared-app.herokuapp.com/postshttp://test-shared-app-staging.herokuapp.com/posts 运行。你可以在https://github.com/benmanns/heroku-shared-app查看源代码。

【讨论】:

  • 同意,在这种情况下,最大限度地“精益”可能没有意义。不过,我会试一试,感谢您快速而彻底的回答。
  • 对此进行跟进:除了默认的“公共”之外,您还希望在“模式”(不幸的是,这就是 Postgres 命名空间的名称)下对生产表进行“命名空间”。然后有一个 rake 任务,它只重置你的暂存命名空间表。 Here's an article 在架构上,可能是较新的架构,但这帮助我解决了问题。
【解决方案3】:

如果我是你,我会在适当的时候使用生产数据库(开始赚钱或获得更多用户等)。我会复制生产数据库中的所有表,并通过在前面加上“stag_{original_table_name}”之类的内容来为新表命名。因此,您将拥有两组不同的相同表。在您的模型中,让它们使用新表暂存环境:

class Foo < ActiveRecord::Base
  self.table_name = "staging_#{self.class.name}" if Rails.env.staging?

我很便宜...在真正的 Rails 大师眼中,这可能是一个丑陋的解决方案。

【讨论】:

  • 不错!正是我正在寻找的那种解决方案。我想我必须对迁移做类似的事情——我想知道是否有类似的方法来保持干燥?
  • 我将创建一个 rake 任务,该任务将遍历您的模型并为您创建表格。如果我是你,我不会在这里使用 DB 迁移,因为我们并没有真正使用 Rails 默认约定。修复迁移可能非常痛苦且耗时。当您准备好获得一个完整的数据库进行暂存时,只需“撤消”您的更改。也就是说,使用脚本(rake 任务)删除表并删除模型中的行。
猜你喜欢
  • 2012-07-02
  • 1970-01-01
  • 2014-01-25
  • 2017-03-23
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多