Heroku 上无宕机时间

12

是否可以在Heroku上使用Cedar堆栈上的Unicorn实现像Github零停机部署这样的功能?

我不确定Heroku上的重启方式以及我们对重启进程的控制有多少,但我喜欢零停机部署的可能性,直到现在,从我所读到的来看,这是不可能的。

为了使其工作,需要一些要求:

  1. 首先,我们需要向后兼容的迁移。 我们将其留给我们的团队来解决。
  2. 其次,我们希望在推送后立即迁移数据库,但在重启之前(假设我们的迁移完全向后兼容,这不应影响任何内容)
  3. 第三,我们希望指示Unicorn启动一个新的主进程并分叉一些工作进程,然后交换PID并优雅地关闭旧的进程/工作进程。

我已经仔细查阅了文档,但我找不到任何表明在Heroku上可以实现这一点的东西。 有什么想法吗?

4个回答

26

8

您可能会对他们的preboot功能感兴趣。

从他们的文档中获取:

此功能通过在杀死现有Web dynos之前使用新代码引导Web dynos来提供无缝部署。

某些应用程序启动需要很长时间,这可能会在部署期间导致无法接受的延迟。

有一些注意事项:

  • 您必须至少拥有两个Web dynos才能使用此功能。 如果将Web过程类型缩放为1或0,则将禁用预启动。
  • 进行部署的人将不得不等待几分钟,然后新代码才开始提供用户请求; 这比没有预启动要晚一些(但是在此期间,旧dynos仍会及时提供用户请求)。
  • 短暂的时间(一两分钟)内,heroku ps将显示新代码的状态,但用户请求仍由旧代码处理。

还有更多关于它的信息,请参阅其文档


这绝对是正确的方式。Heroku非常棒。 - yegor256
Preboot已经从Heroku实验室中推出,现在已经普遍可用:https://devcenter.heroku.com/articles/preboot - Josh

2
可以做到,但需要进行充分的前期规划。从Rails 3.1开始,需要完成以下三个任务:
- 上传新代码 - 运行任何数据库迁移 - 同步资产
上传代码和重启相对简单,主要问题在于另外两个任务,但解决方法基本相同。
基本上你需要:
- 使代码与需要运行的迁移兼容 - 运行迁移并删除专门为其编写的任何代码
例如,如果你想删除一列,你需要部署一个补丁,告诉ActiveRecord先忽略它。然后才能部署迁移,并清理该补丁。
总之,您需要考虑您的数据库和代码兼容性,并围绕它们进行工作,以便两者可以在版本控制方面重叠。
这种方法的替代方法可能是在Heroku上同时运行两个应用程序版本。当您部署时,将域切换到另一个版本,执行部署,然后再切换回来。这在大多数情况下都有所帮助,但仍存在数据库兼容性问题。
个人而言,我认为如果您的部署需要这种考虑,那么将应用程序的某些部分脱机可能是最安全的答案。通过将应用程序拆分为几个较小的应用程序,可以帮助缓解此问题,这是我经常使用的一种机制。

我知道数据库迁移的问题,但我更关心如何向Heroku上的Unicorn发送正确的信号以重新启动其进程(即如文章所述),而不是直接重启所有dynos,同时控制迁移发生的时间(即在重启之前或之后)。 - brad
重启总是需要在迁移后进行,否则AR将无法加载正确的模式。至于重启,你基本上只有全面重启或不重启两种选择。唯一的零停机答案是两个应用程序共享一个数据库并独立重启。 - Neil Middleton
实际上并不是这样。据我所知,Heroku在推送后会自动重启。手动迁移由用户完成(在此之后发生)。我只能猜测schema.rb文件在第一次请求时被加载了?无论如何,这是我的问题的一部分,是否可以在Heroku部署中注入任务。我会重新措辞。 - brad
是的,在推送后会发生重启 - 但是如果应用程序已经加载了旧版本(用户访问应用程序),则需要在迁移后重新启动应用程序。 - Neil Middleton
好的,我的问题的一部分涉及到这个,我能否在迁移后而不是之前重新启动。我知道我可以手动操作,但我想要更多的自动化方式(例如一些配置,允许我控制何时发生重新启动)。 - brad
使用 Heroku_san(RubyGem)可以设置 post_deploy 钩子以执行其他任务。例如,我使用 pre-deploy 来切换维护状态,并使用 post 来同步资产和重新启动... - Neil Middleton

2
不好意思,目前在Heroku cedar上使用Unicorn是不可能的。我已经向Heroku提出了几周的问题。以下是Heroku Support 2012年3月8日对我的电子邮件的回复:
“嗨,当您进行部署时,可以启用维护模式,这样至少您的用户将看到维护页面而不是错误,并且请求队列也不会建立起来。我们肯定意识到这很麻烦,我们正在努力提供滚动/无停机部署。然而,我们没有公布任何预计时间。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接