Nfs

NFS 上的 ln 是原子的且可靠的嗎?在這個案例中 NFS 可以替代 GFS 嗎?

  • April 22, 2014

我有一個包含一堆伺服器的集群,這些伺服器帶有一個共享磁碟,其中包含所有節點同時訪問的 GFS 全域文件系統。

集群中的每個節點都執行相同的程序(shell 腳本是主要核心)。系統處理出現在幾個輸入目錄中的文件,它的工作方式如下:

  • 程序循環輸入目錄。
  • 對於找到的每個文件,檢查是否存在“鎖定文件”,如果鎖定文件存在則跳到下一個文件。
  • 如果沒有找到鎖定文件,則創建鎖定文件。如果鎖定文件創建失敗(比賽失敗),跳到下一個文件
  • 如果“我們”擁有鎖,則處理文件並在完成後將其移開。

這一切都很好,但我想知道是否有更便宜(不太複雜)的解決方案也可以。我可能在考慮 NFS 或 SMB。

我使用 GFS 有兩個原因:

  1. 每個文件只儲存在一個地方(當然在冗餘的底層硬體上)
  2. 文件鎖定工作可靠

我像這樣創建鎖定文件:

date '+%s:'${unid} > ${currlock}.${unid}
ln ${currlock}.${unid} ${currlock}
lockrc=$?
rm -f ${currlock}.${unid}

其中$unid是唯一的會話標識符,並且$currlock/gfs/tmp/lock.${file_to_process}

它的美妙之ln處在於它是原子的,因此除了同時嘗試同一件事的人之外,它對所有人都失敗了。

所以,我想我要問的是:NFS 能滿足我的需求嗎?lnNFS 上的工作方式與 GFS 上的方式相同嗎?

NFS 客戶端上的link()系統呼叫應直接映射到 NFSLINK操作,伺服器應使用其link()係統呼叫實現該操作。因此,只要link()在伺服器上是原子的,它在客戶端上也將是原子的。

引用自:https://unix.stackexchange.com/questions/125933