
Имеются 2 гостевые ОС Windows Server 2016, размещенные на Hyper-V Server 2016. Кластер гостевых ОС очень ненадежен, и один из узлов постоянно отправляется на карантин (несколько раз в день).
У меня также есть кластер Windows Server 2012R2. Они размещены на тех же хостах Hyper-V и не имеют никаких проблем. Это означает, что у меня одна и та же сетевая и hyper-v инфраструктура как между 2012R2, так и между 2016.
Дальнейшая конфигурация для хостов 2016 года:
- В разделе «Сетевые подключения» флажок TCP/IPv6 не установлен для всех адаптеров.Я знаю, что это на самом деле не отключает IPv6 для кластера.так как он использует скрытый сетевой адаптер NetFT и там он инкапсулирует IPv6 в IPv4 для heartbeats. У меня такая же конфигурация на хороших хостах 2012R2.
- Хотя кластер 2012R2 работал так, как я хотел, без Witness, я изначально настроил 2016 так же. Пытаясь устранить эти проблемы, я добавил File Share Witness в кластер 2016 — никаких изменений.
- Отчет о проверке сети успешно завершен
Я знаюЧТОбывает, но не знаюПОЧЕМУ.ЧТО:
- Кластер играет в пинг-понг с пакетами UDP-сигналов через несколько интерфейсов между обоими узлами на порту 3343. Пакеты отправляются примерно каждую секунду.
- Внезапно 1 узел прекращает играть в пинг-понг и не отвечает. Один узел все еще пытается доставить пульс.
- Ну, я прочитал файл журнала кластера и обнаружил, что узел удалил сведения о маршрутизации:
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 узел пингуется, но не имеет pongs. Как видно в wireshark, в исходном столбце нет IP 10.0.0.19 и 10.250.2.10.
Маршрут добавляется повторно примерно через 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!