2009-07-10 35 views
2

我有一個應用程序處理目錄中的文件並將它們與處理後的輸出一起移動到另一個目錄。沒什麼特別的。引入了一個有趣的需求:經典文件系統問題 - 目錄上的並行遠程處理

通過允許多個遠程實例在同一文件存儲上工作來實現容錯和處理吞吐量。

其他注意事項是我們不能假設文件系統,因爲我們同時支持Windows和NFS。

當然,問題是,我如何確保不同的實例不嘗試和處理相同的工作,可能會破壞工作或降低吞吐量?文件鎖定可能會產生問題,特別是跨網絡共享。我們可以使用更復雜的方法,如簡單的數據庫或消息傳遞框架(la JMS或類似的方法),但是整個集羣需要具有容錯能力。由於它引入了單點故障,我們不能擁有一個數據庫或消息傳遞提供程序。

我們已經實現了一個解決方案,該解決方案使用多播消息來自我發現處理實例並選擇分配工作的主管。如果主管倒閉並進行另一次選舉,則有超時。然而,我們的網絡庫並不是非常成熟,而且我們的消息實現很笨拙。

但是,我的直覺告訴我,有一種更簡單的方法。

的思考?

回答

1

我認爲你可以放心地假設重命名操作在你關心的所有網絡文件系統上是原子的。因此,如果您將大量工作安排爲單個文件(或鍵入單個文件),那麼請讓每臺服務器首先列出包含新工作的目錄,選擇一項工作,然後讓文件重命名爲自己的文件服務器名稱(例如,機器名稱或IP地址)。對於同時執行相同操作的實例之一,重命名將成功,因此他們應該處理該工作。對於其他人來說,它會失敗,所以他們應該從他們收到的列表中選擇一個不同的文件。假設目錄創建(mkdir)是原子的,但文件創建不是(創建文件,第二個作者可能會覆蓋現有文件)。因此,如果還有多個工作生產者,則爲每件工作創建一個新目錄。

+0

有趣的想法,但我最初想知道如果你關於假定重命名的聲明是原子的是真的。爲什麼假設這是安全的?我們試圖覆蓋的情況是通過NFS運行的;它的緩存在過去引起了我們的問題。 如果我們同時重命名a-> b和a-> c操作,那麼什麼機制可以保護我們免受這兩個b&c的影響? – 2009-07-13 18:49:14