2010-07-08 42 views
9

我正試圖找到正確的方式來處理NFS客戶端上的陳舊數據。請考慮以下情形:確保客戶端上的文件狀態與NFS服務器同步

  • 兩臺服務器安裝相同的NFS共享存儲與文件
  • 1個服務器的客戶端應用程序上的數字2的服務器試圖訪問已刪除的文件和失敗,刪除一些文件
  • 客戶端應用程序:過時NFS文件句柄(沒有什麼奇怪的,預計會出現錯誤)

(也可能因爲性能原因,在兩臺服務器上緩存裝載選項都很高)。

我試圖理解是:

  • 是否有可靠的檢查方法,該文件是存在?在上面給出的場景中,lstat文件返回成功,應用程序僅在嘗試移動文件後失敗。
  • 如何手動同步客戶端上的目錄內容與服務器?
  • 關於如何在NFS下編寫可靠的文件管理代碼的一些一般性建議?

謝謝。

回答

11
  • 是否有可靠的方法來檢查該文件是否存在?在上面給出的場景中,lstat文件返回成功,應用程序僅在嘗試移動文件後失敗。

這是正常的NFS行爲。

  • 如何手動同步客戶端上的目錄內容與服務器?

那是不可能做手工,因爲NFS僞裝成一個正常的POSIX兼容的文件系統。

我試過一次代碼close()/ open()試圖以某種方式減輕NFS客戶端緩存的影響。在我的情況下,我需要讀取寫入其他服務器上的文件的信息。但即使重新開放的伎倆也接近零效應。我不能將fdatasync()添加到寫入端,因爲這會降低整個應用程序的速度。

我迄今爲止對NFS的使用經驗是,你無能爲力。在關鍵代碼路徑中,我簡單地編碼以重試返回ESTALE的文件操作。

  • 如何在NFS的情況下寫的可靠的文件管理代碼一些一般性的提醒?

國防部我下來你想要的,但如果你的客戶想要的可靠性,他們應該不會使用NFS。

例如,如果客戶需要可靠性,我公司例如廣告使用正確的分佈式文件系統(我故意省略品牌)。我們的核心軟件不保證在NFS上運行,我們不支持這種配置。但在我們的情況下,我們確實需要保證只要數據寫入FS,它們就可以在所有其他節點上訪問。

NFS的一致性可以實現,但以性能爲代價,使得NFS幾乎不可用。 (檢查它的掛載選項。)NFS正在瘋狂地緩存,以隱藏它是服務器文件系統的事實。爲了使所有操作一致,NFS客戶端必須同步轉到NFS服務器以進行每個小操作,繞過本地緩存。那永遠不會很快。

但是因爲我們在這裏談論Linux,所以可以建議客戶使用該軟件來評估可用的羣集文件系統。例如。 RedHat現在正式支持GFS。我聽說過使用CodaFS的人,但沒有很好的信息。

+0

謝謝。你已經證實了我自己的大部分NFS研究結果。猜猜我會編寫一堆ESTALE檢查,因爲我們沒有計劃遷移到其他存儲。我現在不會接受這個答案,希望有人會提出更多關於主題的信息。 – begray 2010-07-08 18:57:33

4

你可以從你的男人NFS嘗試'NOAC「」安裝選項

除了防止客戶 從緩存文件屬性的NOAC 選項強制應用程序寫入 變成同步,以便本地 更改爲一個文件立即在 上可見。這樣, 其他客戶端在檢查 文件的屬性時可以快速檢測到 。

使用NOAC選項提供NFS 客戶端訪問同一文件中 更大的高速緩存一致性,但 它提取顯著的性能 處罰。因此,鼓勵明智地使用 文件鎖定。

您可以有兩個掛載,一個用於快速更改關鍵數據,需要同步,另一個用於其他數據掛載。您也可以查看NFS locking and its limitations

至於一般的建議是:截斷是同時從多個主機讀取的文件

一種方式是寫的內容到一個臨時文件,然後rename該文件到最終位置。

在同一個文件系統上,這個操作應該是原子的。

+0

好吧,這提出了一個好主意:將問題發佈到serverfault。開發人員無法通過編程方式影響NFS(最好是解決方法),而管理員必須更頻繁地處理NFS及其上運行的應用程序。因此後者有更多的經驗,可能會提供更多的建議。 – Dummy00001 2010-07-09 09:03:32

+0

鏈接的NFS鎖定文章現在消失了,你碰巧有更換嗎? – 2013-11-04 01:53:02

1

我已經在包含該文件的目錄上做了ls -l的成功。

相關問題