35

推送到 Heroku 的一个不好的方面是我必须在运行我的数据库迁移之前推送代码(并且服务器会自动重新启动)。

这显然会导致用户在没有新表/属性的情况下使用新代码浏览网站时出现大约 500 个错误:Heroku 提出的解决方案是使用维护模式,但我想要一种没有缺点的方法,让我的 webapp 每次都运行!

有办法吗?以 Capistrano 为例:

  • 我准备要在新目录中部署的代码
  • 我运行(向后)迁移,旧代码继续完美运行
  • 我将 mongrel 实例切换到新目录并重新启动服务器

...而且我没有停机时间!

4

7 回答 7

22

您可以设置第二个 Heroku 应用程序,它指向与您的主要生产应用程序相同的数据库,并使用辅助应用程序在不中断生产的情况下运行您的数据库迁移(假设迁移不会破坏您应用程序的先前版本)。

我们将 Heroku 应用程序称为PRODUCTIONSTAGING

您的部署顺序将变为:

  1. 将新代码部署到STAGING
    git push heroku staging
  2. 在STAGING上运行数据库迁移(以更新 PROD db)
    heroku run -a staging-app rake db:migrate
  3. 将新代码部署到PRODUCTION
    git push heroku production

登台应用程序不会花费您任何费用,因为您不需要超过 Heroku 的免费层级,并且设置一个 rake 部署脚本来自动为您执行此操作非常简单。

祝你好运!

于 2012-04-10T00:26:11.603 回答
11

如果您能够同时使用同一个应用程序的两个版本,Heroku 现在具有预启动功能。

https://devcenter.heroku.com/articles/preboot

于 2012-09-04T20:54:58.237 回答
5

稍微改进这个过程的唯一方法就是这个人建议的。不过,这仍然不是一个热部署方案:

http://casperfabricius.com/site/2009/09/20/manage-and-rollback-heroku-deployments-capistrano-style/

我建议的一件事是先将您的迁移推送到 Heroku,然后在推送代码库之前运行它们。这将需要将迁移作为独立提交提交并每次手动推送它们(这并不理想)。我很惊讶现在 Heroku 上托管的所有大型应用程序都没有更好的解决方案来解决这个问题。

于 2011-05-03T13:47:56.330 回答
3

当 Heroku 重新启动您的应用程序时,您实际上会有一些停机时间。他们有一个名为 Preboot 的新功能,可以在取出旧的测功机之前启动新的测功机:https ://devcenter.heroku.com/articles/labs-preboot/

至于数据库迁移,该文章链接到这篇关于如何处理该问题的文章:http: //pedro.herokuapp.com/past/2011/7/13/rails_migrations_with_no_downtime/

于 2012-09-25T17:31:00.003 回答
2

我首先提交迁移,运行它们,然后推送其余代码。像这样添加一个文件:

git commit -m 'added migration' -- db/migrate/2012-your-migration.rb
于 2012-11-07T18:35:36.870 回答
0

Heroku 无法通过 capistrano 部署。你被 heroku 发布的工具阻止了。

无停机系统在所有情况下都是不可能的。如何在不停止服务器的情况下进行重大更改来更改架构。如果你不停止它,你可以避免一些变化,你的数据库可能会不一致。所以使用维护页面是一个正常的解决方案。

如果您想要一个避免问题的小解决方案是在两台服务器上进行平衡。迁移期间只有读取数据库的一种。您可以在迁移期间切换到此实例,避免进入维护页面。迁移后,你回到你的主人。

于 2010-04-01T14:19:33.723 回答
0

现在,我认为没有停机时间就不可能做到这一点。我也讨厌它。

这个控制台命令在我能想到的最短时间内完成

git push heroku master && 
heroku maintenance:on && 
sleep 5 && 
heroku run rails db:migrate && 
sleep 3 && 
heroku ps:restart && 
heroku maintenance:off
  1. git push heroku master将 master 分支推送到 heroku
  2. heroku maintenance:on进行维护,所以没有 500s
  3. sleep 5让测功机启动新代码(没有它,迁移可能会失败)
  4. heroku run rails db:migrate进行实际迁移
  5. heroku ps:restart经验不足,重新启动确保新的 dynos 具有最新的模式
  6. heroku maintenance:off轮流维护

如果您有多个应用程序,您可能必须-a <app name>在所有 heroku 命令后面添加。

只需一个命令即可在 Mac OSX 的终端中连续运行这些命令。

于 2018-04-19T14:16:46.873 回答