Heroku零停机时间

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

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

这需要一些工作才能实现。

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

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

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

heroku有一个名为preboot的betafunction。 部署之后,它首先启动你的新dynos并等待一段时间然后切换流量并杀死旧流量:

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

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

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

您可能对其称为preboot的function感兴趣。

取自他们的文件:

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

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

有几点需要注意:

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

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

这是可能的,但需要相当多的前瞻性规划。 从Rails 3.1开始,需要执行三项任务

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

上传代码和重新启动是相当简单的,主要问题在于其他两个,但围绕它们的方式几乎是相同的。

基本上你需要:

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

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

简而言之,您需要考虑您的数据库和代码兼容性,以便它们能够在版本控制方面重叠。

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

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

不 – 目前在Heroku雪松上使用Unicorn是不可能的。 几个星期以来,我一直在和Heroku讨论这件事。

这是Heroku支持部门在2012年3月8日回复我的电子邮件:

嗨,您可以在进行部署时启用维护模式,至少您的用户会看到维护页面而不是错误,并且请求队列也不会建立。

我们肯定知道这是一个痛苦,我们正在努力提供未来的滚动/零停机时间部署。 但是,我们没有ETA要宣布。