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

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

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

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

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

  1. В сетевых подключениях TCP / IPv6 не отмечен для всех адаптеров. Я знаю, что на самом деле это не отключает IPv6 для кластера. поскольку он использует скрытый сетевой адаптер от NetFT и инкапсулирует IPv6 в IPv4 для тактовых импульсов. У меня такая же конфигурация на хороших хостах 2012R2.
  2. Хотя кластер 2012R2 работал так, как я хотел, без свидетеля, я изначально настроил 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-пакеты

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

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

Что мне здесь не хватает?

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

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

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

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

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

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

FailoverClustering-Client

  • 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-адресов своих партнеров по связи. Он использует протокол обнаружения соседей. И этот протокол не работает, если вы отключите соответствующие правила межсетевого экрана. Хотя вы можете проверить записи 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 «Виртуальный адаптер отказоустойчивого кластера» партнера по кластеру всегда переключалось между «достижимо» и «зондом». Я не понял момента, когда он был «недоступен», но после повторного включения правил IPv6 проблема исчезла:

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

Каким-то образом кажется, что этот MAC-адрес обменивается другим способом между партнерами по кластеру (возможно, потому, что это «виртуальный удаленный» адрес, а не реальный?). Таким образом, он продолжает появляться, что приводит к этим диким состояниям аварийного переключения / карантина / изолированного состояния.

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

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