我有一个创建.csv文件的作业,并将它们保存在rails根目录中名为exports的目录中。我还有一个控制器可以下载这样的文件:
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 :(得分:0)
如果生成csv导出的部分进程还使用其他服务器rsync该目录,该怎么办?如果其他服务器关闭,冗余可能会有益......
答案 1 :(得分:0)
在多个主机环境中,需要同步内容非常常见。为什么不考虑使用专为此目的而设计的rsync
,还是rcp或scp哪些不是那么聪明但同样能够移动文件?
您可以采用两种不同的方式:从源主机推送到辅助主机,或者让辅助主机获取数据。
就个人而言,我可能会选择第一种情况。设置一个cron作业,启动一个shell脚本,检查文件是否已准备好被推送。如果是这样,rsync(或scp / rcp)将结束,如果推送成功,则从源目录中删除它们。
在辅助主机上有一个cron作业,会定期触发,查找要导入的文件。如果没有文件立即退出。如果传入目录中有一些,请加载它们然后删除它们,然后退出。
链接到的rsync文章有几个可能有助于您入门的示例。