創建NAS NFS協議文件系統后,您需要使用云服務器來掛載該文件系統,以實現多個云服務器共享訪問文件系統的目的。本文介紹如何通過阿里云Linux ECS實例掛載NAS NFS協議文件系統。
前提條件
推薦您通過NFS v3協議掛載文件系統,以獲得最佳訪問性能。
NFS v4.0支持文件鎖(包括range lock),如果您需要使用多臺Linux ECS實例同時修改一個文件,請使用NFS v4.0協議掛載文件系統。
文件存儲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文件系統目錄> <當前服務器上待掛載的本地路徑>,請根據實際情況替換。
掛載地址:您可以在文件存儲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:在文件存儲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
命令,重啟云服務器ECS。重要重啟云服務器會中斷業務,建議您在業務低谷時期重啟云服務器。
驗證自動掛載配置成功。
在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