Storage Spaces Direct (S2D) Migration auf neuen Cluster

Aus MyWiki
Version vom 10. Oktober 2025, 14:31 Uhr von Rueling (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „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"…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

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
  }