背景
我有两个Windows Server 2012R2虚拟机(每个虚拟机都有一个 NIC)在端口 514 上监听 Syslog UDP 消息,这些消息会被处理并保存到数据库中。我尝试设置网络负载平衡在它们两者之间分配 Syslog 流量。
当我通过发送测试配置时一从 PowerShell 到 UDP 数据包聚集IP,我注意到我会得到二数据库中的系统日志条目。起初,我以为每个主机分别接收并处理了数据包,因此我为它们都添加了一个标签,以便它们也能保留其专用 IP 地址。由此我知道我实际上是从相同的主持人。
使用 Wireshark,我可以确认接口收到了两个数据包,都是同一个 IP。但如果我将 UDP 数据包发送到投入的IP,我只会收到一个数据包。NLB 在接口上复制数据包的这种行为是正常行为吗?对于负载平衡,这似乎适得其反,因为集群必须为发送的每个数据包处理两个数据包。如何配置 NLB 以不向接收主机提供两个相同的数据包?
我的 NLB 配置
群集属性:
Cluster IP Address: 192.168.1.100
Subnet Mask: 255.255.255.0
Full Internet name: mysyslogcluster.local
Network Address: 03-bf-c0-a8-01-64
Cluster Operation Mode: Multicast
Port Rules: 0-513 (disabled), 514 (udp), 515-65535 (disabled)
主机 1 属性
IP Address: 192.168.1.1
Subnet Mask: 255.255.255.0
Load Weight: Equal
托管 2 属性
IP Address: 192.168.1.2
Subnet Mask: 255.255.255.0
Load Weight: Equal
端口 514 规则
Protocols: UDP
Filtering mode: Multiple host
Affinity: None
测试
我在两台主机上都安装了 Wireshark,并带有过滤器:udp port 514
我编写了一个 PowerShell 函数,用于将 Syslog 消息发送到特定 IP 和端口
function Get-UdpClient($IP, $Port){
$UDPClient = New-Object System.Net.Sockets.UdpClient
$UDPClient.Connect($IP, $Port)
return $UDPClient
}
function Send-Syslog($UDPClient, $facility = 5, $severity = 7, $program = "PSSyslogGen", $hostname = $env:COMPUTERNAME, $category = "TEST", $message){
$priority = ($facility * 8) + $severity
$datetime = Get-Date -Format "MMM dd HH:mm:ss"
$FSyslogMessageStr = "<{0}>{1} {2} {3} {4}: {5}" -f $priority, $datetime, $hostname, $program, $category, $message
$SyslogMessageBytes = [System.Text.Encoding]::ASCII.GetBytes($FSyslogMessageStr)
$resp = $UDPClient.Send($SyslogMessageBytes, $SyslogMessageBytes.Length)
}
如果我在单独的主机上使用 Powershell 运行该命令:
PS C:>$client = Get-UDPClient -IP "192.168.1.100" -Port 514
PS C:>Send-Syslog -UDPClient $client -message "Test NLB"
我将在 Wireshark 中看到:
No. Time Source Destination Protocol Length Info
1 0.000000 192.168.1.200 192.168.1.100 Syslog 115 SYSLOG.DEBUG: Jun 29 12:00:00 PSSyslogGen HOST-NAME TEST: Test NLB
2 0.000077 192.168.1.200 192.168.1.100 Syslog 115 SYSLOG.DEBUG: Jun 29 12:00:00 PSSyslogGen HOST-NAME TEST: Test NLB
然后如果我再次运行它,但这次是专用 IP
PS C:>$client = Get-UDPClient -IP "192.168.1.1" -Port 514
PS C:>Send-Syslog -UDPClient $client -message "Test NLB"
我在 Wireshark 中只会得到一个数据包
3 10.384867 192.168.1.200 192.168.1.1 Syslog 115 SYSLOG.DEBUG: Jun 29 12:00:10 PSSyslogGen HOST-NAME TEST: Test NLB
编辑1
我可以确认 TCP 数据包也表现出同样的行为。我也尝试使用单播群集操作模式配置 NLB,并遇到了同样的问题。
另一台主机上的 Wireshark 没有显示流量。
总之,我将得到2上的数据包单身的通过单身的每个 IP1数据包已发送
答案1
Hypervisor 的 NIC 负载平衡不当,导致所有广播数据包重复。禁用 Hypervisor 的其中一个 NIC 即可解决问题。