TL; DR版本:原来,这是Windows Server 2008 R2中的一个Broadcom网络深层错误。替换为英特尔硬件即可修复它。我们不再使用Broadcom硬件。曾经
我们一直在使用HAProxy和Linux-HA项目的心跳信号。我们正在使用两个Linux实例来提供故障转移。每个服务器都有自己的公共IP和一个IP,这两个IP使用虚拟接口(eth1:1)在IP:69.59.196.211之间共享。
虚拟接口(eth1:1)IP 69.59.196.211被配置为位于它们后面的Windows服务器的网关,我们使用ip_forwarding路由通信。
我们偶尔会在linux网关后面的其中一台Windows服务器上遇到网络中断的情况。HAProxy将检测到服务器处于脱机状态,我们可以通过将其远程处理到故障服务器并尝试对网关进行ping操作来进行验证:
使用32个字节的数据ping 69.59.196.211: 来自69.59.196.220的回复:无法访问目标主机。
arp -a
在此失败的服务器上运行表明没有网关地址(69.59.196.211)的条目:
接口:69.59.196.220-0xa 互联网地址物理地址类型 69.59.196.161 00-26-88-63-c7-80动态 69.59.196.210 00-15-5d-0a-3e-0e动态 69.59.196.212 00-21-5e-4d-45-c9动态 69.59.196.213 00-15-5d-00-b2-0d动态 69.59.196.215 00-21-5e-4d-61-1a动态 69.59.196.217 00-21-5e-4d-2c-e8动态 69.59.196.219 00-21-5e-4d-38-e5动态 69.59.196.221 00-15-5d-00-b2-0d动态 69.59.196.222 00-15-5d-0a-3e-09动态 69.59.196.223 ff-ff-ff-ff-ff-ff静态 224.0.0.22 01-00-5e-00-00-16静态 224.0.0.252 01-00-5e-00-00-fc静态 225.0.0.1 01-00-5e-00-00-01静态
在我们的Linux网关实例上arp -a
显示:
eth1上<不完整>处的peak-colo-196-220.peak.org(69.59.196.220) 在eth1上的00:21:5e:4d:45:c9 [ether]上的stackoverflow.com(69.59.196.212) eth1上的00:21:5e:4d:61:1a [ether]上的peak-colo-196-215.peak.org(69.59.196.215) eth1上的peak-colo-196-219.peak.org(69.59.196.219)在00:21:5e:4d:38:e5 [ether] eth1上的peak-colo-196-222.peak.org(69.59.196.222)在00:15:5d:0a:3e:09 [ether] eth1上的peak-colo-196-209.peak.org(69.59.196.209)在00:26:88:63:c7:80 [ether] eth1上的peak-colo-196-217.peak.org(69.59.196.217)在00:21:5e:4d:2c:e8 [ether]
为什么arp有时会将此故障服务器的条目设置为<不完整>? 我们应该静态定义arp条目吗?我一直将arp搁置一旁,因为它有99%的时间都可以工作,但是在这种情况下,它似乎失败了。我们还有其他疑难解答步骤可以帮助您解决此问题吗?
我们尝试过的事情
我添加了一个静态arp条目,用于在仍然没有帮助的Linux网关之一上进行测试。
root@haproxy2:~# arp -a
peak-colo-196-215.peak.org (69.59.196.215) at 00:21:5e:4d:61:1a [ether] on eth1
peak-colo-196-221.peak.org (69.59.196.221) at 00:15:5d:00:b2:0d [ether] on eth1
stackoverflow.com (69.59.196.212) at 00:21:5e:4d:45:c9 [ether] on eth1
peak-colo-196-219.peak.org (69.59.196.219) at 00:21:5e:4d:38:e5 [ether] on eth1
peak-colo-196-209.peak.org (69.59.196.209) at 00:26:88:63:c7:80 [ether] on eth1
peak-colo-196-217.peak.org (69.59.196.217) at 00:21:5e:4d:2c:e8 [ether] on eth1
peak-colo-196-220.peak.org (69.59.196.220) at 00:21:5e:4d:30:8d [ether] PERM on eth1
root@haproxy2:~# arp -i eth1 -s 69.59.196.220 00:21:5e:4d:30:8d
root@haproxy2:~# ping 69.59.196.220
PING 69.59.196.220 (69.59.196.220) 56(84) bytes of data.
--- 69.59.196.220 ping statistics ---
7 packets transmitted, 0 received, 100% packet loss, time 6006ms
重新启动Windows Web服务器可以暂时解决此问题,而无需对网络进行任何其他更改,但是我们的经验表明,此问题将再次出现。
交换网卡和交换机
我注意到发生故障的Windows服务器的交换机端口上的链接指示灯以100Mb的速度运行,而不是出现故障的接口上的1Gb。我将电缆移到了其他几个开放的端口,并且该链接为我尝试的每个端口指示100Mb。我也用相同的结果交换了电缆。我尝试更改Windows中网卡的属性,服务器被锁定,并且在单击“应用”后需要进行硬重置。该Windows Server具有两个物理网络接口,因此我已在两个接口上交换了电缆和网络设置,以查看问题是否出在该接口后面。如果公用接口再次出现故障,我们将知道这与网卡无关。
(我们也尝试过手头的另一个开关,没有任何变化)
更改网络硬件驱动程序版本
最新的Broadcom驱动程序以及Windows Server 2008 R2附带的内置驱动程序都存在相同的问题。
更换网线
作为最后的努力,我们记得发生的另一个变化是更换了服务器/交换机之间的所有跳线。我们已经购买了两组,一组用于专用接口的绿色(长度为1ft-3ft),另一组用于公共接口的红色电缆。我们换掉了其他品牌的所有公共接口跳线,并使我们的服务器运行了整整一周……aaaaa,然后问题再次出现。
禁用校验和卸载,删除TProxy
我们还尝试禁用驱动程序中的TCP / IP校验和卸载,请不要进行任何更改。现在,我们正在撤出TProxy,并转向更传统的x-forwarded-for
网络安排,而无需重写任何精美的IP地址。我们将看看是否有帮助。
交换机虚拟化提供商
在某种程度上这与Hyper-V有关(我们确实在上面托管Linux VM),我们切换到了VMWare Server。没变。
切换主机型号
我们的疑难解答已经结束,现在正式涉及Microsoft支持。他们建议更改主机模型:
- http://en.wikipedia.org/wiki/Host_model
- http://technet.microsoft.com/zh-cn/magazine/2007.09.cableguy.aspx
我们这样做了,并且还获得了一些未发布的内核修补程序,这些修补程序大概已包含在2008 R2 SP1中。没有修复。
更换网卡硬件
最终,用英特尔网络硬件代替Broadcom网络硬件为我们解决了此问题。因此,我倾向于认为Broadcom Windows Server 2008 R2驱动程序有问题!