2019年2月6日 星期三

[經驗分享]Proxmox VE 採用 NFS 連接儲存的重點事項



這是一篇用血淚交織而成的經驗分享。

Proxmox VE 在儲存連接能力上提供了相當豐富的種類,從本機 LVM、ZFS 到網路的 NFS、iSCSI,甚至是分散式檔案系統 Glusterfs、Sheepdog、Ceph 等都能支援。

在我其中一個環境裡就有使用到 NFS 連接方式,NFS 可以用來放虛擬機器的虛擬磁碟,也可以用來放備份檔,好用,但需要注意。





連接問題

我們可以非常容易的在 WebUI 就完成 NFS Storage 的掛載設定,使用起來也很方便,乍看之下是個王子與公主從此過著幸福快樂日子的美麗故事。



Proxmox VE 與 FreeNAS 儲存示意圖




Proxmox VE 虛擬機器磁碟階層示意圖


可惜人生不是童話,充滿了種種理想以外的現實問題。

NFS 夜路走多了,一定會遇見 Error。

最常見的情況,忽然整台 PVE 節點連虛擬機器都卡住不會動了,或是備份到一半時卡住,卡住過後如果能恢復是最好的情況,然而有些狀況是卡住以後,虛擬機器的虛擬磁碟就掛了,甚至是不見了。

在卡住時,常常會看到類似這樣的訊息出現在伺服器畫面上:
本機出現錯誤訊息
Feb 2 09:10:25 pve01 kernel: nfs: server 192.168.1.112 not responding, timed out 
Feb 2 09:10:25 pve01 kernel: nfs: server 192.168.1.112 not responding, timed out 
Feb 2 09:15:25 pve01 kernel: nfs: server 192.168.1.112 not responding, still trying 
Feb 2 09:23:29 pve01 kernel: nfs: server 192.168.1.112 not responding, still trying






問題原因

在我好幾年前的經驗裡,甚至有因為這種情況導致好幾台虛擬機器的虛擬磁碟檔消失不見的,幸好有 VZDump 備份與 ZFS 快照,所以問題不大。

當時研究問題發生的原因,其實主因是在 NFS 與 Storage 上。

我們使用 PVE 的 WebUI 加入 NFS 掛載時,能夠設定的參數不多,但我們可以下 mount 指令來看看詳細的參數是什麼。

使用 mount 指令查看 PVE NFS 掛載參數


在畫面上可以看到 NFS 掛載其實需要很多參數,而 PVE WebUI 幫我們做了很方便的功能,但也簡化掉一些相關設定。在其中可以看到一個「hard」參數,他就是最大的關鍵。

這個 hard 參數的作用,是連接到 NFS Server 有問題時,不論是網路問題或是儲存伺服器出狀況,NFS Client 將會一直持續的進行連接,這件事會讓 NFS Client (也就是 PVE 節點) 與之相關的程序都會一直被這個 NFS 掛載的程序卡住,讓整個系統也受影響,若卡住的更久,甚至可能觸發昨日文章所提到的 Watchdog 機制,搞到這個節點被強制重新啟動。

在這些情況發生以後,有相當的機率會造成當時正依賴 NFS 大量讀或寫的虛擬機器 qcow2 損毀,甚至遺失。






解決方案

既然 NFS 這麼可怕,那我是不是別用 NFS 就可以解決問題了?

不,問題是出在「為什麼 NFS Server 無法連上」,以及「為什麼連不上就卡住」這兩個關鍵點。

問題前者,我們可以經由強化網路連線穩定與 NFS Server 主機的效能足夠來改善,問題後者,其實不難,我們來調整一些 NFS 相關參數,雖然 PVE WebUI 不給,但別忘了 PVE 可是開放架構,我們可以自己改。

PVE WebUI 增加 NFS 掛載畫面


在 NFS 的 mount 模式中,分為 hard mount 與 soft mount 兩種,PVE 所建立出來的 NFS 連接預設值很不巧的也是 hard Mount。採用 soft Mount 可以改善持續不斷連接造成系統卡死的問題。

要設定 soft mount,請還是依照 WebUI 上完成 NFS Storage 的設定,然後再用文字編輯器開啟 /etc/pve/storage.cfg 這個設定檔。

修改 Storage.cfg 設定檔


找到剛剛所建立的 NFS 設定處,在 options 的最後面加入 ,soft 參數,並存檔離開。

接著,我們要讓新的設定生效,最簡單的方法可以將此節點重新開機 (reboot)。

若是不想重新開機,可以將此 NFS Storage 取消掛載:
NFS 取消掛載
umount /mnt/pve/mylove-nas

接著到 WebUI 上點選該 NFS 儲存一次,即可以新的參數掛載。若沒有做此動作,或是這個 Storage 有經常被使用到,PVE 也會在下次被使用時重新自動掛載。

點選以重新掛載 NFS Storage


若想再確認一次,可以再執行 mount | grep nas 指令來確認一下。

再次檢查 NFS 掛載參數


至此,確認已經是 soft mount 參數進行掛載。







結論

修改用 soft mount 以後,不再會因為 NFS 連接斷線或是不穩導致 PVE 卡死,但仍然要注意,若 NFS 的網路或儲存設備本身效能已遇到瓶頸,仍然會出現這樣的訊息:

NFS 卡住警告


這種情況出現,只會影響到當時正在頻繁讀寫的虛擬機器,而不會像 hard mount 時讓整個節點都完蛋。

無論如何,若效能遇到瓶頸時,仍然要注意於根本問題的改善,才是讓系統穩定運作的長治久安之道。


註:
這個經驗,我在 2017 七月的 PVE 分享會上亦有分享過,可至參考資料的第一項 p.90。




參考資料