2011-03-05 49 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文章有几个例子,可能可以帮助您开始。

相关问题