全部產品
Search
文件中心

File Storage NAS:NFS協議

更新時間:Jul 06, 2024

本文主要介紹NAS支援的NFS協議版本、NFSv3和NFSv4協議的功能差異及NFS一致性。

NFS概念

NFS(Network File System),即網路檔案系統協議,是一種Distributed File System協議,通過NFS協議,您可以像訪問本地檔案一樣訪問遠端系統上的檔案。

Linux作業系統和容器建議使用NFS協議類型的檔案系統。如果使用SMB協議類型的檔案系統,可能會存在一些相容性的問題。更多資訊,請參見讀寫訪問檔案類問題

協議版本

NFS一共發布了3個版本:NFSv2、NFSv3、NFSv4。其中,NFSv4包含兩個次版本NFSv4.0和NFSv4.1。

通用型NAS支援NFSv3和NFSv4.0版本。

極速型NAS支援NFSv3版本。

NFSv3和NFSv4.0差異

  • 功能

    NFSv4.0:是一種有狀態的協議,自身實現了檔案鎖功能和擷取檔案系統根節點功能。

    NFSv3:對檔案鎖無感知,同時掛載時可能會覆蓋掉v4寫入的部分。

  • 安全性

    NFSv4.0增加了安全性,支援RPCSEC-GSS身份認證。

  • 請求

    NFSv4.0隻提供了兩個請求NULL和COMPOUND,所有的操作都整合到COMPOUND中,用戶端可以根據實際請求將多個操作封裝到一個COMPOUND請求中,增加了靈活性。

  • 命令空間

    NFSv4.0檔案系統的命令空間發生了變化,伺服器端必須設定一個根檔案系統(fsid=0),其他檔案系統掛載在根檔案系統上匯出。

更多關於NFS檔案系統使用限制,請參見協議類型

NFS Cache應用

在傳統雲端硬碟中,所有的資料都會被緩衝在PageCache中,修改過的Page會被非同步刷回服務端,所以雲端硬碟的延時都比較低。但在NFS檔案系統中,NFS不會將新建立的檔案或者新寫入的內容緩衝在PageCache中,而是儘快刷回NAS服務端。因此,當多個ECS共用一個NFS協議檔案系統時,NAS所有的操作都會比雲端硬碟多一次網路調用開銷,這個開銷一般在100us ~ 1ms之間。其中,儘快刷回NAS服務端,則涉及NAS所提供的如下多節點一致性模型:

基於逾時的最終一致性

NFS會緩衝目錄或者檔案的屬性(FileAttr),作業系統會根據FileAttr是否發生變化,來判斷這個目錄或者檔案是否在其他ECS被修改過。同時,載入FileAttr後,作業系統在T時間內,會認為Cache(例如,檔案的內容、目錄下的檔案清單)有效;超過T時間後,會去服務端重新擷取一次FileAttr,如果FileAttr未發生變化,作業系統會認為與此檔案相關的Cache全部還是有效。
說明
  • T為自適應的值。預設值:1s~60s。
  • 檔案內容Cache:指緩衝了這個檔案的內容。
  • 目錄子項Cache:緩衝了這個目錄下存在哪些檔案、不存在哪些檔案。
檔案內容Cache樣本:
  1. ECS-1讀取了檔案X的0~4K:第一次讀,cache不命中,訪問伺服器,讀取資料,並緩衝在本地。
  2. ECS-2更新了檔案X的0~4K:資料寫到服務端,更新FileAttr中的mtime。
  3. ECS-1再次讀檔案X的0~4K:第二次讀,如果時間距離第一次小於T,由於FileAttr還沒有到期,因此,直接使用緩衝中的0~4K。
  4. ECS-1再次讀檔案X的0~4K:第三次讀,如果時間距離第一次大於T,則去訪問服務端,擷取新的FileAttr,然後發現mtime變了,因此丟棄cache中的資料,去服務端讀。
目錄子項Cache樣本:
  1. ECS-1嘗試尋找/a:第一次尋找,發現a不存在,於是在目錄/下緩衝一個a不存在的資訊。
  2. ECS-2建立檔案/a
  3. ECS-1再次尋找/a:第二次尋找,由於時間小於T,直接使用cache,然後向使用者報錯檔案不存在。
  4. ECS-1 再次訪問/a:第三次尋找,由於時間大於T,訪問服務端,擷取目錄/最新的FileAttr,發現mtime有變化,則丟棄cache中的資料,去服務端查詢/a

更多有關NFS逾時的最終一致性模型內容,請參見NFS

基於檔案close/open的CTO一致性

由於逾時的最終一致性無法保證ECS-2可以立刻讀ECS-1寫入的資料。因此,為了提升一致性,NFS還提供了基於檔案的CTO(close-to-open)一致性保證,即當兩個及以上計算節點同時讀寫相同的檔案時,ECS-1的修改在ECS-2不一定能立即看到。但是,一旦ECS-1開啟一個檔案,寫入若干資料,然後執行了檔案關閉操作,之後在任何一個計算節點重新開啟該檔案都可以保證能訪問到新寫入的資料。

例如,生產者ECS生產了檔案X,生產完畢後執行了close。然後給訊息佇列發一條訊息說,檔案X生產完畢。消費者ECS訂閱訊息佇列,讀到訊息X(檔案X生產完畢),此時,消費者ECS再去open這個檔案,通過open返回的fd去讀取這個檔案,則一定能夠讀到檔案X的所有內容。如果消費者ECS在生產者ECS生產完畢之前,就open了檔案X,並且持有了fd,當收到訊息後,直接用這個fd去讀,是不保證能夠讀取到最新資料的。

關於解決檔案建立或寫入延遲的解決方案,請參見掛載訪問FAQ掛載訪問FAQ