![由于丢弃检测信号路由,WSFC 群集中的 Windows Server 2016 客户机被随机隔离](https://linux22.com/image/740528/%E7%94%B1%E4%BA%8E%E4%B8%A2%E5%BC%83%E6%A3%80%E6%B5%8B%E4%BF%A1%E5%8F%B7%E8%B7%AF%E7%94%B1%EF%BC%8CWSFC%20%E7%BE%A4%E9%9B%86%E4%B8%AD%E7%9A%84%20Windows%20Server%202016%20%E5%AE%A2%E6%88%B7%E6%9C%BA%E8%A2%AB%E9%9A%8F%E6%9C%BA%E9%9A%94%E7%A6%BB.png)
拥有 2 个由 Hyper-V Server 2016 托管的客户 Windows Server 2016 操作系统。客户操作系统集群非常不可靠,并且其中一个节点不断被隔离(每天多次)。
我也有 Windows Server 2012R2 集群。它们由相同的 Hyper-V 主机托管,没有任何问题。这意味着我在 2012R2 和 2016 之间拥有相同的网络和 Hyper-V 基础架构。
2016 年主机的进一步配置:
- 在网络连接中,所有适配器的 TCP/IPv6 均未选中。我知道这实际上并没有禁用集群的 IPv6因为它使用 NetFT 隐藏的网络适配器,并且在那里将 IPv6 封装在 IPv4 中以用于心跳。我在良好的 2012R2 主机上也有相同的配置。
- 尽管 2012R2 集群在没有 Witness 的情况下也能正常工作,但我最初对 2016 进行了相同的配置。为了解决这些问题,我将文件共享见证添加到 2016 集群 - 没有变化。
- 网络验证报告成功完成
我知道什么发生了,但不知道为什么。 这什么:
- 集群通过端口 3343 上两个节点之间的多个接口使用心跳 UDP 数据包进行乒乓球运动。每秒大约发送一次数据包。
- 突然,1 个节点停止乒乓球并且没有响应。一个节点仍在尝试传递心跳。
- 好吧,我阅读了集群日志文件,发现该节点删除了路由信息知识:
000026d0.000028b0::2019/06/20-10:58:06.832 ERR [CHANNEL fe80::7902:e234:93bd:db76%6:~3343~]/recv: Failed to retrieve the results of overlapped I/O: 10060
000026d0.000028b0::2019/06/20-10:58:06.909 ERR [NODE] Node 1: Connection to Node 2 is broken. Reason (10060)' because of 'channel to remote endpoint fe80::7902:e234:93bd:db76%6:~3343~ has failed with status 10060'
...
000026d0.000028b0::2019/06/20-10:58:06.909 WARN [NODE] Node 1: Initiating reconnect with n2.
000026d0.000028b0::2019/06/20-10:58:06.909 INFO [MQ-...SQL2] Pausing
000026d0.000028b0::2019/06/20-10:58:06.910 INFO [Reconnector-...SQL2] Reconnector from epoch 1 to epoch 2 waited 00.000 so far.
000026d0.00000900::2019/06/20-10:58:08.910 INFO [Reconnector-...SQL2] Reconnector from epoch 1 to epoch 2 waited 02.000 so far.
000026d0.00002210::2019/06/20-10:58:10.910 INFO [Reconnector-...SQL2] Reconnector from epoch 1 to epoch 2 waited 04.000 so far.
000026d0.00002fc0::2019/06/20-10:58:12.910 INFO [Reconnector-...SQL2] Reconnector from epoch 1 to epoch 2 waited 06.000 so far.
...
000026d0.00001c54::2019/06/20-10:59:06.911 INFO [Reconnector-...SQL2] Reconnector from epoch 1 to epoch 2 waited 1:00.000 so far.
000026d0.00001c54::2019/06/20-10:59:06.911 WARN [Reconnector-...SQL2] Timed out, issuing failure report.
...
000026d0.00001aa4::2019/06/20-10:59:06.939 INFO [RouteDb] Cleaning all routes for route (virtual) local fe80::e087:77ce:57b4:e56c:~0~ to remote fe80::7902:e234:93bd:db76:~0~
000026d0.00001aa4::2019/06/20-10:59:06.939 INFO <realLocal>10.250.2.10:~3343~</realLocal>
000026d0.00001aa4::2019/06/20-10:59:06.939 INFO <realRemote>10.250.2.11:~3343~</realRemote>
000026d0.00001aa4::2019/06/20-10:59:06.939 INFO <virtualLocal>fe80::e087:77ce:57b4:e56c:~0~</virtualLocal>
000026d0.00001aa4::2019/06/20-10:59:06.939 INFO <virtualRemote>fe80::7902:e234:93bd:db76:~0~</virtualRemote>
现在来看看为什么……为什么会这样?我不知道。请注意,一分钟前它抱怨道:Failed to retrieve the results of overlapped I/O
。但我仍然可以看到 UDP 数据包正在发送/接收
直到 10:59:06 删除路由,只有 1 个节点 ping,但没有 pong。从 wireshark 中可以看到,源列中没有 IP 10.0.0.19 和 10.250.2.10。
大约 35 秒后重新添加了路线,但这没有帮助——该节点已被隔离 3 个小时。
我在这里遗漏了什么?
答案1
我刚刚在 Windows Server 2019 故障转移群集(适用于 Hyper-V 2019)中遇到了同样的问题。我通常还会在服务器上禁用 IPv6,这导致了问题。群集抛出许多严重错误,有时会进行硬故障转移,即使文件共享见证也已到位并正常工作(?!)。
我在事件日志中观察到的错误和警告是:
故障转移群集事件 ID:
- 1135(群集节点“....”已从活动故障转移群集成员身份中删除)
- 1146(集群资源托管子系统 (RHS) 进程已终止并将重新启动)
- 1673(群集节点“....”已进入隔离状态。)
- 1681(节点‘....’上的虚拟机已进入不受监控的状态。)
服务控制管理器事件 ID:
- 7024(群集节点法定人数不足,无法形成群集。)
- 7031(群集服务服务意外终止。)
故障转移群集客户端
- 81(扩展的 RPC 错误信息)
感谢您的研究,我得到了一个重要线索:隐藏适配器仍然使用 IPv6。由于您链接的文章说,在隐藏适配器上禁用 IPv6 不推荐或不主流,但在所有其他适配器上禁用 IPv6 是受支持和测试的,我想知道是什么阻止了他工作。
使用以下命令我提取了集群日志(也感谢提示!我不知道这个有用的命令):
# -Destination (Folder) in my case changed to be not on the "C:\" SATADOM (this thing is slow and has few write cycles)
# -TimeSpan (in minutes) limited to one of the Failovers because these logs get HUGE otherwise.
Get-ClusterLog -Destination "E:\" -TimeSpan 5
不幸的是,我有与您已发布的相同的日志条目。
我在所有适配器上重新启用了 IPv6,并使用以下方法恢复了与隧道相关的适配器/配置:
Set-Net6to4Configuration -State Default
Set-NetTeredoConfiguration -Type Default
Set-NetIsatapConfiguration -State Default
这并没有起到作用...进一步观察后,我发现我总是禁用“那些不需要的”IPv6 相关防火墙规则...而这似乎是真正重要的改变!这些规则似乎也会影响隐形适配器。
事情似乎是这样的:IPv6 不使用 ARP 来查找其通信伙伴的 MAC 地址。它使用邻居发现协议。如果您禁用相关的防火墙规则,此协议将不起作用。而您可以使用以下命令检查 IPv4 ARP 条目:
arp -a
这不会显示 IPv6 地址的 MAC 地址。您可以使用以下地址:
netsh interface ipv6 show neighbors level=verbose
如果需要,您可以像这样将输出过滤到您的 IPv6 适配器地址:
netsh interface ipv6 show neighbors level=verbose | sls ".*fe80::1337:1337:1234:4321.*" -Context 4 |%{$_.Line,$_.Context.PostContext,""}
这样做后,我发现这些条目似乎很短暂。集群伙伴的 Microsoft“故障转移群集虚拟适配器”链接本地地址的条目状态始终在“可访问”和“探测”之间切换。虽然我没有得到“不可访问”的时刻,但重新启用 IPv6 规则后,问题就消失了:
Get-NetFirewallRule -ID "CoreNet-ICMP6-*" | Enable-NetFirewallRule
不知何故,这个 MAC 地址似乎以另一种方式在集群伙伴之间交换(可能是因为它是“虚拟远程”地址而不是真实地址?)。因此,它不断出现,导致那些疯狂的故障转移/隔离/隔离状态。
也许在隐形适配器上禁用 IPv6 也会有所帮助,但由于不建议这样做,我现在决定完全停止禁用与 IPv6 相关的功能。无论如何,这是未来 :-)
希望这对其他 IPv6 禁用者有所帮助!