分区Heroku生产数据库 - 可能吗?

时间:2013-08-20 19:11:10

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

我正在考虑为生产数据库支付50美元/月,这样我就可以将PostGIS与我的rails 4 app一起使用。我的问题是我想继续开发一个'staging'环境,但还不能证明支付两个生产数据库是合理的。暂存显然只是生产的一个副本,因此只需将两个应用程序指向同一个数据库URL(post)就可能会引起一些重大问题。

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

来自heroku支持的最初答案是否定的,但我希望有一个有争议的解决方法。

谢谢!

3 个答案:

答案 0 :(得分:2)

首先,我强烈建议只需支付额外的50美元/月。为此,你会得到各种很酷的东西,比如forkingpipelines,以及这种情况,这是一种hacky。老实说,当您清除登台数据库时,我不知道这是否最终会擦除您的生产数据。请在尝试之前进行备份。

我认为这个答案是对技术挑战的回答,而不是商业决策。不用多说,

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

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

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

现在,在暂存时运行迁移

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找到来源。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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