Failover

雙 Linux NFS 伺服器故障轉移 - nfsv4leastime / nfsv4gracetime

  • February 12, 2014

第一次在這裡發帖,希望不要犯太多錯誤。

我有 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

引用自:https://serverfault.com/questions/474144