Балансировка сетевой нагрузки Windows дублирует пакеты UDP?
Фон
У меня есть две виртуальные машины Windows Server 2012R2 (каждая с одной сетевой платой), прослушивающие порт 514 для сообщений Syslog UDP, которые обрабатывают и затем сохраняют сообщения в базе данных. Я попытался настроить балансировку сетевой нагрузки, чтобы распределить трафик системного журнала между ними.
Когда я проверил конфигурацию, отправив один пакет UDP из PowerShell на кластерный 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)
Host 1 Properties
IP Address: 192.168.1.1
Subnet Mask: 255.255.255.0
Load Weight: Equal
Host 2 Properties
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 для отправки сообщения системного журнала на определенный 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 пакета на одном хосте через один IP на каждый отправленный 1 пакет
1 ответ
У гипервизора были неправильно распределенные сетевые карты, которые вызывали дублирование всех широковещательных пакетов. Отключение одного из сетевых адаптеров гипервизора решило проблему.