Поддержание работоспособности репликации Hyper-V с помощью PowerShell

Опубликовано: 17 Апреля, 2023
Поддержание работоспособности репликации Hyper-V с помощью PowerShell

Одной из моих любимых функций Hyper-V является возможность репликации виртуальных машин Hyper-V с одного хост-сервера на другой. Однако одним из недостатков репликации Hyper-V является то, что реплики могут и иногда не синхронизируются. Когда это произойдет, вы можете даже не узнать об этом, если не используете какой-либо механизм уведомления, который сообщит вам о состоянии вашей репликации Hyper-V.

К счастью, сегодня репликация Hyper-V намного надежнее, чем когда-то. При первом выпуске Windows Server 2012 R2 я регулярно сталкивался с ошибками репликации. Сегодня сбои репликации редки, но иногда случаются. На самом деле, по чистой случайности, когда я писал эту статью, на одном из моих хостов Hyper-V действительно произошел сбой репликации.

К счастью, можно использовать PowerShell, чтобы следить за процессом репликации. Модуль Hyper-V для PowerShell включает командлет Get-VMReplication, который можно использовать для получения обзора репликации Hyper-V. Вы можете увидеть, как этот командлет выглядит в действии, на рисунке ниже.

В данном конкретном случае у меня есть только одна реплицируемая виртуальная машина, но организации относительно часто реплицируют несколько виртуальных машин. В этом случае может быть полезно отфильтровать выходные данные командлета, чтобы он отображал только нужные виртуальные машины. Если бы, например, я хотел увидеть список виртуальных машин, которые реплицировались нормально, я мог бы использовать эту команду:

Get-VMReplication | Where {$_.Health -eq ‘Normal’}

И наоборот, если бы я хотел видеть только те виртуальные машины, которые находились в критическом состоянии репликации, я мог бы вместо этого использовать эту команду:

Get-VMReplication | Where {$_.Health -eq ‘Critical’}

Хотя возможность отображать информацию такого рода — это здорово, перечисленная выше команда имеет ограниченное применение сама по себе. В конце концов, эта команда отображает информацию о репликации только для локальной машины, а репликация использует как минимум два сервера Hyper-V. Кроме того, я видел ситуации, когда один сервер в паре репликации сообщает, что репликация работает, а другой сервер сообщает, что репликация не удалась, поэтому действительно важно проверить любой сервер, который потенциально может содержать реплицированную виртуальную машину.

Самый простой способ проверить работоспособность репликации Hyper-V на всех ваших хостах — создать простой сценарий PowerShell. Вот как может выглядеть такой скрипт:

$Hosts = «Prod1», «Prod2»
ForEach ($Server в $Hosts)
{
$сервер
Invoke-Command -ComputerName $Server {Get-VMReplication}

Этот сценарий начинается с создания переменной с именем $Hosts, которая содержит имена хост-серверов Hyper-V. В этом случае мои хосты называются Prod1 и Prod2. Вы бы заменили свои собственные имена хостов.

Затем сервер устанавливает цикл, который будет проверять каждый сервер в отдельности. Цикл отображает имя хоста, а затем запускает командлет Get-VMReplication на хост-сервере. На рисунке ниже показан вывод скрипта.

Глядя на рисунок выше, вы можете видеть, что у моих реплик Hyper-V есть некоторые проблемы. Итак, давайте создадим код для исправления этих проблем с репликацией.

Для перезапуска процесса репликации используется командлет Resume-VMReplication. При использовании этого командлета вы должны указать имя виртуальной машины, для которой вы хотите возобновить процесс репликации. Таким образом, первое, что нам нужно сделать, это изменить код, чтобы получить имена отдельных виртуальных машин, у которых есть проблемы с репликацией. Вот как я это сделал:

$Hosts = «Prod1», «Prod2»
ForEach ($Server в $Hosts)
{
$сервер
Invoke-Command -ComputerName $Server {
$FailedReplicas = Get-VMReplication | Где{$_.Health -EQ «критический»}
ForEach ($VM в $FailedReplicas)
{
$ВМИмя = $ВМ.Имя
$VMName
}
}
}

Этот код аналогичен моему предыдущему сценарию, за исключением того, что он использует вложенный цикл для поиска виртуальных машин, чья работоспособность репликации Hyper-V находится в критическом состоянии. Оттуда имя виртуальной машины присваивается переменной с именем $VMName. Этот скрипт на самом деле не решает проблему. Вместо этого он просто выводит имя хоста и имена любых виртуальных машин на хосте, у которых возникли проблемы с репликацией. Следовательно, этот сценарий — не более чем тест, чтобы убедиться, что мы можем получить имена виртуальных машин, у которых есть проблемы. Например, на рисунке ниже видно, что скрипт определил проблемную виртуальную машину с именем Mirage на серверах с именами Prod1 и Prod 2.

Теперь, когда мы создали базовую структуру сценария, пришло время изменить сценарий, чтобы устранить любые обнаруженные проблемы работоспособности репликации Hyper-V. Для этого я добавлю одну строку кода. Строка:

Resume-VMReplication $VMName -Resynchronize

Вы заметите, что я добавил имя виртуальной машины и параметр Resynchronize к командлету Resume-VMReplication. Причина, по которой я использовал этот параметр, заключается в том, что без него командлет Resume-VMReplication предполагает, что вы хотите возобновить репликацию с приостановленного цикла. Итак, вот сценарий целиком:

$Hosts = «Prod1», «Prod2»
ForEach ($Server в $Hosts)
{
$сервер
Invoke-Command -ComputerName $Server {
$FailedReplicas = Get-VMReplication | Где{$_.Health -EQ «критический»}
ForEach ($VM в $FailedReplicas)
{
$ВМИмя = $ВМ.Имя
$VMName
Возобновить-VMReplication $VMName-Повторная синхронизация
}
}
}

На рисунке ниже показано, что произошло, когда я запустил этот скрипт в своей собственной системе. Как видите, копия Mirage (работающая виртуальная машина) на Prod1 теперь повторно синхронизируется. Однако я получил сообщение об ошибке, в котором говорилось, что операция не может быть выполнена на копии Prod2 (реплике) Mirage, поскольку виртуальная машина находится в неподдерживаемом состоянии.

Однако, если я переключусь на Prod2, на рисунке ниже вы увидите, что виртуальная машина Mirage выполняет повторную синхронизацию. Причина, по которой я получил сообщение об ошибке, заключалась в том, что при повторной синхронизации копии Mirage Prod1 реплика Prod2 также начала повторную синхронизацию. PowerShell не может принять запрос на повторную синхронизацию для виртуальной машины, которая уже находится в процессе повторной синхронизации, отсюда и ошибка.

Сценарий, который я создал в этой статье, удобен для поддержания работоспособности репликации Hyper-V. Вы можете дополнительно автоматизировать процесс, используя планировщик заданий Windows для автоматического ежедневного запуска сценария.