Guides Bulletproof Deployments #1 – Hyper-V

Teil 5 von 6

Teil 5: SAN Storage anbinden

Externes SAN Storage in einen Hyper-V Failover Cluster einbinden. iSCSI, Fibre Channel, SAS.

Externer SAN-Storage wird als Cluster Shared Volume (CSV) in den Cluster eingebunden. Mit Multipath I/O (MPIO) werden mehrere redundante Pfade zum Storage-System genutzt. Fällt ein Pfad aus, übernimmt automatisch ein anderer ohne Unterbrechung des Betriebs.


Multipath I/O (MPIO)

MPIO auf allen Nodes, egal ob iSCSI, Fibre Channel oder SAS. Ohne MPIO kein redundanter Pfad.

MPIO Feature installieren
Invoke-Command -ComputerName $servers -ScriptBlock {
Install-WindowsFeature -Name Multipath-IO
}

MPIO Policy konfigurieren

Die MPIO-Einstellungen werden auf das verwendete Storage-System abgestimmt. Die Werte im ANPASSEN-Block sind für Dell PowerStore optimiert. Bei anderen Herstellern bitte die Empfehlungen aus der jeweiligen Herstellerdokumentation verwenden.

MPIO Policy setzen (Beispiel: Dell PowerStore)
# ===================== ANPASSEN =====================
$PathVerificationPeriod = 30 # Sekunden zwischen Pfadprüfungen
$PDORemovePeriod = 20 # Sekunden bis ein ausgefallener Pfad entfernt wird
$RetryCount = 3 # Anzahl Wiederholungsversuche bei Pfadfehler
$RetryInterval = 3 # Sekunden zwischen Wiederholungsversuchen
$PathRecoveryInterval = 10 # Sekunden zwischen Pfad-Wiederherstellungsversuchen
$DiskTimeout = 30 # Sekunden bis Disk-Timeout
# =================== NICHT ANPASSEN =================
Invoke-Command -ComputerName $servers -ScriptBlock {
Set-MPIOSetting -NewPathVerificationState Enabled
Set-MPIOSetting -NewPathVerificationPeriod $using:PathVerificationPeriod
Set-MPIOSetting -NewPDORemovePeriod $using:PDORemovePeriod
Set-MPIOSetting -NewRetryCount $using:RetryCount
Set-MPIOSetting -NewRetryInterval $using:RetryInterval
Set-MPIOSetting -CustomPathRecovery Enabled
Set-MPIOSetting -NewPathRecoveryInterval $using:PathRecoveryInterval
Set-MPIOSetting -NewDiskTimeout $using:DiskTimeout
}

Nach der MPIO-Konfiguration ist ein Neustart aller Nodes erforderlich, damit die Einstellungen wirksam werden.

Nodes neu starten
Restart-Computer $servers -Protocol WSMan -Wait -For PowerShell -Force

Load Balancing konfigurieren

Round Robin als Load-Balancing-Policy: I/O wird gleichmäßig auf alle aktiven Pfade aufgeteilt. Auch hier bitte die Empfehlungen des Storage-Herstellers beachten.

Round Robin als Load-Balancing-Policy setzen
Invoke-Command -ComputerName $servers -ScriptBlock {
Set-MSDSMGlobalDefaultLoadBalancePolicy -Policy RR
}

iSCSI

iSCSI Netzwerkadapter konfigurieren

Die dedizierten iSCSI-Adapter werden für den Storage-Traffic optimiert: IPv6 deaktivieren, Jumbo Frames aktivieren und das jeweilige Storage-VLAN setzen. Für jeden Adapter wird ein separates VLAN genutzt, um die Pfade zu trennen.

Jumbo Frames erfordern konsistente Konfiguration

Jumbo Frames (MTU 9014) müssen auf allen Beteiligten identisch konfiguriert sein. Andernfalls kann es zu sporadischen Verbindungsabbrüchen und schwer diagnostizierbaren Performance-Problemen führen.

Prüfen und konfigurieren:

  • iSCSI-Adapter der Nodes (dieser Schritt)
  • Storage-Ports des SAN-Systems (Herstellerdokumentation)
  • Switch-Ports auf allen beteiligten Switches (MTU ≥ 9216 für Overhead)
iSCSI Adapter konfigurieren
# ===================== ANPASSEN =====================
$iSCSIAdapter1 = "NIC in Slot 4 Port 4-1" # Erster iSCSI-Adapter (Get-NetAdapter zur Ermittlung)
$iSCSIAdapter2 = "NIC in Slot 10 Port 4-1" # Zweiter iSCSI-Adapter
$iSCSIVLAN1 = "10" # VLAN für Adapter 1
$iSCSIVLAN2 = "11" # VLAN für Adapter 2
# =================== NICHT ANPASSEN =================
Invoke-Command -ComputerName $servers -ScriptBlock {
# IPv6 deaktivieren
Get-NetAdapter -Name $using:iSCSIAdapter1 | Disable-NetAdapterBinding -ComponentID "ms_tcpip6"
Get-NetAdapter -Name $using:iSCSIAdapter2 | Disable-NetAdapterBinding -ComponentID "ms_tcpip6"
# Jumbo Frames (9014 Byte)
Set-NetAdapterAdvancedProperty $using:iSCSIAdapter1 -RegistryKeyword "*JumboPacket" -RegistryValue 9014
Set-NetAdapterAdvancedProperty $using:iSCSIAdapter2 -RegistryKeyword "*JumboPacket" -RegistryValue 9014
# VLAN setzen
Set-NetAdapterAdvancedProperty $using:iSCSIAdapter1 -RegistryKeyword VlanID -RegistryValue $using:iSCSIVLAN1
Set-NetAdapterAdvancedProperty $using:iSCSIAdapter2 -RegistryKeyword VlanID -RegistryValue $using:iSCSIVLAN2
}

MSiSCSI Service aktivieren

Der MSiSCSI-Dienst muss auf allen Nodes aktiv und dauerhaft als automatisch startend konfiguriert sein. Anschließend wird MPIO für iSCSI aktiviert und alle verfügbaren Pfade automatisch beansprucht.

MSiSCSI Service aktivieren und MPIO für iSCSI konfigurieren
Invoke-Command -ComputerName $servers -ScriptBlock {
Start-Service -Name MSiSCSI
Set-Service -Name MSiSCSI -StartupType Automatic
# MPIO für iSCSI aktivieren
Enable-MSDSMAutomaticClaim -BusType iSCSI
# Alle verfügbaren Pfade beanspruchen
mpclaim.exe -r -i -a ""
}

iSCSI Initiator IQN ermitteln

Bevor Targets verbunden werden können, muss der IQN (Format: iqn.1991-05.com.microsoft:hostname) jedes Nodes im Storage-System registriert und dem Host zugewiesen werden.

Initiator IQN aller Nodes ausgeben
Invoke-Command -ComputerName $servers -ScriptBlock {
Get-InitiatorPort | Select-Object NodeAddress
} | Select-Object PSComputerName, NodeAddress | Sort-Object PSComputerName | Format-Table -AutoSize

iSCSI Targets verbinden

Alle iSCSI-Target-Portale des Storage-Systems werden auf allen Nodes registriert. Anschließend werden alle verfügbaren Targets persistend und mit Multipath verbunden.

iSCSI Targets verbinden
# ===================== ANPASSEN =====================
$iSCSITargets = "198.51.100.10","203.0.113.10","198.51.100.20","203.0.113.20" # IP-Adressen aller iSCSI-Portale
# =================== NICHT ANPASSEN =================
Invoke-Command -ComputerName $servers -ScriptBlock {
foreach ($Target in $using:iSCSITargets) {
New-IscsiTargetPortal -TargetPortalAddress $Target
}
Start-Sleep -Seconds 5
Get-IscsiTarget | Connect-IscsiTarget -IsPersistent $true -IsMultipathEnabled $true
}

Verbindung testen

Vor der Disk-Konfiguration sicherstellen, dass alle Nodes alle iSCSI-Portale auf Port 3260 erreichen. Alle Verbindungen müssen TcpTestSucceeded: True zeigen.

iSCSI Erreichbarkeit prüfen
$Results = Invoke-Command -ComputerName $servers -ScriptBlock {
foreach ($Target in $using:iSCSITargets) {
Test-NetConnection -ComputerName $Target -Port 3260
}
}
$Results |
Select-Object PSComputerName, ComputerName, RemotePort, TcpTestSucceeded |
Sort-Object PSComputerName, ComputerName |
Format-Table -AutoSize

Schlägt eine Verbindung fehl, Netzwerkrouting, VLAN-Konfiguration und das Storage-System prüfen.

Disks partitionieren und als CSV einbinden

Hinweis

Dieser Schritt wird nur auf einem einzigen Node ausgeführt. Der Failover Cluster stellt die Disks anschließend automatisch allen anderen Nodes bereit.

Alle vom Storage-System präsentierten LUNs werden initialisiert, mit NTFS formatiert und als Cluster Shared Volumes (CSVs) eingebunden.

Disks initialisieren und als CSV einbinden
# Nur auf einem Node ausführen
Get-Disk | Where-Object PartitionStyle -eq RAW | ForEach-Object {
Set-Disk -Number $_.Number -IsReadOnly $false
Initialize-Disk -Number $_.Number -PartitionStyle GPT
$partition = New-Partition -DiskNumber $_.Number -UseMaximumSize
Format-Volume -Partition $partition -FileSystem NTFS -Confirm:$false
}
# Alle verfügbaren Cluster-Disks als CSV einbinden
Get-ClusterAvailableDisk | Add-ClusterSharedVolume

Die CSVs sind anschließend auf allen Nodes unter C:\ClusterStorage\ verfügbar und bereit für die VM-Ablage.


Fibre Channel

In Arbeit

Dieser Abschnitt befindet sich noch in Bearbeitung und wird in Kürze ergänzt.


SAS (Serial Attached SCSI)

In Arbeit

Dieser Abschnitt befindet sich noch in Bearbeitung und wird in Kürze ergänzt.