DRDB 和 NFS:故障转移恢复期间 NFS 停机

DRDB 和 NFS:故障转移恢复期间 NFS 停机

我对 DRBD 和 NFS 还很陌生,正在测试带有心跳的 DRDB 服务器,以用于我们公司的 NFS 共享。

整个设置运行良好,NFS 状态目录与实际共享一起在 DRDB 共享上运行。

我遇到的问题来自我正在测试的故障转移方案。在故障转移方案中,我创建了一个问题,即我在节点 1 上禁用网络连接 (ifconfig eth0 down)。故障转移工作得很好,大约 5 秒就能完成工作,但是当我将其重新启动时 (ifconfig eth0 up,如果它已停止,则启动服务心跳),需要 3-5 分钟才能恢复,在此期间 NFS 共享不可用。

在网络环境中,这 3-5 分钟的停机时间相当长。这是正常的吗?我做错了什么?

我将我们的 drbd.conf 文件粘贴在下面。

resource r0 {
 protocol C;
 startup {
    degr-wfc-timeout 60;    # 1 minute.
  }
  disk {
    on-io-error   detach;
  }
  net {
  }
  syncer {
    rate 10M;
    al-extents 257;
  }
 on tsa-dev-nfstest1 {                # ** EDIT ** the hostname of server 1 (un
   device     /dev/drbd0;        #
   disk       /dev/sdc1;         # ** EDIT ** data partition on server 1
   address    10.61.2.176:7788; # ** EDIT ** IP address on server 1
   meta-disk  /dev/sdb1[0];      # ** EDIT ** 128MB partition for DRBD on serve
  }
 on tsa-dev-nfstest2 {                # ** EDIT ** the hostname of server 2 (un
   device    /dev/drbd0;         #
   disk      /dev/sdc1;          # ** EDIT ** data partition on server 2
   address   10.61.2.177:7788;  # ** EDIT ** IP address on server 2
   meta-disk /dev/sdb1[0];       # ** EDIT ** 128MB partition for DRBD on serve
  }
}

答案1

您的心跳资源组是否包含 NFS 服务的逻辑 IP?

它应该是您最后一个“启动”的资源,也是第一个“关闭”的资源。您的客户端应该使用此 IP 来访问 NFS 服务。

如果您已定义 IP,您可以尝试使用其他资源类型作为 IPAddr(就我记得是 IPAddr2)。该资源类型在 IP 堆栈上的行为略有不同。

基本上,两种类型都应该在 IP 出现后进行 arp 广播 - 以确保连接的路由器和交换机重新学习它们的 mac 表,以便它们知道在故障转移发生后将数据包转发到哪里。

在某些 NFS 实现中,您还应该明确地对已连接的客户端进行 arp。为此,您还必须将连接的客户端数据镜像到备用节点。

答案2

在为我的公司开发 drbd 支持的高可用性 NFS 服务器时,我发现当集群 IP 在测试后返回原始节点时,客户端会出现几分钟(最多约 10 分钟)的停机时间。在这种情况下,新连接会被立即接受并提供服务,但已连接的客户端会经历几分钟的停机时间。

在使用 tcpdump 检查网络流量后,我发现这是 TCP 连接序列号不同步的问题,需要重置。

我建议您使用 Pacemaker 而不是 Heartbeat 来管理集群。如果您这样做,在实际情况下,Pacemaker 能够发出 STONITH(Shoot The Other Node In The Head)请求,从而防止这种情况发生。基本上它会重新启动另一个节点,这肯定会解决这个 TCP 问题。

此外,Pacemaker 在监测方面也比 Heartbeat 好得多。看看这些网站:

起搏器

Linbit 的 NFS over DRBD

相关内容