Гости Windows Server 2016 в кластере WSFC случайным образом помещаются на карантин из-за потери маршрутов heartbeat

Гости Windows Server 2016 в кластере WSFC случайным образом помещаются на карантин из-за потери маршрутов heartbeat

Имеются 2 гостевые ОС Windows Server 2016, размещенные на Hyper-V Server 2016. Кластер гостевых ОС очень ненадежен, и один из узлов постоянно отправляется на карантин (несколько раз в день).

У меня также есть кластер Windows Server 2012R2. Они размещены на тех же хостах Hyper-V и не имеют никаких проблем. Это означает, что у меня одна и та же сетевая и hyper-v инфраструктура как между 2012R2, так и между 2016.

Дальнейшая конфигурация для хостов 2016 года:

  1. В разделе «Сетевые подключения» флажок TCP/IPv6 не установлен для всех адаптеров.Я знаю, что это на самом деле не отключает IPv6 для кластера.так как он использует скрытый сетевой адаптер NetFT и там он инкапсулирует IPv6 в IPv4 для heartbeats. У меня такая же конфигурация на хороших хостах 2012R2.
  2. Хотя кластер 2012R2 работал так, как я хотел, без Witness, я изначально настроил 2016 так же. Пытаясь устранить эти проблемы, я добавил File Share Witness в кластер 2016 — никаких изменений.
  3. Отчет о проверке сети успешно завершен

Я знаюЧТОбывает, но не знаюПОЧЕМУ.ЧТО:

  1. Кластер играет в пинг-понг с пакетами UDP-сигналов через несколько интерфейсов между обоими узлами на порту 3343. Пакеты отправляются примерно каждую секунду.
  2. Внезапно 1 узел прекращает играть в пинг-понг и не отвечает. Один узел все еще пытается доставить пульс.
  3. Ну, я прочитал файл журнала кластера и обнаружил, что узел удалил сведения о маршрутизации:
000026d0.000028b0::2019/06/20-10:58:06.832 ERR   [CHANNEL fe80::7902:e234:93bd:db76%6:~3343~]/recv: Failed to retrieve the results of overlapped I/O: 10060
000026d0.000028b0::2019/06/20-10:58:06.909 ERR   [NODE] Node 1: Connection to Node 2 is broken. Reason (10060)' because of 'channel to remote endpoint fe80::7902:e234:93bd:db76%6:~3343~ has failed with status 10060'
...
000026d0.000028b0::2019/06/20-10:58:06.909 WARN  [NODE] Node 1: Initiating reconnect with n2.
000026d0.000028b0::2019/06/20-10:58:06.909 INFO  [MQ-...SQL2] Pausing
000026d0.000028b0::2019/06/20-10:58:06.910 INFO  [Reconnector-...SQL2] Reconnector from epoch 1 to epoch 2 waited 00.000 so far.
000026d0.00000900::2019/06/20-10:58:08.910 INFO  [Reconnector-...SQL2] Reconnector from epoch 1 to epoch 2 waited 02.000 so far.
000026d0.00002210::2019/06/20-10:58:10.910 INFO  [Reconnector-...SQL2] Reconnector from epoch 1 to epoch 2 waited 04.000 so far.
000026d0.00002fc0::2019/06/20-10:58:12.910 INFO  [Reconnector-...SQL2] Reconnector from epoch 1 to epoch 2 waited 06.000 so far.
...
000026d0.00001c54::2019/06/20-10:59:06.911 INFO  [Reconnector-...SQL2] Reconnector from epoch 1 to epoch 2 waited 1:00.000 so far.
000026d0.00001c54::2019/06/20-10:59:06.911 WARN  [Reconnector-...SQL2] Timed out, issuing failure report.
...
000026d0.00001aa4::2019/06/20-10:59:06.939 INFO  [RouteDb] Cleaning all routes for route (virtual) local fe80::e087:77ce:57b4:e56c:~0~ to remote fe80::7902:e234:93bd:db76:~0~
000026d0.00001aa4::2019/06/20-10:59:06.939 INFO    <realLocal>10.250.2.10:~3343~</realLocal>
000026d0.00001aa4::2019/06/20-10:59:06.939 INFO    <realRemote>10.250.2.11:~3343~</realRemote>
000026d0.00001aa4::2019/06/20-10:59:06.939 INFO    <virtualLocal>fe80::e087:77ce:57b4:e56c:~0~</virtualLocal>
000026d0.00001aa4::2019/06/20-10:59:06.939 INFO    <virtualRemote>fe80::7902:e234:93bd:db76:~0~</virtualRemote>

Теперь часть ПОЧЕМУ... Почему он это делает? Я не знаю. Обратите внимание, что на минуту раньше он жалуется: Failed to retrieve the results of overlapped I/O. Но я все еще вижу, как отправляются/принимаются пакеты UDP

Wireshark

пока маршрут не был удален в 10:59:06 и только 1 узел пингуется, но не имеет pongs. Как видно в wireshark, в исходном столбце нет IP 10.0.0.19 и 10.250.2.10.

Wireshark2

Маршрут добавляется повторно примерно через 35 секунд, но это не помогает — узел и так находится на карантине уже 3 часа.

Что я здесь упускаю?

решение1

У меня была та же проблема с отказоустойчивым кластером Windows Server 2019 (для Hyper-V 2019). Обычно я также отключаю IPv6 на своих серверах, и это вызывало проблемы. Кластер выдавал много критических ошибок и иногда выполнял жесткий отказ, хотя файловый ресурс-свидетель также был на месте и работал(?!).

Ошибки и предупреждения, которые я заметил в журнале событий:

Идентификаторы событий FailoverClustering:

  • 1135 (Узел кластера «....» был удален из активного членства в отказоустойчивом кластере)
  • 1146 (Процесс кластерной подсистемы размещения ресурсов (RHS) был завершен и будет перезапущен)
  • 1673 (Узел кластера «....» перешел в изолированное состояние.)
  • 1681 (Виртуальные машины на узле «....» перешли в неконтролируемое состояние.)

Идентификаторы событий диспетчера управления службами:

  • 7024 (Отсутствует кворум узлов кластера для формирования кластера.)
  • 7031 (Служба кластерной службы неожиданно завершилась.)

FailoverClustering-клиент

  • 81 (Расширенная информация об ошибке RPC)

Благодаря вашим исследованиям я получил важную подсказку: скрытый адаптер все еще использует IPv6. Поскольку в статье, на которую вы ссылались, говорилось, что не рекомендуется и не является общепринятым отключать IPv6 на скрытом адаптере, но его отключение на всех других адаптерах поддерживается и тестируется, мне стало интересно, что помешало ему работать.

Используя следующую команду, я извлек журналы кластера (также спасибо за подсказку! Я не знал о такой полезной команде):

# -Destination (Folder) in my case changed to be not on the "C:\" SATADOM (this thing is slow and has few write cycles)
# -TimeSpan (in minutes) limited to one of the Failovers because these logs get HUGE otherwise.
Get-ClusterLog -Destination "E:\" -TimeSpan 5

К сожалению, у меня были те же записи в журнале, которые вы уже опубликовали.

Я повторно включил IPv6 на всех адаптерах и отменил настройки адаптеров/конфигураций, связанных с туннелем, с помощью:

Set-Net6to4Configuration -State Default
Set-NetTeredoConfiguration -Type Default
Set-NetIsatapConfiguration -State Default

Это не помогло... Присмотревшись, я заметил, что я также всегда отключаю "ненужные" правила брандмауэра, связанные с IPv6... И это, похоже, было действительно важным изменением! Эти правила, похоже, влияют и на невидимый адаптер.

Похоже, дело в следующем: IPv6 не использует ARP для поиска MAC-адресов своих партнеров по коммуникации. Он использует протокол Neighbor Discovery Protocol. И этот протокол не работает, если вы отключите соответствующие правила брандмауэра. В то время как вы можете проверить записи IPv4 ARP с помощью:

arp -a

Это не покажет вам MAC-адреса для адресов IPv6. Для них вы можете использовать:

netsh interface ipv6 show neighbors level=verbose

При желании вы можете отфильтровать вывод по адресам вашего адаптера IPv6 следующим образом:

netsh interface ipv6 show neighbors level=verbose | sls ".*fe80::1337:1337:1234:4321.*" -Context 4 |%{$_.Line,$_.Context.PostContext,""}

Сделав это, я обнаружил, что эти записи, похоже, очень недолговечны. Состояние записи для локального адреса ссылки Microsoft "Failover Cluster Virtual Adapter" кластерного партнера всегда переключалось между "Reachable" и "Probe". Я не понял, в какой момент она была "Unreachable", но после повторного включения правил IPv6 проблема исчезла:

Get-NetFirewallRule -ID "CoreNet-ICMP6-*" | Enable-NetFirewallRule

Каким-то образом этот MAC-адрес, похоже, обменивается другим способом между партнерами кластера (вероятно, потому что это адрес «виртуального удаленного», а не реального?). Поэтому он продолжает появляться снова и снова, что приводит к этим диким состояниям Failover / Quarantine / Isolated.

Возможно, отключение IPv6 на невидимом адаптере тоже помогло бы, но поскольку это не рекомендуется, я решил вообще прекратить отключать все, что связано с IPv6. В любом случае, это дело будущего :-)

Надеюсь, это поможет еще одному товарищу, отключающему IPv6!

Связанный контент