背景

背景

背景

我有两个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 即可解决问题。

相关内容