在Heroku上进行热部署,无需停机

zet*_*run 34 ruby deployment capistrano heroku uptime

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

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

有办法吗?例如Capistrano:

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

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

jsh*_*kol 22

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

我们打电话给Heroku应用程序生产分段.

您的部署顺序将类似于:

  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部署脚本自动执行此操作将非常简单.

祝好运!

  • 如果您真的将它用作临时环境,我不确定将您的临时环境链接到您的生产数据库是一个非常好的主意. (5认同)

dB.*_*dB. 11

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

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


iwa*_*bed 5

改善这个过程的唯一方法就是这个家伙的建议.但这仍然不是热部署方案:

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

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


shi*_*ara 0

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

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

如果您想要一个小的解决方案来避免问题,那就是平衡两台服务器。一种在迁移期间仅读取数据库的数据库。您可以在迁移期间切换到此实例,从而避免维护页面。迁移后,您将回到您的主人身边。