第一次在这里发帖,希望我不会犯很多错误。
我设置了 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