В процессе динамической миграции без общих ресурсов выполняется перенос виртуальной машины, включая ее хранилище, память и состояние устройства, между хостами Hyper-V без прерывания обслуживания. Однако вы не можете использовать динамическую миграцию без общих ресурсов для осуществления миграции между кластерами напрямую. Вместо этого нужно сделать следующее:
- Удалите виртуальную машину как кластерный ресурс.
- Используйте динамическую миграцию без общих ресурсов для перемещения виртуальной машины на узел в новом кластере в кластерном хранилище.
- Добавьте виртуальную машину в качестве кластерного ресурса на целевой кластер.
При выполнении этих действий нет времени простоя, потому что виртуальная машина может быть добавлена в кластеры и удалена из них без задержек. Я написал сценарий, который использует базовый набор действий для выполнения операций, о которых шла речь, а именно:
- Запрашивает учетные данные, которые будут использоваться на удаленном кластере.
- Запрашивает имя узла удаленного кластера, на который вы хотите переместить виртуальную машину.
- Активирует делегирование CredSSP на выбранный узел (необходимо активировать протокол CredSSP на удаленном сервере, используя команду Enable-WSManCredSSP Server до начала работы).
- Запускает цикл, в котором запрашивает имя намеченной к перемещению виртуальной машины, а затем:
- находит кластерную группу, которая владеет виртуальной машиной, и выводит ресурсы кластера этой виртуальной машины;
- если виртуальная машина не запущена на текущем узле, она динамически перемещается в текущий узел (что упрощает процесс);
- виртуальная машина удаляется из кластера;
- происходит остановка виртуальной машины; это необходимо, если процессоры в исходном и целевом кластерах не соответствуют друг другу (например, Intel против AMD или разные версии процессоров Intel или AMD, а режим совместимости процессоров не активирован);
- виртуальная машина перемещается на целевой узел при помощи динамической миграции без общих ресурсов;
- виртуальная машина формирует кластерный ресурс на целевом кластере;
- запрашивается имя следующей виртуальной машины, или производится нажатие клавиши Q для выхода, и все предыдущие шаги последовательно повторяются для следующей виртуальной машины.
Полный сценарий представлен ниже. Имейте в виду, что вам нужно запускать сценарий на узле в исходном кластере. Кроме того, вы, возможно, захотите изменить место хранения виртуальной машины в целевом кластере с C:\ClusterStorage\Volume1, который жестко закодирован в сценарий, на другое. Также убедитесь, что на хосте, запускающем сценарий, установлены модули Hyper-V Module for Windows PowerShell и Failover Cluster Module for Windows PowerShell. Данный сценарий не выполняет проверок на ошибки; это базовый набор, так что если вы захотите использовать его, вам, вероятно, следует добавить такую проверку.
#Migrates virtual machines between clusters
#Copyright 2014 John Savill
#
#Assumes virtual switch with same name exists on target
#
#Need to enable CredSSP to solve the double-hop problem associated with cluster commands
#http://blogs.msdn.com/b/clustering/archive/2009/06/25/9803001.aspx documents the double-hop problem related to clustering remote commands
#On the target server must have run Enable-WSManCredSSP Server
#Lets get started
Write-Host 'Please enter credential to be used for remote cluster execution'
$CustomCred = Get-Credential #Get credentials to use with CredSSP on the remote cluster
Write-Host 'Ensure the target Server has been configured to accept CredSSP by running command Enable-ESManCredSSP Server on the server'
$DestinationHost = Read-Host 'Enter the target host that will be used for all migrations >'
Enable-WSManCredSSP Client -DelegateComputer $DestinationHost –Force
$VMName = Read-Host 'Enter VM name to move >'
while ($VMName -ne 'Q')
{
#Show the cluster resources. Cannot use the $VMName as the cluster group as may not match, for example SCVMM names the cluster group differently
#Get-ClusterGroup -Name $VMName | Get-ClusterResource
$ClusterGroups = Get-ClusterGroup |? {($_.GroupType -eq 'VirtualMachine') -and ($_.State -eq 'Online')}
foreach ($ClusterGroup in $ClusterGroups)
{
$TempVM = $ClusterGroup | Get-VM
if ($TempVM.Name.ToUpper() -eq $VMName.ToUpper())
{
$FinalClusterGroup = $ClusterGroup
}
}
$FinalClusterGroup | Get-ClusterResource
$ClusterGroupName = $FinalClusterGroup.Name
#Store the host the VM is currently active on if wanted to take the approach of NOT moving it to local node but means requires Constrained Delegation configured
$NodeName = Get-ClusterGroup -Name $ClusterGroupName | Get-ClusterResource | Where-Object {$_.ResourceType -eq «Virtual Machine»} | Select-Object OwnerNode
$CurrentNodeName = $NodeName.OwnerNode.Name
#View the VM
Get-VM -Name $VMName -ComputerName $CurrentNodeName
#Move the VM to the current host
$LocalNodeName = $env:COMPUTERNAME
if ($CurrentNodeName.ToUpper() -ne $LocalNodeName.ToUpper())
{
Write-Host 'Moving VM from '$CurrentNodeName' to current node'
Move-ClusterVirtualMachineRole -Name $ClusterGroupName -Node $LocalNodeName -MigrationType Live
}
#Remove the cluster resources and group which does not stop or remove the actual VM on the host
Write-Host 'Removing cluster group for VM'
Remove-ClusterGroup -Name $ClusterGroupName -RemoveResources –Force
#Sleep to avoid lock from removing cluster resources (not typically required)
Start-Sleep -Seconds 10
#Have to shutdown as different processor type (Intel to AMD in my case but normally would not need to stop the VM) or if different versions
#and processor compatibility not enabled
Stop-Vm -Name $VMName #This will wait until the VM has stopped
Start-Sleep -Seconds 10
#Now migrate it from this node so don't need -ComputerName $LocalNodeName
Write-Host 'Moving VM to target node'
Move-VM -Name $VMName -DestinationHost $DestinationHost -DestinationStoragePath C:\ClusterStorage\Volume1\$VMName
$ScriptBlockContent = {
param ($VMName)
Add-ClusterVirtualMachineRole -VirtualMachine $VMName -Name $VMName }
#Now add as resource on the target cluster
Write-Host 'Making VM a cluster object on target'
Invoke-Command -ComputerName $DestinationHost -ScriptBlock $ScriptBlockContent -ArgumentList $VMName -Authentication Credssp -Credential $CustomCred
#Could automatically start the VM here if you wanted but I don't in this example
#Get next name
$VMName = Read-Host 'Enter VM name to move (Q to quit)>'
$VMName = $VMName.ToString()
}
А вот пример выполнения перемещения одной VM:
PS C:\>. \MigrateBetweenClusters.ps1 cfg : http://schemas.microsoft.com/wbem/wsman/1/config/client/auth lang : en-US Basic : true Digest : true Kerberos : true Negotiate : true Certificate: true CredSSP : true Please enter credential to be used for remote cluster execution Ensure the target Server has been configured to accept CredSSP by running command Enable-ESManCredSSP Server on the server Enter the target host that will be used for all migrations >: savaushv10 Enter VM name to move >: Test — DC01 Name : SCVMM DC01 (1) State : Online OwnerGroup : SCVMM DC01 Resources (1) ResourceType: Virtual Machine Name : SCVMM DC01 Configuration (1) State : Online OwnerGroup : SCVMM DC01 Resources (1) ResourceType: Virtual Machine Configuration Name : Test — DC01 State : Running CpuUsage : 0 MemoryAssigned : 883949568 MemoryDemand : 724566016 MemoryStatus : OK Uptime : 81.20:38:09 Status : Operating normally ReplicationState: Disabled Moving VM from savdalhv11 to current node Name : SCVMM DC01 Resources (1) OwnerNode: savdalhv10 State : Online Removing cluster group for VM Moving VM to target node Making VM a cluster object on target Name : Test — DC01 OwnerNode : savaushv10 State : Offline PSComputerName: savaushv10 Enter VM name to move (Q to quit)>: Q