【问题标题】:Zero downtime on HerokuHeroku 上的零停机时间
【发布时间】:2012-01-09 17:49:59
【问题描述】:

是否可以在 Cedar 堆栈上使用 Unicorn 在 Heroku 上执行类似 the Github zero downtime deploy 的操作?

我不完全确定 Heroku 上的重启是如何工作的,以及我们对重启进程有什么控制权,但我喜欢零停机部署的可能性,直到现在,从 what I've read 开始,这是不可能的

要使其正常工作,需要做一些事情。

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

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

【问题讨论】:

    标签: ruby-on-rails heroku github downtime


    【解决方案1】:

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

    heroku 有一个测试版功能,称为 preboot。部署后,它首先启动您的新 dyno,然后等待一段时间,然后切换流量并杀死旧的:

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

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

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

    【讨论】:

      【解决方案2】:

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

      取自他们的文档:

      此功能通过在终止现有 Web dyno 之前使用新代码启动 Web dynos 来提供无缝部署。

      某些应用需要很长时间才能启动,这可能会导致在部署期间服务 HTTP 请求出现不可接受的延迟。

      有一些注意事项:

      • 您必须至少有两个网络测功机才能使用此功能。如果您将 Web 进程类型缩放为 1 或 0,则预启动将被禁用。
      • 在新代码开始服务用户请求之前,执行部署的人必须等待几分钟;这比没有预启动的情况发生得晚(但与此同时,旧的测功机仍会及时处理用户请求)。
      • heroku ps 会在短时间内(一两分钟)显示新代码的状态,但旧代码仍在处理用户请求。

      有关它的更多信息,请参阅他们的documentation

      【讨论】:

      【解决方案3】:

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

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

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

      基本上你需要:

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

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

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

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

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

      【讨论】:

      • 我知道数据库迁移问题,我更感兴趣的是在 Heroku 上向 Unicorn 发送正确信号以重新启动其进程(即如文章所述)而不是执行直接重新启动所有测功机,以及控制迁移发生的时间(即重新启动之前或之后)
      • 迁移后始终需要重新启动,否则 AR 将无法加载正确的架构。至于重新启动,您几乎是全有或全无。唯一的零停机解决方案是两个应用程序共享一个数据库并独立重启。
      • 实际上并非如此。据我所知,Heroku 在推送后会自动重启。由用户手动迁移(之后发生)。我只能假设 schema.rb 文件是在第一次请求时加载的还是什么?无论如何,这是我的问题的一部分,是否可以在 Heroku 部署中注入任务。我会重新措辞。
      • 是的,重启确实会在推送后发生 - 但如果应用程序已经加载了旧应用程序(来自用户点击应用程序),您需要在迁移后重新启动应用程序
      • 对,所以我的部分问题涉及到,我可以在迁移之后而不是之前重启。我知道我可以手动完成,我想我正在寻找更多的自动化方式(即一些允许我控制何时重新启动的配置)
      【解决方案4】:

      否 - 目前在 Heroku cedar 上使用 Unicorn 是不可能的。几个星期以来,我一直在烦扰 Heroku。

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

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

      我们清楚地意识到这很痛苦,我们正在努力在未来提供滚动/零停机部署。不过,我们没有要宣布的预计到达时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-23
        • 2021-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-10
        相关资源
        最近更新 更多