Heroku的停机时间为零

bra*_*rad 12 ruby-on-rails github heroku downtime

是否有可能在Cedar堆栈上使用Unicorn在Heroku上执行Github零停机部署

我不完全确定重启是如何在Heroku上运行的,以及我们对重启过程有什么控制,但是我喜欢零停机部署的可能性,直到现在,从我读过的,它是不可能的

这需要一些工作.

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

我已经搜索了文档,但是我找不到任何可以表明Heroku上可行的内容.有什么想法吗?

Yla*_*n S 26

我无法解决迁移问题,但关于重新启动进程和避免等待时间的部分:

heroku有一个名为preboot的beta功能.在部署之后,它首先启动您的新dynos并等待一段时间然后切换流量并杀死旧流量:

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

我还写了一篇博文,其中使用此功能对我的应用程序的性能改进进行了一些测量:

http://ylan.segal-family.com/blog/2012/08/27/deploy-to-heroku-with-near-zero-downtime/


Mic*_*jen 8

您可能对其称为preboot的功能感兴趣.

取自他们的文件:

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

某些应用程序需要很长时间才能启动,这可能会导致在部署期间提供HTTP请求时出现无法接受的延迟.

有几点需要注意:

  • 您必须至少有两个Web dynos才能使用此功能.如果您将Web进程类型缩放为1或0,则将禁用预引导.
  • 无论是谁进行部署,都必须等待几分钟,然后新代码开始提供用户请求; 这种情况发生的时间晚于没有预启动的情况(但同时,旧的dynos仍会迅速提供用户请求).
  • 将有一段短暂的时间(一分钟或两分钟),其中heroku ps显示新代码的状态,但旧代码仍在提供用户请求.

有关它的更多信息,请参阅他们的文档.


Nei*_*ton 2

这是可能的,但需要大量的前瞻性规划。从 Rails 3.1 开始,需要执行三个任务

\n\n
    \n
  • 上传新代码
  • \n
  • 运行任何数据库迁移
  • \n
  • 同步资产
  • \n
\n\n

上传代码和重新启动相当简单,主要问题在于其他两个,但解决方法几乎相同。

\n\n

本质上你需要:

\n\n
    \n
  • 使代码与您需要运行的迁移兼容
  • \n
  • 运行迁移,并删除专门为其编写的任何代码
  • \n
\n\n

例如,如果您想删除一列,您\xe2\x80\x99将需要部署一个补丁,告诉ActiveRecord首先忽略它。只有这样您才能部署迁移并清理该补丁。

\n\n

简而言之,您需要考虑数据库和代码兼容性并围绕它们进行工作,以便两者可以在版本控制方面重叠。

\n\n

此方法的替代方法可能是让应用程序的两个版本同时在 Heroku 上运行。部署时,将域切换到其他版本,进行部署,然后再次切换回来。这在大多数情况下都会有所帮助,但数据库兼容性也是一个问题。

\n\n

就我个人而言,我想说,如果您的部署非常重要,需要这种考虑,那么将应用程序的某些部分脱机可能是最安全的答案。通过将应用程序分解为多个较小的应用程序可以帮助缓解这种情况,并且是我经常使用的一种机制。

\n