2011-10-20 22 views
6

当我将新服务部署到Heroku时,究竟发生了什么?Heroku部署过程如何工作?

假设我现在有N个Web dynos在线,其中M个当前正在处理请求。

  • 在新版本开始上线之前是否全部关闭?目前正在服务的任何待处理请求会发生什么情况?
  • 是否有停机? (让我们假设我只是在没有任何迁移的情况下拥有无状态服务)
  • 是否存在执行自定义迁移(例如迁移数据库表)的钩子?
  • 我可以启动运行新版本的N台服务器,让它们开始为请求提供服务,并且只在它们没有提供任何请求时才让以前的N台服务器停机?
  • 答案取决于堆栈/语言吗? (白杨/竹/雪松,红宝石/ Node.js的/的Java/...)

我没有这方面有任何正式文件,只是相反的帖子(一些人称热migrations are not possible,而others say there is no downtime)。是否有关于部署过程和上述问题的官方详细信息?

+0

的Heroku或任何其他专有框架似乎并不很受欢迎这里。 – RHT

+0

@RHT - 1,725个问题似乎“足够受欢迎”,不是吗? – ripper234

+0

你是对的,它很受欢迎,我错了它是专有的? – RHT

回答

16

这里是一个Heroku的部署(电流的10/20/2011 *)[1]中发生了什么:

  • 的Heroku收到您的混帐推
  • 一个新版本从最新版本编译您的应用程序和存储
  • [这些大致同时发生]
    • 到了极致网格信号终止[2]为你的应用程序的所有正在运行的进程
    • 到了极致电网signall ED开始新的流程,你的应用程序
    • 到了极致网格通知给unidle
    • 的HTTP路由器信号应用的所有空闲进程开始路由HTTP流量的网络DYNOS运行新版本

一般情况是,为了尽量减少任何可能的停机时间,应尽量减少应用程序的启动时间。

通过遵循谨慎的迁移实践,可以推送新代码,然后在应用程序运行时进行迁移。 下面是一个Rails示例:http://pedro.herokuapp.com/past/2011/7/13/rails_migrations_with_no_downtime/

为了最大限度地减少重启过程中丢失的连接,请使用通过开始正常关闭(完成现有连接,不要采用新连接)的适当的SIGTERM来响应webserve。 thin的较新版本将正确处理SIGTERM。

  1. 这个主题是内部经常讨论的话题,并在未来可能 变化。
  2. SIGTERM接着10秒后用SIGKILL如果 仍在运行
+2

感谢您的详细信息。你是Heroku员工吗?或者,如果没有,你在哪里找到细节?另外,知道哪些受支持的Web服务器可以像您描述的那样提供正常关机......这或许适合于另一个问题。 – ripper234

0

我可以回答“是否有做自定义迁移(例如迁移数据库表)的钩子?”这个问题的一部分。我通过编写一个shell脚本来处理迁移迁移,在我发出“git push heroku”之后立即执行“heroku rake db:migrate”。我不知道是否有更多的“挂钩” - 做到这一点。

+0

如果您使用https://github.com/fastestforward/heroku_san,则它通过rake执行类似于部署过程的一部分 deploy –

+0

您还可以设置一个HTTP部署挂钩,该应用程序本身会调用端点来触发迁移等 http://devcenter.heroku.com/articles/deploy-hooks#http_post_hook –