2011-09-08 31 views
14

我們的團隊最近對連續部署非常感興趣,但是我們遇到了一些關於如何真正將代碼部署到Heroku上的障礙 - 看起來不可避免的是,需要一定量的停機時間做一個代碼推到Heroku。可以將Heroku配置爲進行真正的無縫部署嗎?

在傳統的環境中,代碼部署可能會是這個樣子:

  1. 推的代碼到一個臨時目錄中的某個地方(舊代碼仍然住)
  2. 對數據庫運行遷移(更通常情況下,事先運行遷移會更安全,並且可以防止那些會破壞代碼的少數人)
  3. 從負載平衡器中取出一半(或一些百分比的服務器)。
  4. 將代碼部署到這些服務器。
  5. 如果可能,運行某種自動化冒煙測試的/行使服務器,所以他們很「熱」
  6. 交換機哪些服務器是進出負載平衡器
  7. 沖洗和重複的。

對Heroku,我有過兩個關鍵步驟的控制非常少:

  • 我不能先運行數據庫遷移。我考慮解決這個問題的一個方法是保持數據庫遷移分開分開,並將這些推向heroku首先 - 雖然痛苦,但會加劇問題 - 但只會加劇...
  • Dyno spin-up time can take相當長的時間 - 顯然,這比Rails更多的是Heroku的問題,但關鍵的問題是我不能像上面的負載平衡器shuffle那樣做,以確保我的應用程序在新部署的服務器之前準備好並加載被放回負載平衡器。相反,我幾乎別無選擇,只能給用戶一個10-15秒的加載屏幕,希望最好(如果我使用上面的數據庫部署策略,那麼做兩次)

我們使用維護但如果我們轉向全面持續部署(我們可能每天大約有10-20次部署,並且10-20 * 30秒的維護屏幕開始累計),它不會成爲可擴展的解決方案。

有沒有人遇到類似的問題?你是如何解決他們的?任何偉大案例研究/ true連續部署在heroku上的成功案例?

回答

10

關於DYNOS轉時間,Heroku上有一個測試版功能來解決這一點:

https://devcenter.heroku.com/articles/labs-preboot/

它基本上第一次啓動新DYNOS,等待一會,交換流量,然後才殺死舊的。我的應用程序在部署期間的性能顯着提高。您可以在這裏閱讀:

http://ylan.segal-family.com/blog/2012/08/27/deploy-to-heroku-with-near-zero-downtime/

+0

這看起來非常適合我們!謝謝你讓我知道! –

+0

我在www.versioneye.com的生產環境中使用此功能,並且完美地工作。有一些人認爲需要注意。這不是大數據庫遷移的解決方案。但是爲了推出更少的數據庫更改功能,它是完美的。我喜歡它。 –

7

在Heroku上,我們將在重新啓動時向您的測功機發出一個SIGTERM。過了一會兒,如果這個過程沒有停止,他們將會被殺死。如果您沒有運行遷移,這應該允許您有足夠的時間進行無縫重啓。

您始終可以將代碼推送到指向生產數據庫的臨時應用程序,並從那裏運行遷移。佩德羅寫了一篇關於運行零宕機遷移的好博客文章,這也應該有所幫助:http://pedro.herokuapp.com/past/2011/7/13/rails_migrations_with_no_downtime/

希望這有助於一些。

+0

謝謝!我認爲這對於數據庫方面有很多很好的策略 - 儘管還有動態啓動時間需要處理,但這是向正確方向邁出的巨大一步。關於你的第一點,我不確定這會有多大的幫助 - 在動態調整過程中總會有用戶碰到這個網站,而且他們會看到很長的等待時間,除非我失蹤有些東西。 –

相關問題