Heroku部署流程是如何工作的?

7
当我将我的服务的新版本部署到Heroku时,会发生什么?
假设我现在有N个网络动力,其中M个正在处理请求。
所有这些都会在新版本开始上线之前关闭吗?正在服务的任何挂起请求会发生什么?
是否存在停机时间?(假设我只有一个无迁移的无状态服务)
是否有用于执行自定义迁移(例如迁移数据库表)的钩子?
我可以启动运行新版本的N个服务器,让它们开始处理请求,并在它们不再处理任何请求时一次性关闭以前的N个服务器吗?
答案是否取决于堆栈/语言?(Aspen/Bamboo/Cedar,Ruby/Node.js/Java/...)
我没有找到任何官方文档来解释这一点,只有相反的帖子(有些人说热迁移不可能,而其他人则说没有停机时间)。是否有关于部署过程和上述问题的官方细节?

Heroku或其他专有框架似乎在这里并不是很受欢迎。 - RHT
@RHT - 1725个问题似乎已经“足够受欢迎”了,不是吗? - ripper234
你说得对,这确实很受欢迎,那我关于它是专有的,是不是错了? - RHT
Heroku是一家云托管服务提供商。您可以将您的Web应用上传到Heroku,然后他们会自动运行它。 - yfeldblum
2个回答

17

以下是Heroku部署过程的具体流程(截至2011年10月20日)[1]:

  • Heroku接收到你的git push命令
  • 将最新版本的应用程序编译为新版本并存储
  • [以下步骤大致同时发生]
    • 向动态网格发送信号以终止正在运行的应用程序所有进程[2]
    • 向动态网格发送信号启动应用程序的新进程
    • 向动态网格发送信号以取消挂起应用程序的所有空闲进程
    • 向HTTP路由器发送信号开始将HTTP流量路由到运行新版本的Web Dynos

总的来说,要最小化可能出现的停机时间,你应该尽量减少应用程序的启动时间。

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

为了在重启期间最小化断开的连接,请使用一个能够正确响应SIGTERM信号的Web服务器,以开始平稳的关闭(完成现有连接,不接受新连接)。较新版本的thin将正确处理SIGTERM信号。

  1. 这个主题在内部进行了广泛讨论,可能会在未来发生变化。
  2. SIGTERM信号后跟10秒钟的SIGKILL信号,如果仍在运行。

2
感谢提供详细信息。您是Heroku的员工吗?如果不是,您在哪里找到这些详细信息的呢?另外,了解一下哪些支持优雅关闭的Web服务器就像您所描述的那样...也许这适合另一个问题。 - ripper234

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

如果您使用https://github.com/fastestforward/heroku_san,它会在部署过程中通过rake <environment> deploy执行类似的操作。 - John Beynon
您还可以设置一个HTTP部署钩子,调用应用程序本身上的端点,从而触发迁移等操作。http://devcenter.heroku.com/articles/deploy-hooks#http_post_hook - David Dollar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接