2011-10-20 76 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 –