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

Rya*_*ner 14 continuous-integration ruby-on-rails heroku

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

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

  1. 将代码推送到某处的暂存目录(旧代码仍然存在)
  2. 对数据库运行迁移(通常,事先运行迁移更安全,并且可以防止破坏代码的少数几个)
  3. 从负载均衡器中取出一半(或一定比例的服务器).
  4. 将代码部署到这些服务器.
  5. 如果可能的话,运行某种自动化烟雾测试/锻炼服务器,使他们"热"
  6. 切换哪些服务器进出负载均衡器
  7. 冲洗并重复.

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

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

我们目前使用维护屏幕,但它不会是一个可扩展的解决方案,如果我们移动到全连续部署(我们可能就会有大约10-20部署了一天了,维修屏幕10-20*30秒开始到加起来)

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

Yla*_*n S 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/


小智 7

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

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

希望这会有所帮助.