2011-03-05 24 views
1

我有一份工作可以創建.csv文件並將其保存在rails根目錄下的exports中。我也有一個控制器,像這樣下載這些文件:如何在多服務器環境中下載生成的.csv文件

def download_export 
    @export = Export.find(params[:id]) 

    export_file = "#{RAILS_ROOT}/exports/#{@export.name.gsub(/\s/,'_')}_#{@export.id}.csv" 

    if File.exists?(export_file) 
    options = {:filename => "Export (#{@export.name.gsub(/\s/,'_')}_#{@export.id}).csv", :type => "text/csv"} 
    options = options.merge({:x_send_file => true}) if Rails.env != "development" 
    send_file export_file, options 
    else 
    flash[:notice] = "<h3>Export data is not available.</h3>" 
    redirect_to :action => "index" 
    end 
end 

基本上,一切運行在單個服務器上時,按預期工作。生產環境已擴展到平衡器後面的兩臺服務器。有一個夜間任務檢查是否有任何導出在隊列中,如果是,它會生成文件。此任務始終僅在一個實例上運行。

我最好是從其他服務器創建一個符號鏈接到保存文件的目錄嗎?任何想法,將不勝感激。

回答

0

如果生成csv導出的進程的一部分還會將該目錄與其他服務器進行rsyncs相關聯?冗餘有可能會是有益的,如果其他服務器宕機......

How to Synchronize Directories with Rsync

0

它在多主機環境中很常見的需要同步的東西。爲什麼不考慮使用專爲此目的設計的rsync,或者rcpscp,它們不那麼聰明,但同樣能夠移動文件?

您可以通過兩種不同的方式實現:從源主機推送到輔助主機,或者讓輔助主機獲取數據。

就我個人而言,我可能會用第一種情況。設置一個啓動shell腳本的cron作業,該腳本檢查是否準備好推送文件。如果是這樣,請使用rsync(或scp/rcp),如果推送成功,請將其從源目錄中刪除。

在輔助主機上有定期觸發的cron作業,查找要導入的文件。如果沒有文件立即退出。如果傳入的目錄中有一些,加載它們然後刪除它們,然後退出。

鏈接到rsync文章有幾個例子,可能可以幫助您開始。

相關問題