Назад | Перейти на главную страницу

Балансировка сетевой нагрузки Windows дублирует пакеты UDP?

Задний план

у меня есть два Windows Server 2012R2 Виртуальные машины (каждая с одним сетевым адаптером) прослушивают порт 514 для сообщений UDP Syslog, которые обрабатывают и затем сохраняют сообщения в базе данных. Я пробовал настроить Балансировка сетевой нагрузки для распределения трафика системного журнала между ними двумя.

Когда я протестировал конфигурацию, отправив один 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)

Хост 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 для отправки сообщения системного журнала на определенный 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 пакет отправлен

У гипервизора были сетевые адаптеры с неправильной балансировкой нагрузки, что приводило к дублированию всех широковещательных пакетов. Отключение одной из сетевых карт гипервизора решило проблему.