Failover
雙 Linux NFS 伺服器故障轉移 - nfsv4leastime / nfsv4gracetime
第一次在這裡發帖,希望不要犯太多錯誤。
我有 2 個 NFS 伺服器的設置。他們使用 corosync/pacemaker + drbd 來提供主動/被動 nfs 伺服器。使用的發行版是 Ubuntu 最新的 LTS 版本。
Cluster 還提供浮動 ip 供客戶端連接。卷複製工作正常。
問題是在故障轉移期間,i/o 操作等待大約 90 秒。故障轉移後(新機器已升級為新主機)客戶端上的 tcpdump 顯示如下數據包:
回复 ok 52 getattr ERROR: unk 10013
在Google上尋找錯誤 10013 和 nfs 將我帶到這個 usenet 文章
所以我的鎖保留在 nfs 伺服器上,只有在 90 秒後它們才會被釋放。我需要降低該參數(包含在 /proc 中)但是當我嘗試時
root@nfs-ha-1:/# ls -l /proc/fs/nfsd/nfsv4gracetime -rw------- 1 root root 0 Jan 31 11:00 /proc/fs/nfsd/nfsv4gracetime root@nfs-ha-1:/# cat /proc/fs/nfsd/nfsv4gracetime 90 root@nfs-ha-1:/# echo 1 > /proc/fs/nfsd/nfsv4gracetime bash: echo: write error: Device or resource busy root@nfs-ha-1:/#
因此,我需要有關此問題的更多資訊,或在該文件上寫入的方法。這些文件是在執行時使用 nfs-server 創建的。如果我停止 nfsserver,他們的目錄只是空的,我無法寫入它。
root@nfs-ha-1:/proc/fs/nfsd# touch nfsv4gracetime touch: cannot touch `nfsv4gracetime': No such file or directory
我想讓這個跟進來解釋問題是什麼以及如何解決它。參數只能在特定時刻進行修改。
如果您嘗試在 nfs 核心停止(模組已解除安裝)的情況下在 /proc/fs/nfsd 上寫入,則該文件根本不存在。如果您在啟動 nfs-kernel 後嘗試,您將收到設備繁忙錯誤。
解決方案是編輯 nfs-kernel-server 的 init 腳本並在模組的 modprobe 之後修改參數(通過所需文件上的通常 echo)。
所以你需要在 do_modprobe 和 do_mount 指令之間寫參數。
來自 ubuntu 12.04 LTS 的 /etc/init.d/nfs-kernel-server 的範例
# See how we were called. case "$1" in start) if [ -f /etc/exports ] then do_modprobe nfsd echo 15 > /proc/fs/nfsd/nfsv4leasetime echo 25 > /proc/fs/nfsd/nfsv4gracetime # See if our running kernel supports the NFS kernel server if ! grep -E -qs "[[:space:]]nfsd\$" /proc/filesystems; then log_warning_msg "Not starting $DESC: no support in current kernel." exit 0 fi do_mount nfsd $PROCNFSD_MOUNTPOINT || NEED_SVCGSSD=no