2010-04-01 85 views
33

推向Heroku的一個壞處是我必須在運行我的數據庫遷移之前推送代碼(並自動重啓服務器)。在Heroku上無需停機熱部署

這顯然會導致用戶在導航網站時出現大約500個錯誤,導致新代碼沒有新的表格/屬性:Heroku提出的解決方案是使用維護模式,但是我想要一種沒有負面影響的方式讓我的web應用程序每次運行!

有沒有辦法?例如與Capistrano的:

  • 我編寫的代碼在一個新的目錄來部署
  • 我跑(向後)遷移和舊代碼繼續工作完全
  • 我SWITH雜種實例到新的目錄和重啓服務器

......我沒有停機!

回答

0

Heroku無法通過capistrano進行部署。你是由heroku發佈的工具阻止。

在所有情況下,無停機時間系統是不可能的。如何在不停止服務器的情況下通過大改變來改變您的架構如果你不停止它,你可以避免一些改變,你的數據庫可能會不一致。所以維護頁面的使用是一個正常的解決方案。

如果你想要一個小的解決方案來避免問題是在兩臺服務器中進行平衡。一個在遷移期間只能讀取數據庫。您可以在遷移過程中切換到此實例,以避免維護頁面。遷移後,你會回到你的主人。

+1

Hi shingara, 對不起,但我不同意你的看法。 我不想爲此使用負載平衡:Heroku的一個重要特性是必要的「透明」雲功能,我想使用此功能......要在Heroku中實現負載均衡,我必須保留兩個不同的應用程序和只讀數據庫可能會給我的用戶帶來問題。 而一個沒有停機系統是不可能的。我用正確的系統解釋了沒有停機時間。如果發生大的變化而沒有兼容減法的數據庫模式的可能性,我可以使用維護頁面:但這是我所有情況的5%... – zetarun 2010-04-01 15:06:47

+0

您可以使用CouchDB避免此答案中描述的問題,例如。 – iconoclast 2011-03-23 00:00:45

5

改進這個過程的唯一方法是這個傢伙建議的。這還不是一個熱部署場景,但:

http://casperfabricius.com/site/2009/09/20/manage-and-rollback-heroku-deployments-capistrano-style/

有一件事我會建議只是第一個是推你的移民達的Heroku和運行它們你推你的代碼之前。這將需要將遷移作爲獨立提交進行提交,並且每次都要手動推送它們(這並不理想)。我很驚訝,現在所有在Heroku上託管的大型應用程序都沒有更好的解決方案。

21

,你可以設置一個第二Heroku的應用程序,它指向同一個DB作爲主要的生產應用,並使用輔助應用不中斷生產(假設遷移不會破壞你的應用程序的以前版本)運行數據庫遷移。

讓我們打電話給Heroku應用程序生產步驟

你展開序列將成爲類似:

  1. 部署新的代碼STAGING
    git push heroku staging
  2. 運行數據庫遷移上STAGING(更新PROD DB)
    heroku run -a staging-app rake db:migrate
  3. 部署新代碼至生產
    git push heroku production

分期的應用程序不會花費你任何東西,因爲你不會需要超過Heroku的自由層,這將是非常容易的設置耙部署腳本來自動爲你做到這一點。

祝你好運!

+0

第3步你仍然有點宕機嗎? – andrewrk 2012-05-16 20:26:22

+0

我相信Heroku會保持你的舊dynos,直到新的slu comp編譯完成,所以你的網站應該保持可用,而第3步正在運行。我想可能會有一些暫時性的停機時間,而Heroku會將路由從舊的路由切換到新的路由,但它應該是非常小的。 – jshkol 2012-05-24 03:48:20

+2

如果您真的將它用作臨時環境,我不確定將暫存環境鏈接到生產數據庫是一個非常好的主意。 – Daniel 2013-04-04 15:41:09

9

如果您可以同時在同一個應用程序中同時使用同一個應用程序的兩個版本,Heroku現在具有預引導功能。

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

+0

正確的鏈接現在是:https://devcenter.heroku.com/articles/preboot – 2015-05-20 01:00:00

1

我第一提交遷移,運行它們,然後推動其餘的代碼。添加一個文件,如下所示:

git commit -m 'added migration' -- db/migrate/2012-your-migration.rb