Begrenzen der Zuordnung von Volumes in Direkte Speicherplätze

Mit Windows Server 2019 wird eine Option zum manuellen Begrenzen der Zuordnung von Volumes in Direkte Speicherplätze eingeführt. Dies kann die Fehlertoleranz unter bestimmten Bedingungen erheblich erhöhen, bringt jedoch einige zusätzliche Verwaltungsüberlegungen und Komplexität mit sich. In diesem Thema wird erläutert, wie dies funktioniert, und es werden Beispiele in PowerShell gezeigt.

Wichtig

Dieses Feature ist neu in Windows Server 2019. Es ist in Windows Server 2016 nicht verfügbar.

Voraussetzungen

Grünes Häkchensymbol Erwägen Sie, diese Option zu verwenden, wenn:

Rotes X-Symbol Verwenden Sie diese Option nicht, wenn:

Grundlegende Informationen

Überprüfen: reguläre Zuordnung

Bei der regulären Drei-Wege-Spiegelung wird das Volume in viele kleine Bereiche unterteilt, die dreimal kopiert und gleichmäßig auf jedes Laufwerk auf jedem Server im Cluster verteilt werden. Weitere Informationen finden Sie in diesem Blog mit ausführlicheren Informationen.

Diagramm, das zeigt, wie das Volume in drei Stapel von Bereichen unterteilt und gleichmäßig auf alle Server verteilt wird.

Diese Standardzuordnung maximiert parallele Lese- und Schreibvorgänge, was zu einer besseren Leistung führt, und besticht mit ihrer Einfachheit: Jeder Server ist gleichermaßen ausgelastet, jedes Laufwerk ist gleichermaßen voll, und alle Volumes bleiben gleichzeitig online oder werden zusammen offline geschaltet. Jedes Volume übersteht garantiert bis zu zwei gleichzeitige Fehler, wie in diesen Beispielen veranschaulicht.

Bei dieser Zuordnung können Volumes jedoch drei gleichzeitige Fehler nicht überstehen. Wenn gleichzeitig drei Server oder Laufwerke auf drei Servern ausfallen, kann auf Volumes nicht mehr zugegriffen werden, da mindestens einige Bereiche (mit sehr hoher Wahrscheinlichkeit) genau diesen drei Laufwerken oder Servern zugeordnet wurden, die ausgefallen sind.

Im folgenden Beispiel treten gleichzeitig auf den Servern 1, 3 und 5 Fehler auf. Obwohl viele Bereiche noch über bestehende Kopien verfügen, trifft dies für einige nicht zu:

Diagramm, auf dem drei von sechs Servern rot hervorgehoben sind und das gesamte Volume rot dargestellt ist.

Das Volume wird offline geschaltet und ist nicht mehr verfügbar, bis die Server wiederhergestellt sind.

Neu: begrenzte Zuordnung

Mit einer begrenzte n Zuordnung geben Sie eine Teilmenge der zu verwendende Server an (mindestens vier). Das Volume wird in Bereiche unterteilt, die wie zuvor dreimal kopiert werden, aber anstatt sie auf alle Server zu verteilen, werden die Bereiche nur der angegebenen Teilmenge von Servern zugeordnet.

Wenn Sie beispielsweise über einen Cluster mit 8 Knoten (Knoten 1 bis 8) verfügen, können Sie angeben, dass ein Volume sich nur auf Datenträgern auf den Knoten 1, 2, 3, 4 befinden soll.

Vorteile

Bei der Beispielzuordnung übersteht das Volume wahrscheinlich drei gleichzeitige Fehler. Wenn die Knoten 1, 2 und 6 ausfallen werden, sind nur zwei der Knoten, die die drei Kopien der Daten für das Volume enthalten, nicht mehr verfügbar, und das Volume bleibt online.

Die Wahrscheinlichkeit des Fortbestehens hängt von der Anzahl der Server und anderen Faktoren ab. Weitere Informationen finden Sie unter Analyse.

Nachteile

Die begrenzte Zuordnung macht einige zusätzliche Überlegungen zur Verwaltung und Komplexität erforderlich:

  1. Der Administrator ist dafür verantwortlich, die Zuordnung jedes Volumes zu begrenzen, um die Speicherauslastung serverübergreifend auszugleichen und eine hohe Wahrscheinlichkeit des Fortbestehens zu erreichen, wie im Abschnitt Bewährte Methoden beschrieben.

  2. Reservieren Sie bei begrenzter Zuordnung die Entsprechung von einem Kapazitätslaufwerk pro Server (ohne Höchstgrenze) . Dies ist mehr als die veröffentlichte Empfehlung für die reguläre Zuordnung, die auf maximal vier Kapazitätslaufwerke insgesamt begrenzt ist.

  3. Wenn ein Server ausfällt und ersetzt werden muss, wie unter Entfernen eines Servers und seiner Laufwerke beschrieben, ist der Administrator dafür verantwortlich, die Begrenzung der betroffenen Volumes zu aktualisieren, indem er den neuen Server hinzufügt und den fehlerhaften entfernt. Beispiel weiter unten.

Verwendung in PowerShell

Sie können das Cmdlet New-Volume verwenden, um Volumes in Direkte Speicherplätze zu erstellen.

So erstellen Sie z. B. ein reguläres Drei-Wege-Spiegelungsvolume:

New-Volume -FriendlyName "MyRegularVolume" -Size 100GB

Erstellen eines Volumes und Begrenzen der Zuordnung

So erstellen Sie ein Drei-Wege-Spiegelungsvolume und begrenzen dessen Zuordnung

  1. Weisen Sie zunächst die Server in Ihrem Cluster der Variablen $Servers zu:

    $Servers = Get-StorageFaultDomain -Type StorageScaleUnit | Sort FriendlyName
    

    Tipp

    In Direkte Speicherplätze bezieht sich der Begriff „Speicherskalierungseinheit“ auf den gesamten an einen Server angefügten Rohspeicher, einschließlich direkt angeschlossener Laufwerke und direkt angeschlossener externer Gehäuse mit Laufwerken. In diesem Zusammenhang ist es dasselbe wie „Server“.

  2. Geben Sie an, welche Server mit dem neuen -StorageFaultDomainsToUse-Parameter und durch Indizierung in $Servers verwendet werden. Um die Zuordnung beispielsweise auf den ersten, zweiten, dritten und vierten Server (Indizes 0, 1, 2 und 3) zu begrenzen:

    New-Volume -FriendlyName "MyVolume" -Size 100GB -StorageFaultDomainsToUse $Servers[0,1,2,3]
    

Anzeigen einer begrenzten Zuordnung

Um anzuzeigen, wie MyVolume zugeordnet wird, verwenden Sie das Skript Get-VirtualDiskFootprintBySSU.ps1 im Anhang:

PS C:\> .\Get-VirtualDiskFootprintBySSU.ps1

VirtualDiskFriendlyName TotalFootprint Server1 Server2 Server3 Server4 Server5 Server6
----------------------- -------------- ------- ------- ------- ------- ------- -------
MyVolume                300 GB         100 GB  100 GB  100 GB  100 GB  0       0

Beachten Sie, dass sich die Bereiche von MyVolume nur auf Server1, Server2, Server3 und Server4 befinden.

Ändern einer begrenzten Zuordnung

Verwenden Sie die neuen Cmdlets Add-StorageFaultDomain und Remove-StorageFaultDomain, um die begrenzte Zuordnung zu ändern.

So verschieben Sie z. B. MyVolume um einen Server:

  1. Geben Sie an, dass der fünfte Server Bereiche von MyVolume speichern kann:

    Get-VirtualDisk MyVolume | Add-StorageFaultDomain -StorageFaultDomains $Servers[4]
    
  2. Geben Sie an, dass der erste Server keine Bereiche von MyVolume speichern kann:

    Get-VirtualDisk MyVolume | Remove-StorageFaultDomain -StorageFaultDomains $Servers[0]
    
  3. Gleichen Sie den Speicherpool neu aus, damit die Änderung wirksam wird:

    Get-StoragePool S2D* | Optimize-StoragePool
    

Sie können den Fortschritt des Neuausgleichs mit Get-StorageJob überwachen.

Überprüfen Sie nach Abschluss des Vorgangs, ob MyVolume verschoben wurde, indem Sie Get-VirtualDiskFootprintBySSU.ps1 erneut ausführen.

PS C:\> .\Get-VirtualDiskFootprintBySSU.ps1

VirtualDiskFriendlyName TotalFootprint Server1 Server2 Server3 Server4 Server5 Server6
----------------------- -------------- ------- ------- ------- ------- ------- -------
MyVolume                300 GB         0       100 GB  100 GB  100 GB  100 GB  0

Beachten Sie, dass Server1 keine Bereiche von MyVolume mehr enthält, sondern Server5.

Bewährte Methoden

Hier finden Sie die bewährten Methoden für die Verwendung der begrenzten Volumezuordnung:

Auswählen von vier Servern

Begrenzen Sie jedes Drei-Wege-Spiegelungsvolume auf vier Server, nicht auf mehr.

Ausgewogene Speicherverteilung

Wägen Sie ab, wie viel Speicher den einzelnen Servern zugeordnet ist. Berücksichtigen Sie dabei die Volumegröße.

Staffeln von begrenzten Zuordnungsvolumes

Um die Fehlertoleranz zu maximieren, machen Sie die Zuordnung jedes Volumes eindeutig. Das bedeutet, dass nicht alle Server mit einem anderen Volume geteilt werden (eine Überschneidung ist in Ordnung).

Beispiel für ein System mit acht Knoten: Volume 1: Server 1, 2, 3, 4. Volume 2: Server 5, 6, 7, 8. Volume 3: Server 3, 4, 5, 6. Volume 4: Server 1, 2, 7, 8.

Analyse

Dieser Abschnitt leitet die mathematische Wahrscheinlichkeit, dass ein Volume online und verfügbar bleibt (oder gleichbedeutend der erwartete Anteil des gesamten Speichers, der online und verfügbar bleibt), als Funktion der Anzahl der Fehler und der Clustergröße ab.

Hinweis

Dieser Abschnitt ist optional. Wenn Sie die mathematischen Berechnungen sehen möchten, lesen Sie weiter. Falls nicht, machen Sie sich keine Sorgen: Verwendung in PowerShell und Bewährte Methoden ist alles, was Sie benötigen, um die begrenzte Zuordnung erfolgreich zu implementieren.

Bis zu zwei Fehler sind immer in Ordnung.

Jedes Drei-Wege-Spiegelungsvolume kann unabhängig von seiner Zuordnung bis zu zwei Fehler gleichzeitig überstehen. Wenn zwei Laufwerke ausfallen oder zwei Server ausfallen oder jeweils einer davon, bleibt jedes Drei-Wege-Spiegelungsvolume online und verfügbar, selbst bei regelmäßiger Zuordnung.

Ein Ausfall von mehr als der Hälfte der Cluster ist nie in Ordnung.

Umgekehrt geht im Extremfall, dass mehr als die Hälfte der Server oder Laufwerke im Cluster gleichzeitig ausfällt, das Quorum verloren: Jedes Drei-Wege-Spiegelungsvolume wird offline geschaltet und ist nicht mehr verfügbar, und zwar unabhängig von seiner Zuordnung.

Und dazwischen?

Wenn drei oder mehr Fehler gleichzeitig auftreten, aber mindestens die Hälfte der Server und Laufwerke weiterhin verfügbar ist, bleiben Volumes mit begrenzter Zuordnung abhängig von den Servern, auf denen Ausfälle auftreten, möglicherweise online und verfügbar.

Häufig gestellte Fragen

Kann ich einige Volumes begrenzen und andere nicht?

Ja. Sie können für jedes Volume auswählen, ob die Zuordnung begrenzt werden soll.

Ändert die begrenz5te Zuordnung die Funktionsweise des Laufwerkaustauschs?

Nein, dies ist gleich wie bei der regulären Zuordnung.

Zusätzliche Referenzen

Anhang

Mit diesem Skript können Sie anzeigen, wie Ihre Volumes zugeordnet sind.

Um es wie oben beschrieben zu verwenden, kopieren Sie es, fügen Sie es ein, und speichern Sie es unter Get-VirtualDiskFootprintBySSU.ps1.

Function ConvertTo-PrettyCapacity {
    Param (
        [Parameter(
            Mandatory = $True,
            ValueFromPipeline = $True
            )
        ]
    [Int64]$Bytes,
    [Int64]$RoundTo = 0
    )
    If ($Bytes -Gt 0) {
        $Base = 1024
        $Labels = ("bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
        $Order = [Math]::Floor( [Math]::Log($Bytes, $Base) )
        $Rounded = [Math]::Round($Bytes/( [Math]::Pow($Base, $Order) ), $RoundTo)
        [String]($Rounded) + " " + $Labels[$Order]
    }
    Else {
        "0"
    }
    Return
}

Function Get-VirtualDiskFootprintByStorageFaultDomain {

    ################################################
    ### Step 1: Gather Configuration Information ###
    ################################################

    Write-Progress -Activity "Get-VirtualDiskFootprintByStorageFaultDomain" -CurrentOperation "Gathering configuration information..." -Status "Step 1/4" -PercentComplete 00

    $ErrorCannotGetCluster = "Cannot proceed because 'Get-Cluster' failed."
    $ErrorNotS2DEnabled = "Cannot proceed because the cluster is not running Storage Spaces Direct."
    $ErrorCannotGetClusterNode = "Cannot proceed because 'Get-ClusterNode' failed."
    $ErrorClusterNodeDown = "Cannot proceed because one or more cluster nodes is not Up."
    $ErrorCannotGetStoragePool = "Cannot proceed because 'Get-StoragePool' failed."
    $ErrorPhysicalDiskFaultDomainAwareness = "Cannot proceed because the storage pool is set to 'PhysicalDisk' fault domain awareness. This cmdlet only supports 'StorageScaleUnit', 'StorageChassis', or 'StorageRack' fault domain awareness."

    Try  {
        $GetCluster = Get-Cluster -ErrorAction Stop
    }
    Catch {
        throw $ErrorCannotGetCluster
    }

    If ($GetCluster.S2DEnabled -Ne 1) {
        throw $ErrorNotS2DEnabled
    }

    Try  {
        $GetClusterNode = Get-ClusterNode -ErrorAction Stop
    }
    Catch {
        throw $ErrorCannotGetClusterNode
    }

    If ($GetClusterNode | Where State -Ne Up) {
        throw $ErrorClusterNodeDown
    }

    Try {
        $GetStoragePool = Get-StoragePool -IsPrimordial $False -ErrorAction Stop
    }
    Catch {
        throw $ErrorCannotGetStoragePool
    }

    If ($GetStoragePool.FaultDomainAwarenessDefault -Eq "PhysicalDisk") {
        throw $ErrorPhysicalDiskFaultDomainAwareness
    }

    ###########################################################
    ### Step 2: Create SfdList[] and PhysicalDiskToSfdMap{} ###
    ###########################################################

    Write-Progress -Activity "Get-VirtualDiskFootprintByStorageFaultDomain" -CurrentOperation "Analyzing physical disk information..." -Status "Step 2/4" -PercentComplete 25

    $SfdList = Get-StorageFaultDomain -Type ($GetStoragePool.FaultDomainAwarenessDefault) | Sort FriendlyName # StorageScaleUnit, StorageChassis, or StorageRack

    $PhysicalDiskToSfdMap = @{} # Map of PhysicalDisk.UniqueId -> StorageFaultDomain.FriendlyName
    $SfdList | ForEach {
        $StorageFaultDomain = $_
        $_ | Get-StorageFaultDomain -Type PhysicalDisk | ForEach {
            $PhysicalDiskToSfdMap[$_.UniqueId] = $StorageFaultDomain.FriendlyName
        }
    }

    ##################################################################################################
    ### Step 3: Create VirtualDisk.FriendlyName -> { StorageFaultDomain.FriendlyName -> Size } Map ###
    ##################################################################################################

    Write-Progress -Activity "Get-VirtualDiskFootprintByStorageFaultDomain" -CurrentOperation "Analyzing virtual disk information..." -Status "Step 3/4" -PercentComplete 50

    $GetVirtualDisk = Get-VirtualDisk | Sort FriendlyName

    $VirtualDiskMap = @{}

    $GetVirtualDisk | ForEach {
        # Map of PhysicalDisk.UniqueId -> Size for THIS virtual disk
        $PhysicalDiskToSizeMap = @{}
        $_ | Get-PhysicalExtent | ForEach {
            $PhysicalDiskToSizeMap[$_.PhysicalDiskUniqueId] += $_.Size
        }
        # Map of StorageFaultDomain.FriendlyName -> Size for THIS virtual disk
        $SfdToSizeMap = @{}
        $PhysicalDiskToSizeMap.keys | ForEach {
            $SfdToSizeMap[$PhysicalDiskToSfdMap[$_]] += $PhysicalDiskToSizeMap[$_]
        }
        # Store
        $VirtualDiskMap[$_.FriendlyName] = $SfdToSizeMap
    }

    #########################
    ### Step 4: Write-Out ###
    #########################

    Write-Progress -Activity "Get-VirtualDiskFootprintByStorageFaultDomain" -CurrentOperation "Formatting output..." -Status "Step 4/4" -PercentComplete 75

    $Output = $GetVirtualDisk | ForEach {
        $Row = [PsCustomObject]@{}

        $VirtualDiskFriendlyName = $_.FriendlyName
        $Row | Add-Member -MemberType NoteProperty "VirtualDiskFriendlyName" $VirtualDiskFriendlyName

        $TotalFootprint = $_.FootprintOnPool | ConvertTo-PrettyCapacity
        $Row | Add-Member -MemberType NoteProperty "TotalFootprint" $TotalFootprint

        $SfdList | ForEach {
            $Size = $VirtualDiskMap[$VirtualDiskFriendlyName][$_.FriendlyName] | ConvertTo-PrettyCapacity
            $Row | Add-Member -MemberType NoteProperty $_.FriendlyName $Size
        }

        $Row
    }

    # Calculate width, in characters, required to Format-Table
    $RequiredWindowWidth = ("TotalFootprint").length + 1 + ("VirtualDiskFriendlyName").length + 1
    $SfdList | ForEach {
        $RequiredWindowWidth += $_.FriendlyName.Length + 1
    }

    $ActualWindowWidth = (Get-Host).UI.RawUI.WindowSize.Width

    If (!($ActualWindowWidth)) {
        # Cannot get window width, probably ISE, Format-List
        Write-Warning "Could not determine window width. For the best experience, use a Powershell window instead of ISE"
        $Output | Format-Table
    }
    ElseIf ($ActualWindowWidth -Lt $RequiredWindowWidth) {
        # Narrower window, Format-List
        Write-Warning "For the best experience, try making your PowerShell window at least $RequiredWindowWidth characters wide. Current width is $ActualWindowWidth characters."
        $Output | Format-List
    }
    Else {
        # Wider window, Format-Table
        $Output | Format-Table
    }
}

Get-VirtualDiskFootprintByStorageFaultDomain