可以将Heroku配置为进行真正的无缝部署吗?

时间:2011-09-08 11:26:29

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

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

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

  1. 将代码推送到某处的暂存目录(旧代码仍然存在)
  2. 针对数据库运行迁移(通常情况下,预先运行迁移更安全,并且可以防止破坏代码的少数几个)
  3. 从负载均衡器中取出一半(或一定比例的服务器)。
  4. 将代码部署到这些服务器。
  5. 如果可能,运行某种自动烟雾测试/锻炼服务器,使他们“热”
  6. 切换哪些服务器进出负载均衡器
  7. 冲洗并重复。
  8. 使用Heroku,我几乎无法控制两个关键步骤:

    • 我无法先运行数据库迁移。我考虑解决这个问题的一种方法是保持数据库迁移分开,然后将这些迁移到heroku - 这虽然很痛苦,但可以解决问题 - 但只会加剧......
    • Dyno旋转时间可能需要相当长的时间 - 显然,这更像是Rails的错误而不是Heroku,但关键问题是我不能做上面的负载均衡器洗牌以确保我的在将新部署的服务器放回负载均衡器之前,应用程序已准备就绪并已加载。相反,我几乎别无选择,只能给用户一个10-15秒的加载屏幕并希望最好(如果我使用上面的数据库部署策略,那就做两次)

    我们目前使用维护屏幕,但如果我们进行全面的持续部署,它将不会成为可扩展的解决方案(我们可能每天大约有10-20个部署,以及10-20 * 30秒的维护屏幕开始加起来)

    有没有人遇到过类似的问题?你是怎么解决的?在heroku上进行 true 持续部署的任何重要案例研究/成功案例?

2 个答案:

答案 0 :(得分:10)

关于dynos旋转时间,Heroku有一个beta功能来解决这个问题:

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

它基本上会先启动你的新dynos,等待一段时间,切换流量,然后再杀掉旧的dynos。我的应用程序在部署期间看到了性能的显着提高。你可以在这里阅读:

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

答案 1 :(得分:7)

在Heroku上,我们会在重启时向你的dyno发出一个SIGTERM。片刻之后,如果过程没有停止,他们将被杀死。当您没有运行迁移时,这应该允许您有足够的宽限时间来无缝重启。

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

希望这会有所帮助。