Heroku部署过程究竟如何运作?

时间:2011-10-20 14:18:42

标签: deployment heroku

当我将新版本的服务部署到Heroku时,究竟会发生什么?

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

  • 在新版本开始上线之前,是否所有这些都关闭了?当前正在服务的任何待处理请求会发生什么?
  • 有停机时间吗? (假设我只有没有任何迁移的无状态服务)
  • 是否有用于执行自定义迁移的挂钩(例如迁移数据库表)?
  • 我是否可以启动运行新版本的N台服务器,让它们开始为请求提供服务,并且只有在没有为任何请求提供服务时才将以前的N台服务器关闭?
  • 答案是否取决于堆栈/语言? (Aspen / Bamboo / Cedar,Ruby / Node.js / Java /...)

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

2 个答案:

答案 0 :(得分:17)

以下是Heroku部署期间发生的事情(截至2011年10月20日当前*)[1]:

  • Heroku接受你的git推送
  • 新版本是从您应用的最新版本编译并存储的
  • [这些大致同时发生]
    • 发出dyno网格信号以终止[2]您应用的所有正在运行的进程
    • 发出dyno网格信号以启动应用程序的新流程
    • 显示dyno网格以统一应用的所有空闲进程
    • 发送HTTP路由器以开始将HTTP流量路由到运行新版本的Web dynos

一般情况是,为了最大限度地减少任何可能的停机时间,您应该尽量缩短应用的启动时间。

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

要在重新启动期间最大限度地减少连接断开,请使用适当响应SIGTERM的webserve,方法是开始正常关闭(完成现有连接,不要使用新连接)。较新版本的thin将正确处理SIGTERM。

  1. 这个主题是内部讨论的主题,可能 改变未来。
  2. SIGTERM 10s后跟随SIGKILL if 还在运行

答案 1 :(得分:0)

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