将大文件上载到服务器群集

时间:2009-08-29 00:36:42

标签: bash rsync cluster-computing

我们有一个由4个网络服务器组成的集群,其中包含一些域名,其中一个域名包含很多视频。我们还有一个'staging'服务器,我们通常会同步/上传文件,然后从那里通过bash脚本将它们全部发送到其他Web服务器。

我们遇到的问题是相当多的是手动的。如果在周末,其中一位内容编辑想要替换视频/上传新视频,那么他们需要等到星期一,我们发现他们会将文件上传到其他地方,因为它更容易等。

我们需要一个解决方案,以便员工可以将大文件上传到登台服务器,然后通过其他服务器同步它们。希望没有其他任何人参与这个过程。

一直在看ajax文件管理器; 通过sftp上传 使用文件管理器移动文件 一些超级同步按钮

2 个答案:

答案 0 :(得分:0)

为什么你不只是有某种自动化过程(使用cron,比方说)为你执行同步?

您可以让一个cron作业监视“Drop box”目录(或目录),然后它可以运行一个脚本来为您执行复制。

或者您可以让用户使用某些元数据提交文件,以便在文件上传后更好地路由文件。

简单地说,永远不要让用户“选择”去哪里,而是让他们告诉你“它的用途”,然后让你的脚本“知道”事情的进展以及如何将它们带到那里。

这是一个相当直接的网络应用程序,即使只是一些perl CGI或其他什么。后端管道也很简单。

回答评论......

如果您有一个执行上传到CGI的Web应用程序,那么在文件完全上传之前,您通常甚至无法“控制”该请求。这取决于您使用的服务器端技术。在任何情况下,当文件完全上传时,很容易通过Web应用程序“了解”。然后,您的同步过程可以完全依赖元数据来实际对文件执行操作,并且在将文件移动到适当的暂存区域等之后才创建元数据。

如果您只是使用FTP或scp将文件复制到登台目录,那么解决方案有两个有两个进程。第一个监视传入目录,第二个实际复制文件。

第一个过程可能看起来像这样:

cd /your/upload/dir
ls -l > /tmp/newfiles
comm -12 /tmp/lastfiles /tmp/newfiles > /tmp/samefiles
filelist=`awk '{print $9}' /tmp/samefiles`
mv $filelist /your/copy/dir
mv /tmp/newfiles /tmp/lastfiles

这样的工作原理如下:

  • 获取当前文件的列表 传入的上传目录。
  • 用途 comm(1)获取具有的文件 自上次以来没有改变 过程运行了。
  • 使用awk(1)获取 未更改的文件名。
  • 使用mv(1) 将文件移动到“暂存” 目录。
  • 最后,它需要 当前的文件列表,并使其成为现实 下一次运行的最后一个清单。

这里的魔力是comm(1)。 'comm -12 filea fileb'为您提供一个文件,其中包含两个文件之间相同的行。如果有新文件进入,那么它的大小会随着上传而改变,所以当你在下一分钟运行'ls -l'时,它的行与新行不匹配 - 大小(最小)将是不同的。因此,comm只会查找日期,文件名和大小未更改的文件。一旦你有了这个清单,剩下的就非常简单了。

这个过程的唯一假设就是你的文件名中没有空格(因此awk可以很容易地从列表中获取文件名)。如果你允许空格,你需要一个更聪明的机制来将'ls -l'行转换为文件名。

此外,'mv $ filelist / your / copy / dir'假定文件名中没有空格,因此它也需要修改(您可以将其滚动到awk脚本中,让它创建一个系统( )或许打电话。

第二个过程也很简单:

cd /your/copy/dir
for i in *
do
    sync $i
    mv $i /your/file/youve/copied/dir
done

同样,这里的“文件名中没有空格假设”。这个过程依赖于你写的“做正确的事”的同步shell脚本。这是留给读者的练习。

同步后,它会将文件移动到另一个目录。显示在那里的任何文件都已正确“同步”。你也可以简单地删除文件,但我倾向于不这样做。我将该目录放在“删除早于一周的文件”程序中。这样,如果您遇到问题,您仍然可以使用可以恢复的原始文件。

这个东西很简单,但它也很强大。

只要第一个进程比上传运行“慢”(即如果你连续运行两次,你可以确保文件大小至少会改变),那么运行时间可以是每1分钟一次,每一小时,每一天,无论如何。至少,它可以安全地重启,并自我恢复。

第二个过程的黑暗面是你的同步过程需要比你的日程安排更长的时间。如果你每分钟运行一次,运行时间超过一分钟,你将有两个进程复制相同的文件。

如果您同步过程是“安全的”,您最终只会将文件复制两次......这是浪费,但通常无害。

您可以使用this之类的技术来缓解这种情况,以确保您的副本脚本不会一次运行多个。

这就是它的核心。您还可以使用组合(使用Web应用程序上传元数据,并使用通过cron自动运行的同步过程)。

您还可以使用一个简单的网页列出/ your / copy / dir中的所有文件,以便人们可以查看他们的文件是否已同步。如果文件在此目录中,则尚未完成同步。

答案 1 :(得分:0)

将这些内容放入仅用于上传的目录中。然后使用rsync将其复制到不同的服务器。不要担心以后在某处移动文件。 Rsync将使用文件大小+修改时间来判断是否需要将文件从Dropbox复制到其他服务器。

您的脚本将是

#!/bin/bash

servers="monkey cow turtle"

for s in $servers
do
    rsync -r /path/to/dropbox $s:/place/to/putit
done

可以手动启动或通过cron运行。您可以创建/检查一个PID文件,这样只有其中一个可以运行,如果需要,可以并行同步到服务器等。如果文件在第一次运行时“中途上传”,则会完成第二次自动。