我正在使用 Pacemaker/OpenAIS 管理运行 NFS v4 的服务器。NFS 配置为使用 TCP。当我将 NFS 服务器迁移到 Pacemaker 集群中的另一个节点时,即使保留了元数据,来自客户端的连接也会“挂起”并最终在 90 秒后超时。90 秒后,旧的挂载点变为“陈旧”,无法再访问挂载的文件。
90 秒的宽限期似乎是服务器配置的一部分,而不是客户端配置。我在服务器上看到这条消息:
内核:NFSD:开始 90 秒的宽限期
如果我在迁移后(卸载然后重新安装共享)在客户端节点上重新启动 NFS 客户端,那么我不会遇到问题,但连接和文件传输仍然中断。
三个问题:
- 什么是 90 秒宽限期?它有什么用?
- 在将 NFS 服务器迁移到另一个节点后,如何在不重新启动客户端的情况下防止文件在客户端上过时?
- 是否真的可以在没有大文件上传丢失的情况下迁移 NFS 服务器?
NFS 在服务器上存储了大量客户端的状态。Pacemaker/OpenAIS 无法弥补 NFS 在这方面的不足。宽限期用于服务器和客户端重新捕获状态。它是协议的一部分。
无论如何,您似乎并没有完全移动客户端状态(例如 /var/lib/nfs 内容)。有关想法以及需要在服务器端进行状态同步的内容, 请参阅此内容。
使用 NfSv3,您可以为挂载指定 UDP 传输以实现即时故障转移,并且客户端/服务器不会更明智,而 NFSv4 使它变得更加棘手。最重要的是,因为 TCP 是唯一可用的传输方式,并且 TCP 的本性不是从脚下撕下连接并像往常一样继续进行。
您可以缩短传输时间。特别是如果您遵循有关公共服务器状态目录和维护 FSID 的建议。尝试在停止 NFS 之前拉出监听接口,并确保挂载未被收回 (
exportfs -ua
)。但它永远不会是绝对即时的。您还应该记住,从一台服务器切换然后再直接返回是一个禁忌。以前的服务器仍然可以保持以前打开的连接处于打开
TIME_WAIT
状态,并且会拒绝新连接长达 20 分钟。这个Heartbeat wiki 页面上的许多细节有点老派,但仍然相关。
物理磁盘是否在单元之间共享,例如它是 SAN 磁盘吗?
您是否正在导出具有恒定 fsid 的光盘
/share *(rw,同步,fsid=6667)
否则:
为 NFS 服务的设备的 inode-Number、IP、次要编号和主要编号必须相同,以保持相同的 NFS 文件句柄。因此,在设备顶部使用 lvm 并保持 lvm 的次要/主要同步。
NFSv4 是一种有状态协议,这意味着各方(客户端、服务器)在进行通信时应该始终了解对方。换句话说,如果服务器在其他地方停止并重新启动,客户端应该在移动之前断开连接,然后在移动完成后重新连接(我猜 Pacemaker + NFSd != love :-)
也许您应该尝试使用glusterfs进行 HA / 集群