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