双 Linux NFS 服务器故障转移 - nfsv4leastime / nfsv4gracetime

双 Linux NFS 服务器故障转移 - nfsv4leastime / nfsv4gracetime

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

我设置了 2 个 NFS 服务器。它们使用 corosync/pacemaker + drbd 来提供主动/被动 nfs 服务器。使用的发行版是 Ubuntu 最新 LTS 版本。

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

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

回复 ok 52 getattr 错误: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

答案1

我想进行后续跟进,解释问题是什么以及如何解决。参数只能在某些时刻修改。

如果您尝试在 nfs-kernel 停止(模块卸载)的情况下在 /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

相关内容