2009-08-29 111 views
0

我们有一个包含几个域的4个Web服务器集群,其中一个域包含相当多的视频。我们还有一个'staging'服务器,我们通常会同步/上传文件,然后通过bash脚本将它们全部rsync同步到其他Web服务器。将大文件上传到服务器集群

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

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

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

回答

0

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

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

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

简单地说,不要让用户“选择”它去哪里,而是让他们告诉你“它是为了什么”,然后让你知道事情发生的地方以及如何让它们到达那里。

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

接听评论...

如果你有一个Web应用程序进行上传到CGI,那么你通常不会连得后才文件已完全上传请求的“控制”。这种取决于你使用的服务器端技术。无论如何,当文件完全上传时,用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'时,它的行将与新行不匹配 - 大小(最小)将会不同。所以,通讯只会发现谁的日期,文件名和大小没有改变的文件。一旦你有了这个列表,其余的都很简单。

这个过程的唯一假设就是你的文件名没有空格(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分钟,每小时,每天,不管。至少,它可以安全地重新启动,并自我恢复。

第二个过程的阴暗面在于,如果您的同步过程花费的时间比您的日程安排cron更长。如果您每分钟运行一次,并且运行需要一分钟以上,则会有两个进程复制相同的文件。

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

您可以通过使用像this这样的技术来减轻这种情况,以确保您的副本脚本一次不会运行多个脚本。

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

您还可以通过一个简单的网页列出/ your/copy/dir中的所有文件,以便大家可以查看它们的文件是否已同步。如果该文件位于该目录中,它尚未完成同步。

+0

这是一个有趣的方法,我能看到的唯一问题是,如果有一些自动运行的自动cron,那么它可能会尝试同步文件,当他们只上传一半。 需要某种标志,也许元数据文件必须在主文件之后上传。我想主题是'上传大....',但我可能需要一些如何处理删除文件。 – Wizzard 2009-08-29 10:29:20

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文件,这样它本身只有一个会运行,如果你愿意的话可以并发同步到服务器等等。如果一个文件在脚本第一次运行时“半上传”,那么它将会完成第二次自动。

+0

谢谢我有一些与atm非常相似的东西。然而,问题是如何确定上传文件(保管箱)在服务器上的位置。由于有几个网站有多个文件夹。我可以设置一些默认值,(所有的pdf都去这里等),但总会有例外 – Wizzard 2009-09-06 03:48:13

+0

你需要额外的元数据(比如Will说)来找出把东西放在哪里。或者,另一种可能性是将每个系统上使用的目录结构标准化,所以毫无疑问。 – Shizzmo 2009-09-09 01:39:21