![热备用 NFS 服务器故障转移](https://linux22.com/image/745371/%E7%83%AD%E5%A4%87%E7%94%A8%20NFS%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%85%E9%9A%9C%E8%BD%AC%E7%A7%BB.png)
我故意采取一种幼稚的方法来设置热备用 NFS 服务器。我有两台服务器 (CentOS 7.7) 通过 NFS 共享一个目录(而不是文件系统)。此目录通过 rsync 在两台服务器上保持同步。两台服务器上的 /etc/exports 文件使用相同的 fsid 进行导出。我有一个 NFS 服务的服务 IP,供客户端使用。客户端正在使用“soft,nosharecache”挂载选项。
现在,我已两次测试此 IP 的手动故障转移,并观察了客户端行为(并默默希望它“正常工作”……)。不幸的是,我的希望破灭了,但在我看来,客户端行为“不一致”,出于教育目的,我想知道为什么它不能“正常工作”,以及可以做些什么来使其正常工作(除了专用的 HA 设置,如 Pacemaker)。
第一次尝试时,我的设置似乎对某些客户端有效(可以在没有注意到切换的情况下访问新服务器上的共享),其他客户端则显示“过时的文件句柄”错误(我使用 umount -fl 并重新安装解决了该问题)。
第二次尝试时(使用 arping 进行更快的 IP 切换),一些客户端再次出现“文件句柄陈旧”错误,其他客户端似乎完全丢失了挂载(从“挂载”输出中消失),但 /proc/fs/nfsfs/volumes 中仍有一行挂载信息。当我为这些客户端重新挂载共享时,“有时”会在 /proc/fs/nfsfs/volumes 中看到重复条目(这似乎不会造成损害)。这次没有客户端“刚好工作”。
有人可以解释一下这种方法失败的(可能很明显的)原因吗?
多谢
答案1
在 nfs 服务器上,/var/lib/nfs
包含 nfs 客户端的会话信息。
如果您对 IP 进行故障转移,则另一个节点将不知道 /var/lib/nfs 内容,该内容为空。
答案2
NFS 服务器并不那么容易failover
。至少有两个原因:
file handles
由于 nfs 文件句柄是永久的,因此故障转移后客户端将期望现有句柄仍然有效并指向同一个文件系统对象。在您的设置中,您导出不同的文件系统,因此文件句柄是不同的。NFSv4 state
如果你的客户端使用 NFSv4.x 挂载,那么他们期望透明的故障转移时所有状态仍然有效。只有当两个服务器都有共享状态存储时才有可能。
这两个要求使得像您这样的简单(或幼稚)的故障转移设置变得不可能。
NFSv4 协议允许终身服务器迁移,但是,AFIK,只有带有 ZFS 的 Oracle Solaris 11 服务器实现了它。