Failover Cluster (миграция с Windows Server 2012 R2 в Windows Server 2016 Cluster)

Исходные данные:
1) "сервер" H-1.Hyper-v.test
Intel NUC 7i5BNK (Intel Core i5-7260U, 8 GB RAM, Crutial M.2 SSD 256 GB)
Windows Server 2012 R2 с ролью Hyper-V и несколькими виртуальными машинами.
10.254.1.73
2) "сервер" H-N-2.Hyper-v.test
Intel NUC 6i3SYK (Intel Core i3-6100U, 8 GB RAM, Crutial M.2 SSD 256 GB)
Windows Server 2016 с ролью Hyper-V
10.254.1.55
3) "сервер" H-N-3.Hyper-v.test
Intel NUC 6i5SYK (Intel Core i5-6260U, 8 GB RAM, Crutial M.2 SSD 256 GB)
Windows Server 2016 с ролью Hyper-V
10.254.1.55
4) сервер iscsi2.Hyper-V.test
виртуальная машина (Intel Core i7-6700, 4 GB RAM, 128 GB VHDX)
Debian9.4 x64
10.254.1.97
iSCSI-цель настраивается с помощью tgtadm. Общий пример настройки. В данной статье будут написаны точные команды для нашей задачи.

Задача: переместить виртуальные машины с Windows 2012 R2 в Кластер на Windows Server 2016 с общим сетевым хранилищем.

Решение:
1) Установка Failover Cluster на серверах Windows Server 2016:

Add-WindowsFeature –Name Failover-clustering –IncludeManagementTools

2) Создание общей папки на сервере Debian 9.4 для диска-свидетеля (папка для всех, без ограничения по размеру, что небезопасно):

aptitude install samba
echo "[public]" >> /etc/samba/smb.conf
echo "path = /media/storage/" >> /etc/samba/smb.conf
echo "public = yes" >> /etc/samba/smb.conf
echo "writable = yes" >> /etc/samba/smb.conf
echo "comment = smb share" >> /etc/samba/smb.conf
echo "printable = no" >> /etc/samba/smb.conf
echo "guest ok = yes" >> /etc/samba/smb.conf
mkdir /media/storage/
/etc/init.d/samba restart

3) Создание кластера. Для данного тестового кластера будет использоваться только одна сеть, поэтому MPIO не будет использоваться.

Test-Cluster -Node h-n-2, h-n-3
New-Cluster -Name CLST1 -node h-n-2, h-n-3 -StaticAddress 10.254.1.249
Set-ClusterQuorum -FileShareWitness \\10.254.1.97\public

4) Создание и подключение общего сетевого хранилища к обоим нодам кластера и инициализация диска:

 В Linux:

dd if=/dev/zero of=/iscsi/iscsi-disk1 bs=1M count=32000
tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2018-04.csv.domain.com
tgtadm --lld iscsi --mode logicalunit --op new --tid 1 --lun 1 -b /iscsi/iscsi-disk1
tgtadm --lld iscsi --mode target --op bind --tid 1 -I 10.254.1.82
tgtadm --lld iscsi --mode target --op bind --tid 1 -I 10.254.1.55
tgtadm --lld iscsi --mode target --op bind --tid 1 -I 10.254.1.249
tgtadm --lld iscsi --mode target --op show
Target 1: iqn.2018-04.csv.domain.com
    System information:
        Driver: iscsi
        State: ready
    I_T nexus information:
    LUN information:
        LUN: 0
            Type: controller
            SCSI ID: IET     00010000
            SCSI SN: beaf10
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            SWP: No
            Thin-provisioning: No
            Backing store type: null
            Backing store path: None
            Backing store flags:
        LUN: 1
            Type: disk
            SCSI ID: IET     00010001
            SCSI SN: beaf11
            Size: 33554 MB, Block size: 512
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            SWP: No
            Thin-provisioning: No
            Backing store type: rdwr
            Backing store path: /iscsi/iscsi-disk1
            Backing store flags:
    Account information:
    ACL information:
        10.254.1.82
        10.254.1.55
        10.254.1.249

 В Windows Server:

New-IscsiTargetPortal -TargetPortalAddress "10.254.1.97"
Get-IscsiTarget -NodeAddress iqn.2018-04.csv.domain.com | Connect-IscsiTarget -IsPersistent $true
get-disk | where {$_.OperationalStatus -eq "Offline"} | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -UseMaximumSize | Format-Volume -FileSystem NTFS -NewFileSystemLabel "csv" -Confirm:$false

 Для второй ноды. Можно запускать всю команду с первой ноды или только команду в фигурных скобках { } непосредественно на второй ноде:

Invoke-Command -Computername h-n-3 -ScriptBlock {New-IscsiTargetPortal -TargetPortalAddress "10.254.1.97"}
Invoke-Command -Computername h-n-3 -ScriptBlock {Get-IscsiTarget -NodeAddress iqn.2018-04.csv.domain.com | Connect-IscsiTarget -IsPersistent $true}
Invoke-Command -Computername h-n-3 -ScriptBlock {get-disk | where {$_.BusType -eq "iSCSI"} | Set-Disk -IsOffline $False}

5) Подключение общего ресурса к кластеру:

Get-ClusterAvailableDisk | Add-ClusterDisk | Add-ClusterSharedVolume

6) Подготовка Нyper-V ролей на нодах на использование подключённого общего сетевого хранилища:

Set-VMHost -VirtualHardDiskPath "C:\ClusterStorage\Volume1\Hyper-V\Virtual Hard Disks\" -VirtualMachinePath "C:\ClusterStorage\Volume1\Hyper-V\"
Invoke-Command -Computername h-n-3 -ScriptBlock {Set-VMHost -VirtualHardDiskPath "C:\ClusterStorage\Volume1\Hyper-V\Virtual Hard Disks\" -VirtualMachinePath "C:\ClusterStorage\Volume1\Hyper-V\"}

7) Включение совместимости процессоров в виртуальной машине, но у меня виртуальная машина переместилась и без включённой совместимости процессоров.

get-vm -name test_2016 | Set-VMProcessor -CompatibilityForMigrationEnabled 1

8) Перемещение виртаульной машины на одну из нод кластера (имена виртуальных свитчей должны совпадать при переносе через PowerShell)

Move-VM "test_2016" h-n-2 -IncludeStorage -DestinationStoragePath "C:\ClusterStorage\Volume1\Hyper-V\Virtual Hard Disks\"

9) Добавление виртуальной машины в кластер:

Add-ClusterVirtualMachineRole -VirtualMachine test_2016

10) Тестирование отказоустойчивости:

Move-ClusterVirtualMachineRole -Name "test_2016" -Node h-n-3

 Или просто выключаем первую ноду и смотрим поведение кластера.

19.04.2018