2014-01-19 21 views
2

它是安全的運行在Rails生產應用程序中清除列緩存安全嗎?

Klass.reset_column_information 
Klass.connection.schema_cache.clear! 

生產,而Rails應用程序運行?

我想做零停機時間部署,並且在後臺遷移完成運行後開始工作。後臺遷移正在創建新表,因此它們將很快完成。

從我在短期研究中收集的內容。如果我的Rails應用程序服務器重新啓動並且表尚未創建,Klass(當然繼承自ActiveRecord::Base)會在生產中引導Rails應用程序時的預先加載過程期間緩存表尚未存在的事實。

只要當使用與Klass功能我的代碼部分被擊中我想檢查是否存在名爲Klass.table_name表的存在,並嘗試重新加載其架構中的表不存在。在一段時間內(分鐘),表格將通過後臺遷移創建,最後一次重新加載模式,我可以使用我的新功能。

我不擔心性能影響,因爲此功能不常使用,並且在遷移完成運行之前很可能不會觸發一次。

TLDR:

  • 部署Rails應用程序
  • 重啓Web服務器
  • 開始運行的後臺遷移
  • 功能無活性
  • 結束正在運行的後臺遷移
  • 功能活躍

這將是程序。

我知道我可以將它分成兩個部署。在舊代碼運行時在後臺添加新表,然後執行需要這些表的功能部署。但是我想知道我是否可以通過一次部署就能獲得一個工作解我想避免爲部署零宕機時間而對兩項新功能進行部署。

+0

否則當你已經掛起的遷移是相當棘手的零時間部署。 – bronislav

回答

0

你應該看看Capistrano,它提供了你正在尋找的所有功能。

  • 部署新的代碼到一個新的目錄(非實時)
  • 運行未決遷移
  • 運行任何其他部署任務,如資產彙編等
  • 重新指向了「活」網站的新代碼使用符號連接
  • 重新啓動應用服務器

下面是該項目:

https://github.com/capistrano/capistrano

這是一個很好的教程(需要親成員):

http://railscasts.com/episodes/373-zero-downtime-deployment

+0

如果您沒有掛起遷移,此解決方案可用於零時間部署。遷移數據的必要性可能會給您帶來意想不到的麻煩。 – bronislav

+0

在上線之前,您應該在非現場環境中測試部署本身。使用'cap deploy:migrations'進行部署將確保在部署期間爲您運行您的遷移。 – Jon

+0

你是對的。如果站點在遷移過程中可以訪問,則可能會導致數據庫不一致。 – bronislav

相關問題