Storage Spaces Direct (S2D) Migration auf neuen Cluster
Hier wird die Einrichtung bzw. Migration eines Storage Spaces Direct (S2D) Clusters beschrieben
Einrichtung Windows Server
Install-WindowsFeature -Name "Hyper-V", "Failover-Clustering", "Data-Center-Bridging", "RSAT-Clustering-PowerShell", "Hyper-V-PowerShell", "FS-FileServer","Hyper-V-Tools","RSAT-Clustering-Mgmt"
Test-Cluster -Node server-s2d-p1, server-s2d-p2, server-s2d-p3, server-s2d-p4 -Include "Storage Spaces Direct","inventory","Network","System Configuration"
New-VMSwitch -Name VMNetwork -AllowManagementOS $false -NetAdapterName "VMNetwork1","VMNetwork2" -EnableEmbeddedTeaming $true
- Auf SWITCH-S2D-P1 und P2 auf den jeweiligen Ports MTU auf 9000 setzen und den Port korrekt benennen
- VLAN konfigurieren
SMB1 Interface als Management und als Cluster SMB verwenden. Das wird erreicht, in den es als virtueller Switch konfiguriert wird und noch ein MGMT Adapter hinzugefügt wird
New-VMSwitch -Name SMB1 -AllowManagementOS $true -NetAdapterName "SMB1" Add-VMNetworkAdapter –ManagementOS –Name "MGMT" –SwitchName "SMB1"
Enable-NetAdapterRdma -Name "vEthernet (SMB1)" Enable-NetAdapterRdma -Name SMB2
Set-NetQosDcbxSetting -Willing 0 -Confirm:$false New-NetQosPolicy "SMBDirect" -NetDirectPortMatchCondition 445 -PriorityValue8021Action 3 Enable-NetQosFlowControl -Priority 3
Set-NetAdapterAdvancedProperty -Name "SMB2" -RegistryKeyword "*JumboPacket" -RegistryValue 9014 Set-NetAdapterAdvancedProperty -Name "SMB2" -RegistryKeyword "*FlowControl" -RegistryValue 3 # = RoCEv1 Set-NetAdapterAdvancedProperty -Name "SMB2" -RegistryKeyword "VlanID" -RegistryValue 72 Set-NetAdapterAdvancedProperty -Name "SMB2" -RegistryKeyword "*NetworkDirectTechnology" -RegistryValue 3
Set-NetAdapterAdvancedProperty -Name "vEthernet (SMB1)" -RegistryKeyword "*JumboPacket" -RegistryValue 9014 Set-NetAdapterAdvancedProperty -Name "vEthernet (SMB1)" -RegistryKeyword "*NetworkDirect" -RegistryValue 1 Set-NetAdapterAdvancedProperty -Name "SMB1" -RegistryKeyword "*JumboPacket" -RegistryValue 9014 Set-NetAdapterAdvancedProperty -Name "SMB1" -RegistryKeyword "*FlowControl" -RegistryValue 3 # = RoCEv1 Set-NetAdapterAdvancedProperty -Name "SMB1" -RegistryKeyword "*NetworkDirectTechnology" -RegistryValue 3
Set-VMNetworkAdapterVlan -ManagementOS -VlanId 11 -VMNetworkAdapterName SMB1 -Access
New-NetIPAddress -InterfaceIndex (Get-NetAdapter -Name "vEthernet (SMB1)").ifIndex -IPAddress 192.168.11.90 -AddressFamily IPv4 -PrefixLength 24 New-NetIPAddress -InterfaceIndex (Get-NetAdapter -Name "SMB2").ifIndex -IPAddress 192.168.12.90 -AddressFamily IPv4 -PrefixLength 24
New-Cluster -Name cluster-s2d-p3 -Node server-s2d-p5, server-s2d-p6, server-s2d-p7, server-s2d-p8 -NoStorage -StaticAddress 192.168.100.129
- Witness zum Witness Fileserver verbinden
Enable-ClusterStorageSpacesDirect -CacheState Disabled -PoolFriendlyName "FMB-NVME-Pool" -CollectPerformanceHistory $true
New-ClusterFaultDomain -Name "Rack 1" -FaultDomainType Rack New-ClusterFaultDomain -Name "Rack 2" -FaultDomainType Rack Set-ClusterFaultDomain -Name "server-s2d-p5" -FaultDomain "Rack 1" Set-ClusterFaultDomain -Name "server-s2d-p6" -FaultDomain "Rack 1" Set-ClusterFaultDomain -Name "server-s2d-p7" -FaultDomain "Rack 2" Set-ClusterFaultDomain -Name "server-s2d-p8" -FaultDomain "Rack 2"
Replica:
New-Volume -FriendlyName SRLogs -FileSystem ReFS -Size 150GB -ResiliencySettingName Mirror -NumberOfDataCopies 3 -AccessPath L:\
!!! Achtung: Die Volumes inkl. Log Volume müssen identisch sein. Selbe Größe, selbe Mirror (2-way oder 3-way) usw. Hinweis: mit >>>Move-ClusterGroup -Name "Available Storage" -Node "SERVER-S2D-P5"<<< kann man den Knoten festlegen auf dem neue Volumes erstellt werden
Move-ClusterGroup -Name "Available Storage" -Node "SERVER-S2D-P1" Move-ClusterGroup -Name "Available Storage" -Node "SERVER-S2D-P5"
Grant-SRAccess -ComputerName server-s2d-p1 -Cluster cluster-s2d-p2 Grant-SRAccess -ComputerName server-s2d-p5 -Cluster cluster-s2d-p1
Prüfen mit:
Get-SRAccess --> auf beiden Clustern
Test-SRTopology -SourceComputerName server-s2d-p1 -SourceVolumeName C:\ClusterStorage\VM1 -SourceLogVolumeName L: -DestinationComputerName server-s2d-p5 -DestinationVolumeName C:\ClusterStorage\VM1 -DestinationLogVolumeName L: -ResultPath C:\Temp\ -DurationInMinutes 5
==> Hinweis: Volume VM1 und das Volume L: müssen auf dem gleichen Knoten liegen. Der Befehl muss auch von dem Knoten ausgeführt werden und als Source muss dieser Knoten angegeben werden. Das gleiche gilt für das Ziel. Auch da müssen Volume VM1 und L: auf dem selben Knoten liegen der als Ziel angegeben wird
New-SRGroup -ComputerName cluster-s2d-p1.fm.db.de -Name "SRGroupA" -VolumeName "C:\ClusterStorage\VM1" -LogVolumeName "L:\" New-SRGroup -ComputerName cluster-s2d-p2.fm.db.de -Name "SRGroupB" -VolumeName "C:\ClusterStorage\VM1" -LogVolumeName "L:\"
New-SRPartnership ` -SourceComputerName cluster-s2d-p1.fm.db.de ` -SourceRGName "SRGroupA" ` -DestinationComputerName cluster-s2d-p2.fm.db.de ` -DestinationRGName "SRGroupB" ` -ReplicationMode Synchronous
Replikation umdrehen:
Set-SRPartnership -NewSourceComputerName cluster-s2d-p2-SourceRGName SRGroupB -DestinationComputerName cluster-s2d-p1 -DestinationRGName SRGroupA
Volume hinzufügen:
Invoke-CimMethod -Namespace 'root/Microsoft/Windows/StorageReplica' `
-ClassName 'MSFT_WvrAdminTasks' `
-MethodName 'SetPartnershipAddVolumes' `
-Arguments @{
SourceComputerName = "cluster-s2d-p1"
SourceRGName = "SRGroupA"
DestinationComputerName = "cluster-s2d-p2"
DestinationRGName = "SRGroupB"
SourceAddVolumePartnership = @("C:\ClusterStorage\Mirror")
DestinationAddVolumePartnership = $asd
}
Wenn es Probleme gibt, hilft ggf. folgendes
- Ziel Offline nehmen
- Clear-SRMetadata -ComputerName cluster-s2d-p2.fm.db.de -AllPartitions -AllLogs -Force
- Clear-SRMetadata -ComputerName cluster-s2d-p1.fm.db.de -AllPartitions -AllLogs -Force
- Restart-Service -Name StorageReplica (auf allen Knoten)
- Danach SRGroup und Partnership neu erstellen
Partitionen für Storage Replica erstellen:
# Sammelt die Virtual Disk bzw. StoargeTier Größen ein
$storageTable = @()
Get-VirtualDisk | % {
$Mirror=0
$Parity=0
$Name=$_.FriendlyName
if ($_.ResiliencySettingName -eq "Mirror") {
$Mirror=$_.Size
} else {
$tiers = $_ | Get-StorageTier
foreach ($tier in $tiers) {
if ($tier.TierClass -eq "Capacity") {$Parity = $tier.size}
if ($tier.TierClass -eq "Performance") {$Mirror = $tier.size}
}
}
$object = [pscustomobject]@{Name = $name;Mirror = $Mirror;Parity=$Parity}
$storageTable += $object
}
erstellt die Virtual Disks auf dem Ziel Cluster mit 10GB weniger Speicherplatz. Grund ist, dass bei der Erstellung nicht die komplette Größe der Virtual Disk verwendet wird, sondern ein paar MB/GB weniger. Das erweitern um 1GB funktioniert (mit Powershell?) nicht sauber, daher ziehe ich 10GB ab und mach danach ein Resize auf die volle Größe. Das muss bei Mirror und bei Mirror Accelerated gemacht werden
$table = Import-Csv C:\Temp\StorageTable.csv -Delimiter ";"
foreach ($disk in $table) {
if ($disk.Parity -eq 0) {
New-Volume -StoragePoolFriendlyName "FMB-S2D-Pool" -FriendlyName $disk.Name -Size $($disk.Mirror - 10GB) -FileSystem CSVFS_ReFS -ResiliencySettingName Mirror -NumberOfDataCopies 3
Get-VirtualDisk $disk.Name |Resize-VirtualDisk -Size $disk.Mirror
} else {
New-Volume -FriendlyName $disk.Name -FileSystem CSVFS_ReFS -StoragePoolFriendlyName "FMB-S2D-Pool" -StorageTierFriendlyNames MirrorOnSSD, ParityOnSSD -StorageTierSizes $disk.Mirror, $($disk.Parity - 10GB)
Get-StorageTier "$($disk.Name)-ParityOnSSD" | Resize-StorageTier -Size $disk.Parity
}
$partition = Get-VirtualDisk $disk.name | Get-Disk | Get-Partition | where PartitionNumber -eq 2
Start-Sleep -Seconds 2
$partition | Resize-Partition -Size ($partition | Get-PartitionSupportedSize).SizeMax
}