2010-03-06 66 views
2

我看到一噸約上傳多個文件的問題,但沒有對上傳單個文件到多臺服務器,所以這裏去...將文件上傳到多個服務器

我有一個ASP.NET應用程序,將在兩臺負載均衡的服務器上運行,並且我想允許用戶上傳文件並使它們最終在兩臺服務器上運行。什麼是最乾淨的方式來做到這一點?我使用IIS 6 btw。

浮現在腦海中的一些想法是:

1)使用指向兩個服務器可以訪問一些共享位置的虛擬目錄。如果應用程序在網絡服務中運行,是否會有任何訪問問題?我假設應用程序需要以共享位置機器上存在的用戶帳戶運行。應該如何爲此設置權限?

2)這將是很好,如果我可以通過jQuery發佈請求到我的兩個服務器,引用他們的端口號。即使服務器位於同一個域中,這也違反了同一個源策略,對吧?

是否有另一個我忽略的解決方案?其他網站如何做到這一點?

回答

1

我想你應該更仔細地考慮這個問題 - 擁有一對(或多個)服務器意味着他們中的一些在某些時候會脫機(至少偶爾會重新啓動)。

上傳當不是所有服務器都將在網上不能夠被立即發送到所有的服務器,所以你需要任何中間服務器(這將是一個故障點,除非它是高度可用的本身)或者一個排隊系統來「記住」哪些文件在哪裏,並在相關服務器恢復時傳輸它們。

另外,您需要一個備份系統,以及將新配置的服務器添加到羣集的方法。您還需要一種監視這些文件的方法,以防它們不同步。你的架構需要仔細思考。我沒有答案:)

0

我已經看到這個問題用NAS解決,使用的應用程序池的憑據可以讀/寫文件到該NAS。確保您的NAS設置爲高可用性,以防止單點故障,即:熱插拔瓦特/ RAID,多個陣列控制器,電源等..

您也可以將文件夾監控軟件放在保存某些目錄的服務器上同步中。我不推薦這個解決方案。

1

最簡潔的方法是轉發文件服務器端,真的。如果您通過JavaScript強制執行兩次上傳,您不僅需要擔心如何解決XSS安全問題,而且還會強制用戶爲每個文件使用兩次非常有限的上行帶寬。

無論如何,您不應該將這種細節暴露給客戶端。瀏覽器不需要知道文件結束的位置,只需將其發送給誰。如果你保留了邏輯服務器端,不僅可以隱藏細節(​​因此不易發生錯誤和漏洞),還可以更好地控制過程。您可以稍後創建網關服務,以處理大量後端存儲,並且可以更好地處理髮生故障的服務器。您可以排隊失敗的上傳並重試。如果您在服務器端執行這些操作,所有這些成本都會非常低,但是在客戶端可靠地工作會很痛苦。

保留後端邏輯到您的後端。負載均衡應該對用戶隱藏,所以不需要告訴他們準確發送文件的位置。讓它成爲可選的,如果你願意,但是隱藏他們的行動。只需要將網關服務器上的文件(可以是負載均衡服務器中的文件 - 實際上它也應該是負載均衡的,因此它應該與其中任何一個配合使用)並將其發送到其他服務器從那裏。從服務器到服務器的傳輸可能也會更快。

1

你最好的選擇是NAS,如果有的話 - 一個與任何機器都沒有特別關聯的共享文件系統。然後,您可以專注於通過集羣前端使NAS高度可用。

如果這不是一個選項,你可以在每臺機器上使用一個指向其中一臺機器上的一個文件夾的虛擬目錄,但是這樣你就失去了冗餘。

我在工作中面臨着同樣的挑戰。我的應用程序很小,但需要高度可用,但目前沒有NAS。因此,在每臺計算機的web.config中,我列出了應該存儲上傳文件的所有UNC路徑的列表。上傳到臨時文件夾後,我將文件逐一複製到每臺機器。這並不完美 - 一臺機器可能會停機,在這種情況下,它可能沒有所有文件(並且複製會因尋找缺少的機器而減慢) - 但在我的情況下,上傳並不常見這不值得改進。

正如其他人所說的,Javascript是正確的。上傳一次。

+0

如何設置權限以便您的應用程序寫入每臺機器?您的應用程序是否以網絡服務運行,或者是否模擬了可訪問每臺計算機的ID? – wsanville 2010-03-07 14:00:39

+0

他們爲文件複製進行模擬。我們有一個域帳戶,但如果兩臺服務器具有完全相同的用戶名/密碼,則可以互換使用。您可能想要在配置文件中加密密碼。 – roufamatic 2010-03-08 15:25:09