В процессе динамической миграции без общих ресурсов выполняется перенос виртуальной машины, включая ее хранилище, память и состояние устройства, между хостами 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