建立NAS NFS協議檔案系統後,您需要使用雲端服務器來掛載該檔案系統,以實現多個雲端服務器共用訪問檔案系統的目的。本文介紹如何通過阿里雲Linux ECS執行個體掛載NAS NFS協議檔案系統。
前提條件
推薦您通過NFS v3協議掛載檔案系統,以獲得最佳訪問效能。
NFS v4.0支援檔案鎖(包括range lock),如果您需要使用多台Linux ECS執行個體同時修改一個檔案,請使用NFS v4.0協議掛載檔案系統。
Apsara File Storage NAS支援控制台一鍵掛載檔案系統,提供更加方便、快捷的使用體驗。推薦您使用控制台一鍵掛載功能。具體操作,請參見一鍵掛載NAS NFS協議檔案系統。
步驟一:安裝NFS用戶端
在Linux系統掛載NFS協議檔案系統時,需要先安裝NFS用戶端。確保每台Linux伺服器執行一次配置即可,不需要在每次掛載時都執行。
串連ECS執行個體。具體串連方式,請參見串連ECS執行個體。
安裝NFS用戶端。
作業系統
安裝命令
Alibaba Cloud Linux
sudo yum install nfs-utils
CentOS
Redhat
Ubuntu
依次執行以下安裝命令:
sudo apt-get update
sudo apt-get install nfs-common
Debian
增加同時發起的NFS請求的數量。
請執行以下命令,將同時發起的NFS請求數量修改為128。更多資訊,請參見如何修改同時發起的NFS請求數量?。
if (lsmod | grep sunrpc); then (modinfo sunrpc | grep tcp_max_slot_table_entries) && sysctl -w sunrpc.tcp_max_slot_table_entries=128 (modinfo sunrpc | grep tcp_slot_table_entries) && sysctl -w sunrpc.tcp_slot_table_entries=128 fi (modinfo sunrpc | grep tcp_max_slot_table_entries) && echo "options sunrpc tcp_max_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf (modinfo sunrpc | grep tcp_slot_table_entries) && echo "options sunrpc tcp_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf
步驟二:掛載NFS協議檔案系統
在Linux作業系統中,NAS NFS協議檔案系統支援通過手動掛載和自動掛載兩種方式進行掛載。手動掛載適用於臨時掛載,每次伺服器啟動或重啟後都需要重新掛載。自動掛載適用於持久掛載,每次伺服器啟動或重啟後都無需重新掛載。為避免伺服器重啟後,掛載資訊丟失,導致無法查看已掛載的檔案系統,建議您手動掛載成功後,配置自動掛載檔案系統。
手動掛載NFS協議檔案系統
您需要使用檔案系統的掛載點地址,將NAS NFS協議檔案系統掛載至Linux ECS執行個體。
掛載NFS協議檔案系統。
如果您使用的是通用型NAS,請執行以下命令。
說明推薦您通過NFS v3協議掛載檔案系統,以獲得最佳訪問效能。
NFS v4.0支援檔案鎖(包括range lock),如果您需要使用多台Linux ECS執行個體同時修改一個檔案,請使用NFS v4.0協議掛載檔案系統。
使用NFS v3協議掛載檔案系統:
sudo mount -t nfs -o vers=3,nolock,proto=tcp,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport file-system-id.region.nas.aliyuncs.com:/ /mnt
使用NFS v4協議掛載檔案系統:
sudo mount -t nfs -o vers=4,minorversion=0,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport file-system-id.region.nas.aliyuncs.com:/ /mnt
如果您使用的是極速型NAS,請執行以下命令。
sudo mount -t nfs -o vers=3,nolock,noacl,proto=tcp,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport file-system-id.region.extreme.nas.aliyuncs.com:/share /mnt
掛載命令參數說明如下表所示。
參數
描述
通用型NAS:file-system-id.region.nas.aliyuncs.com:/ /mnt
極速型NAS:file-system-id.region.extreme.nas.aliyuncs.com:/share /mnt
表示<掛載地址>:<NAS檔案系統目錄> <當前伺服器上待掛載的本地路徑>,請根據實際情況替換。
掛載地址:您可以在Apsara File Storage NAS控制台檔案系統列表頁面,單擊目標檔案系統後的管理,進入掛載使用頁面擷取掛載地址。更多資訊,請參見查看掛載點地址。
NAS檔案系統目錄:NAS的根目錄(/)或任意子目錄(例如:/share),如果是子目錄,請您確保子目錄是NAS檔案系統中實際已存在的目錄。
說明極速型NAS的共用目錄必須以/share開頭,例如:/share、/share/subdir。
當前伺服器上待掛載的本地路徑:Linux ECS執行個體的根目錄(/)或任意子目錄(例如:/mnt),如果是子目錄,請您確保子目錄已存在。
vers
檔案系統版本。
vers=3:使用NFS v3協議掛載檔案系統。
vers=4:使用NFS v4協議掛載檔案系統。
其中,
minorversion
為協議次版本號碼,NAS支援的NFS v4協議版本為4.0,因此使用NFS v4協議掛載檔案系統時,次版本號碼為0。
說明通用型NAS:支援NFS v3和NFS v4.0。
極速型NAS:只支援NFS v3,不支援NFS v4。
掛載選項
掛載檔案系統時,可選擇多種掛載選項,掛載選項使用半形逗號(,)分隔,說明如下:
rsize:定義資料區塊的大小,用於用戶端與檔案系統之間讀取資料。建議值:1048576。
wsize:定義資料區塊的大小,用於用戶端與檔案系統之間寫入資料。建議值:1048576。
說明如果您需要更改IO大小參數(rsize和wsize),建議您儘可能使用最大值(1048576),以避免效能下降。
hard:在Apsara File Storage NAS暫時停用情況下,使用檔案系統上某個檔案的本地應用程式時會停止並等待至該檔案系統恢複線上狀態。建議啟用該參數。
timeo:指定時間長度,單位為0.1秒,即NFS用戶端在重試向檔案系統發送請求之前等待響應的時間。建議值:600(60秒)。
說明如果您必須更改逾時參數(timeo),建議您使用150或更大的值。該timeo參數的單位為0.1秒,因此150表示的時間為15秒。
retrans:NFS用戶端重試請求的次數。建議值:2。
noresvport:在網路重連時使用新的TCP連接埠,保障在網路發生故障恢複時不會中斷串連。建議啟用該參數。
重要不建議使用soft選項,有資料一致性風險。如果您要使用soft選項,相關風險需由您自行承擔。
避免設定不同於預設值的任何其他掛載選項。如果更改讀或寫緩衝區大小或禁用屬性緩衝,可能會導致效能下降。
驗證掛載結果。
執行命令
mount -l
返回樣本
如果返回資訊包含如下類似資訊,說明掛載成功。
掛載成功後,您還可以執行
df -h
命令,查看當前檔案系統的容量資訊。
如果掛載失敗,請進行錯誤排查。具體操作,請參見掛載檔案系統失敗故障排查。
掛載成功後,您可以在Linux ECS上訪問NAS檔案系統,執行讀取或寫入操作。
您可以把NAS檔案系統當作一個普通的目錄來訪問和使用,樣本如下:
(可選)自動掛載NFS協議檔案系統
您可以通過配置Linux ECS執行個體的/etc/fstab
檔案,實現ECS重啟時自動掛載NFS協議檔案系統。
在配置自動掛載前,請先確認手動掛載成功,避免ECS啟動失敗。
如果您使用的是極速型NAS,請執行以下命令。
如果您使用的是通用型NAS,請跳過此步驟,直接執行步驟2。
vi /etc/systemd/system/sockets.target.wants/rpcbind.socket
開啟/etc/systemd/system/sockets.target.wants/rpcbind.socket檔案後,需要注釋IPv6相關的rpcbind參數(如下圖所示),否則NFS的rpcbind服務自動啟動會失敗。
如果您是在CentOS 6.x系統中配置自動掛載,您還需執行以下操作。
執行
chkconfig netfs on
命令,確保netfs服務開機自啟動。開啟/etc/netconfig設定檔,注釋掉inet6相關的內容(如下圖所示)。
開啟/etc/fstab設定檔,添加掛載配置。
通用型NAS
使用NFS v3協議掛載檔案系統:
file-system-id.region.nas.aliyuncs.com:/ /mnt nfs vers=3,nolock,proto=tcp,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev,noresvport 0 0
使用NFS v4協議掛載檔案系統:
file-system-id.region.nas.aliyuncs.com:/ /mnt nfs vers=4,minorversion=0,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev,noresvport 0 0
極速型NAS
file-system-id.region.extreme.nas.aliyuncs.com:/share /mnt nfs vers=3,nolock,noacl,proto=tcp,noresvport,_netdev 0 0
說明如果您是在CentOS 6.x系統中配置自動掛載,您需先執行
chkconfig netfs on
命令,確保netfs服務開機自啟動。樣本中主要參數說明,請參見掛載命令參數說明表。其餘參數說明如下。
參數
說明
_netdev
防止用戶端在網路就緒之前開始掛載檔案系統。
0(noresvport後第一項)
非零值表示檔案系統應由dump備份。對於NAS檔案系統而言,此值預設為0。
0(noresvport後第二項)
該值表示fsck在啟動時檢查檔案系統的順序。對於NAS檔案系統而言,此值預設為0,表示fsck不應在啟動時運行。
執行以下命令,配置開機開機檔案/etc/rc.local。
[ ! -f /etc/rc.local ] && echo '#!/bin/bash' > /etc/rc.local; echo "for ((i=1; i<=10; i++)); do if ping -c 1 -W 3 aliyuncs.com; then break; else sleep 1; fi; done" >> /etc/rc.local; echo "sleep 3; mount -a -t nfs" >> /etc/rc.local; chmod +x /etc/rc.local
執行
reboot
命令,重啟Elastic Compute Service。重要重啟雲端服務器會中斷業務,建議您在業務低穀時期重啟雲端服務器。
驗證自動掛載配置成功。
在ECS重啟後的一分鐘內,執行
df -h
命令,確認掛載的NAS檔案系統。
附錄: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樣本:
ECS-1讀取了檔案X的0~4K:第一次讀,cache不命中,訪問伺服器,讀取資料,並緩衝在本地。
ECS-2更新了檔案X的0~4K:資料寫到服務端,更新FileAttr中的mtime。
ECS-1再次讀檔案X的0~4K:第二次讀,如果時間距離第一次小於T,由於FileAttr還沒有到期,因此,直接使用緩衝中的0~4K。
ECS-1再次讀檔案X的0~4K:第三次讀,如果時間距離第一次大於T,則去訪問服務端,擷取新的FileAttr,然後發現mtime變了,因此丟棄cache中的資料,去服務端讀。
目錄子項Cache樣本:
ECS-1嘗試尋找/a:第一次尋找,發現a不存在,於是在目錄/下緩衝一個a不存在的資訊。
ECS-2建立檔案/a。
ECS-1再次尋找/a:第二次尋找,由於時間小於T,直接使用cache,然後向使用者警示檔案不存在。
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去讀,是不保證能夠讀取到最新資料的。
典型問題
檔案建立“延遲”
問題現象:
ECS-1建立了檔案abc,但是ECS-2需要過一段時間才能看到ECS-1建立的檔案abc,有時會延遲1s,有時甚至會到1分鐘,這是為什嗎?
問題原因:
這是Lookup Cache導致的,符合預期T時間。例如,ECS-2在ECS-1建立檔案abc前進行了訪問,導致ECS-2發生檔案不存在,於是緩衝了一條檔案abc不存在的記錄。在T時間內,由於FileAttr還沒有到期,ECS-2再次訪問時,仍會訪問第一次緩衝到檔案abc不存在的記錄。
解決方案:
如果要保證ECS-1建立檔案後,ECS-2立即就能看到它,可以使用如下方案:
方案一:關閉ECS-2的Negative Lookup Cache,不緩衝不存在的檔案。該方案開銷最小。
掛載時,添加lookupcache=positive(預設值lookupcache=all)欄位,掛載命令如下所示:
sudo mount -t nfs -o vers=3,nolock,proto=tcp,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,lookupcache=positive file-system-id.region.nas.aliyuncs.com:/ /mnt
方案二:關閉ECS-2的所有緩衝。該方案會導致效能非常差,請根據業務實際情況選擇合適的方案。
掛載時,添加actimeo=0欄位,掛載命令如下所示:
sudo mount -t nfs -o vers=3,nolock,proto=tcp,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,actimeo=0 file-system-id.region.nas.aliyuncs.com:/ /mnt
檔案寫入延時
問題現象:
ECS-1更新了檔案abc,但是ECS-2立即去讀它,仍然是舊的內容,這是為什嗎?
問題原因:
涉及如下兩個原因。
第一個原因:ECS-1寫了abc後,不會立即flush,會先進行PageCache,依賴應用程式層調用fsync或者close。
第二個原因:ECS-2存在檔案Cache,可能不會立即去服務端取最新的內容。例如,ECS-2在ECS-1更新檔案abc之時,就已經緩衝了資料,當ECS-2再次去讀時,仍然使用了緩衝中的內容。
解決方案:
如果要保證ECS-1建立檔案後,ECS-2立即就能看到它,可以使用如下方案:
方案一:CTO一致性,讓ECS-1或ECS-2的讀寫符合CTO模式,則ECS-2一定能讀到最新資料。具體來說,ECS-1更新檔案後,一定要執行close或者執行fsync。ECS-2讀之前,重新open,然後再去讀。
方案二:關閉ECS-1和ECS-2的所有緩衝。該方案會導致效能非常差,請根據業務實際情況選擇合適的方案。
關閉ECS-1的緩衝。掛載時,添加noac欄位,保證所有寫入立即落盤。掛載命令如下所示:
sudo mount -t nfs -o vers=3,nolock,proto=tcp,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,noac file-system-id.region.nas.aliyuncs.com:/ /mnt
說明如果ECS-1的寫操作完成後會調用fsync,或者使用sync寫,可以將上面的noac替換為actimeo=0,效能會稍好一點。
noac等價於
actimeo=0
加sync(即,強制所有寫入都為sync寫)。
關閉ECS-2的緩衝。掛載時,添加actimeo=0欄位,忽略所有緩衝。掛載命令如下所示:
sudo mount -t nfs -o vers=3,nolock,proto=tcp,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,actimeo=0 file-system-id.region.nas.aliyuncs.com:/ /mnt