【问题标题】:Can Heroku be configured to do a true seamless deployment?Heroku 可以配置为进行真正的无缝部署吗?
【发布时间】:2011-09-08 11:26:28
【问题描述】:

我们的团队最近对持续部署非常感兴趣,但在如何在 Heroku 上实际部署代码方面遇到了一些障碍 - 似乎不可避免地需要一些停机时间将代码推送到 Heroku。

在传统环境中,代码部署可能如下所示:

  1. 将代码推送到某个暂存目录(旧代码仍然有效)
  2. 针对数据库运行迁移(通常情况下,提前运行迁移更安全,并且可以防止少数会破坏代码的代码)
  3. 从负载平衡器中取出一半(或一定百分比的服务器)。
  4. 将代码部署到这些服务器。
  5. 如果可能,请运行某种自动冒烟测试/运行服务器,使其“热”
  6. 切换哪些服务器进出负载平衡器
  7. 冲洗并重复。

使用 Heroku,我几乎无法控制两个关键步骤:

  • 我无法先运行数据库迁移。我考虑过解决这个问题的一种方法是保持数据库迁移单独分支,并首先将它们推送到 heroku - 虽然很痛苦,但可以解决问题 - 但只会加剧......
  • Dyno 启动时间可能需要相当长的时间 - 显然,这更多是 Rails 的错误而不是 Heroku,但关键问题是我无法执行上述负载均衡器 shuffle 之类的操作来确保我的在将新部署的服务器放回负载平衡器之前,应用程序已准备就绪并已加载。相反,我几乎别无选择,只能给用户一个 10 到 15 秒的加载屏幕并希望获得最好的结果(如果我使用上面的数据库部署策略,那就做两次)

我们目前确实使用维护屏幕,但如果我们转向完全连续部署(我们可能每天进行大约 10-20 次部署,以及 10-20 * 30 秒的维护时间),这将不是一个可扩展的解决方案屏幕开始加起来)

有没有人遇到过类似的问题?你是怎么称呼他们的? 真正在heroku上持续部署的任何优秀案例研究/成功案例?

【问题讨论】:

    标签: ruby-on-rails heroku continuous-integration


    【解决方案1】:

    关于 dynos 启动时间,Heroku 有一个测试版功能来解决这个问题:

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

    它基本上首先启动你的新测功机,等待一段时间,切换流量,然后才杀死旧的。我的应用在部署期间的性能有了显着提高。你可以在这里阅读:

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

    【讨论】:

    • 这看起来非常适合我们!谢谢你告诉我!
    • 我在 www.versioneye.com 的生产环境中使用了这个功能,它运行良好。有一些想法需要注意。它不是大型数据库迁移的解决方案。但是对于推出具有较少数据库更改的功能来说,它是完美的。我喜欢它。
    【解决方案2】:

    在 Heroku 上,我们将在重新启动时向您的测功机发出 SIGTERM。一段时间后,如果进程没有停止,它们将被杀死。当您不运行迁移时,这应该为您提供足够的宽限时间来无缝重启。

    您始终可以将代码推送到指向您的生产数据库的暂存应用程序,并从那里运行迁移。 Pedro 写了一篇关于运行零停机迁移的精彩博文,这也应该有所帮助:http://pedro.herokuapp.com/past/2011/7/13/rails_migrations_with_no_downtime/

    希望这会有所帮助。

    【讨论】:

    • 谢谢!我认为这对于数据库方面有很多很棒的策略——尽管还有 dyno 启动时间需要处理,但这是朝着正确方向迈出的一大步。关于您的第一点,我不确定这有多大帮助 - 在 dyno 启动期间总会有用户访问该网站,他们会看到很长的等待时间,除非我错过了那里的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 2021-04-24
    • 2020-01-12
    • 2023-03-31
    • 2010-10-08
    • 2013-03-20
    • 2011-05-09
    相关资源
    最近更新 更多