2009-08-29 70 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

相關問題