双Linux NFS服务器故障切换 – nfsv4leastime / nfsv4gracetime

这里第一次发帖,希望我不会犯很多错误。

我有一个2 NFS服务器的设置。 他们使用corosync / pacemaker + drbd提供主动/被动nfs服务器。 Distro使用的是Ubuntu最新的LTS版本。

群集还提供一个浮动IP为客户端连接。 卷复制工作正常。

问题是在故障转移期间I / O操作等待大约90秒。 故障切换后(新机器已经升级为新主机)客户端上的tcpdump显示如下数据包:

回复ok 52 getattr错误:unk 10013

寻找错误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创build的。 如果我停止nfsserver他们的目录是空的,我不能写信给它。

 root@nfs-ha-1:/proc/fs/nfsd# touch nfsv4gracetime touch: cannot touch `nfsv4gracetime': No such file or directory 

我想跟随这个问题来解释什么是问题以及如何解决问题。 参数只能在特定时刻修改。

如果你试图在nfs-kernel停止(模块卸载)的情况下写入/ proc / fs / nfsd,那么这个文件根本就不存在。 如果在启动nfs-kernel之后尝试,则会出现设备繁忙错误。

解决方法是编辑nfs-kernel-server的初始化脚本,并在模块的modprobe之后修改参数(通过所需文件的常规回显)。

所以你需要在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