2010-04-01 86 views
33

推向Heroku的一个坏处是我必须在运行我的数据库迁移之前推送代码(并自动重启服务器)。在Heroku上无需停机热部署

这显然会导致用户在导航网站时出现大约500个错误,导致新代码没有新的表格/属性:Heroku提出的解决方案是使用维护模式,但是我想要一种没有负面影响的方式让我的web应用程序每次运行!

有没有办法?例如与Capistrano的:

  • 我编写的代码在一个新的目录来部署
  • 我跑(向后)迁移和旧代码继续工作完全
  • 我SWITH杂种实例到新的目录和重启服务器

......我没有停机!

回答

0

Heroku无法通过capistrano进行部署。你是由heroku发布的工具阻止。

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

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

+1

Hi shingara, 对不起,但我不同意你的看法。 我不想为此使用负载平衡:Heroku的一个重要特性是必要的“透明”云功能,我想使用此功能......要在Heroku中实现负载均衡,我必须保留两个不同的应用程序和只读数据库可能会给我的用户带来问题。 而一个没有停机系统是不可能的。我用正确的系统解释了没有停机时间。如果发生大的变化而没有兼容减法的数据库模式的可能性,我可以使用维护页面:但这是我所有情况的5%... – zetarun 2010-04-01 15:06:47

+0

您可以使用CouchDB避免此答案中描述的问题,例如。 – iconoclast 2011-03-23 00:00:45

5

改进这个过程的唯一方法是这个家伙建议的。这还不是一个热部署场景,但:

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

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

21

,你可以设置一个第二Heroku的应用程序,它指向同一个DB作为主要的生产应用,并使用辅助应用不中断生产(假设迁移不会破坏你的应用程序的以前版本)运行数据库迁移。

让我们打电话给Heroku应用程序生产步骤

你展开序列将成为类似:

  1. 部署新的代码STAGING
    git push heroku staging
  2. 运行数据库迁移上STAGING(更新PROD DB)
    heroku run -a staging-app rake db:migrate
  3. 部署新代码至生产
    git push heroku production

分期的应用程序不会花费你任何东西,因为你不会需要超过Heroku的自由层,这将是非常容易的设置耙部署脚本来自动为你做到这一点。

祝你好运!

+0

第3步你仍然有点宕机吗? – andrewrk 2012-05-16 20:26:22

+0

我相信Heroku会保持你的旧dynos,直到新的slu comp编译完成,所以你的网站应该保持可用,而第3步正在运行。我想可能会有一些暂时性的停机时间,而Heroku会将路由从旧的路由切换到新的路由,但它应该是非常小的。 – jshkol 2012-05-24 03:48:20

+2

如果您真的将它用作临时环境,我不确定将暂存环境链接到生产数据库是一个非常好的主意。 – Daniel 2013-04-04 15:41:09

9

如果您可以同时在同一个应用程序中同时使用同一个应用程序的两个版本,Heroku现在具有预引导功能。

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

+0

正确的链接现在是:https://devcenter.heroku.com/articles/preboot – 2015-05-20 01:00:00

1

我第一提交迁移,运行它们,然后推动其余的代码。添加一个文件,如下所示:

git commit -m 'added migration' -- db/migrate/2012-your-migration.rb