Delen via


De toewijzing van volumes in Storage Spaces Direct begrenzen

Windows Server 2019 introduceert een optie voor het handmatig beperken van de volume-toewijzing in Storage Spaces Direct. Dit kan de fouttolerantie onder bepaalde voorwaarden aanzienlijk verhogen, maar brengt enkele extra beheeroverwegingen en complexiteit met zich mee. In dit onderwerp wordt uitgelegd hoe het werkt en worden voorbeelden in PowerShell weergegeven.

Important

Deze functie is nieuw in Windows Server 2019. Het is niet beschikbaar in Windows Server 2016.

Prerequisites

Groen vinkje. Overweeg deze optie te gebruiken als:

Rood X-pictogram. Gebruik deze optie niet als:

Understand

Controleren: reguliere toewijzing

Met drievoudige spiegeling wordt het volume verdeeld in veel kleine 'segmenten' die drie keer worden gekopieerd en gelijkmatig worden verdeeld over alle schijven in elke server van het cluster. Lees deze uitgebreide blog voor meer informatie.

Diagram met het volume dat wordt verdeeld in drie stapels platen en gelijkmatig verdeeld over elke server.

Deze standaardtoewijzing maximaliseert parallelle lees- en schrijfbewerkingen, leidt tot betere prestaties en is aantrekkelijk in zijn eenvoud: elke server is even druk, elke schijf is even vol en alle volumes blijven online of gaan offline. Elk volume kan maximaal twee gelijktijdige fouten overleven, zoals in deze voorbeelden wordt geïllustreerd.

Met deze toewijzing kunnen volumes echter niet drie gelijktijdige fouten overleven. Als drie servers tegelijk uitvallen of als schijven in drie servers tegelijk uitvallen, worden volumes ontoegankelijk omdat ten minste enkele segmenten (met een zeer hoge waarschijnlijkheid) zijn toegewezen aan precies de drie schijven of servers die uitvielen.

In het onderstaande voorbeeld mislukken servers 1, 3 en 5 tegelijkertijd. Hoewel veel platen bewaarde kopieën hebben, hebben sommige dat niet.

Diagram met drie van de zes servers gemarkeerd in rood en het totale volume is rood.

Het volume gaat offline en wordt niet toegankelijk totdat de servers zijn hersteld.

Nieuw: gescheiden toewijzing

Met gescheiden toewijzing geeft u een subset van servers op die moeten worden gebruikt (minimaal vier). Het volume is onderverdeeld in segmenten die drie keer worden gekopieerd, zoals voorheen, maar in plaats van deze aan elke server toe te wijzen, worden de segmenten alleen toegewezen aan de subset van servers die u opgeeft.

Als u bijvoorbeeld een cluster met 8 knooppunten (knooppunten 1 tot en met 8) hebt, kunt u een volume opgeven dat alleen op schijven in knooppunten 1, 2, 3, 4 moet worden opgeslagen.

Advantages

Met de voorbeeldtoewijzing zal het volume waarschijnlijk drie gelijktijdige fouten overleven. Als knooppunten 1, 2 en 6 omlaag gaan, blijven slechts 2 van de knooppunten met de 3 kopieën van gegevens voor het volume offline en blijft het volume online.

De overlevingskans is afhankelijk van het aantal servers en andere factoren. Zie Analyse voor meer informatie.

Disadvantages

Afgebakende toewijzing brengt enkele extra beheeroverwegingen en complexiteit met zich mee.

  1. De beheerder is verantwoordelijk voor het begrenzen van de toewijzing van elk volume om het opslaggebruik over servers te balanceren en een hoge waarschijnlijkheid van overleving te waarborgen, zoals beschreven in de sectie Aanbevolen procedures.

  2. Bij gescheiden toewijzing reserveert u het equivalent van één capaciteitsschijf per server (zonder maximum). Dit is meer dan de gepubliceerde aanbeveling voor reguliere toewijzing, waardoor het totaal van vier capaciteitsstations wordt bereikt.

  3. Als een server uitvalt en moet worden vervangen, zoals beschreven in Een server en de stations verwijderen, is de beheerder verantwoordelijk voor het bijwerken van de begrenzing van betrokken volumes door de nieuwe server toe te voegen en de defecte te verwijderen – zie voorbeeld hieronder.

Gebruik in PowerShell

U kunt de New-Volume cmdlet gebruiken om volumes te maken in Opslagruimten Direct.

Als u bijvoorbeeld een normaal spiegelvolume in drie richtingen wilt maken:

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

Een volume maken en de toewijzing ervan begrenzen

Ga als volgt te werk om een gespiegeld volume in drie richtingen te maken en de toewijzing ervan te scheiden:

  1. Wijs eerst de servers in uw cluster toe aan de variabele $Servers:

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

    Tip

    In Opslagruimten Direct verwijst de term 'Opslagschaaleenheid' naar alle ruwe opslag die aan één server is gekoppeld, inclusief direct gekoppelde schijven en direct gekoppelde externe behuizingen met schijven. In deze context is dit hetzelfde als 'server'.

  2. Geef op welke servers moeten worden gebruikt met de nieuwe -StorageFaultDomainsToUse parameter en door te indexeren in $Servers. Om bijvoorbeeld de toewijzing aan de eerste, tweede, derde en vierde servers af te bakenen (indices 0, 1, 2 en 3):

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

Een gescheiden toewijzing weergeven

Als u wilt zien hoe MyVolume wordt toegewezen, gebruikt u het Get-VirtualDiskFootprintBySSU.ps1 script in bijlage:

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

Houd er rekening mee dat alleen Server1, Server2, Server3 en Server4 platen van MyVolume bevatten.

Een afgebakende toewijzing wijzigen

Gebruik de nieuwe Add-StorageFaultDomain en Remove-StorageFaultDomain cmdlets om te wijzigen hoe de toewijzing wordt begrensd.

Als u bijvoorbeeld MyVolume wilt verplaatsen via één server:

  1. Geef op dat de vijfde server platen van MyVolumekan opslaan:

    Get-VirtualDisk MyVolume | Add-StorageFaultDomain -StorageFaultDomains $Servers[4]
    
  2. Geef op dat de eerste server geen slabs van MyVolume kan opslaan.

    Get-VirtualDisk MyVolume | Remove-StorageFaultDomain -StorageFaultDomains $Servers[0]
    
  3. De opslaggroep opnieuw verdelen om de wijziging van kracht te laten worden:

    Get-StoragePool S2D* | Optimize-StoragePool
    

U kunt de voortgang van de herbalance bewaken met Get-StorageJob.

Zodra het is voltooid, controleert u of MyVolume is verplaatst door Get-VirtualDiskFootprintBySSU.ps1 opnieuw uit te voeren.

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

Houd er rekening mee dat Server1 geen platen meer van MyVolume bevat; deze bevinden zich nu op Server5.

Beste praktijken

Hier volgen de aanbevolen procedures voor het gebruik van gescheiden volumetoewijzing:

Vier servers kiezen

Beperk elk driewegspiegelvolume tot maximaal vier servers, niet meer.

Opslag verdelen

Zorg ervoor dat de hoeveelheid toegewezen opslagruimte aan elke server in balans is, rekening houdend met de volumegrootte.

Gespreide toewijzingsvolumes afgebakend met scheidingstekens

Als u fouttolerantie wilt maximaliseren, maakt u de toewijzing van elk volume uniek, wat betekent dat deze niet alle servers met een ander volume deelt (sommige overlappingen zijn in orde).

Bijvoorbeeld op een systeem met acht knooppunten: Volume 1: Servers 1, 2, 3, 4 Volume 2: Servers 5, 6, 7, 8 Volume 3: Servers 3, 4, 5, 6 Volume 4: Servers 1, 2, 7, 8

Analysis

In deze sectie wordt de wiskundige waarschijnlijkheid afgeleid dat een volume online blijft en toegankelijk (of gelijkwaardig, de verwachte fractie van de totale opslag die online en toegankelijk blijft) als functie van het aantal storingen en de clustergrootte.

Note

Deze sectie is optioneel te lezen. Als u de wiskunde graag wilt zien, lees dan verder! Maar als dat niet het probleem is, hoeft u zich geen zorgen te maken: het gebruik in PowerShell en best practices is alles wat u nodig hebt om de toewijzing met scheidingstekens te implementeren.

Maximaal twee fouten zijn altijd in orde

Elk spiegelvolume in drie richtingen kan maximaal twee fouten tegelijk overleven, ongeacht de toewijzing. Als twee schijven mislukken of twee servers mislukken, of een van elk, blijft elk drie-richtings-spiegelvolume online en toegankelijk, zelfs bij regelmatige toewijzing.

Het is nooit in orde als meer dan de helft van het cluster mislukt.

In het extreme geval dat meer dan de helft van de servers of stations in het cluster in één keer uitvalt, gaat quorum verloren en gaat elk spiegelvolume in drie richtingen offline en wordt ze ontoegankelijk, ongeacht de toewijzing.

En tussendoor?

Als er drie of meer fouten tegelijk optreden, maar ten minste de helft van de servers en de stations nog steeds actief zijn, kunnen volumes met gescheiden toewijzing online en toegankelijk blijven, afhankelijk van welke servers fouten hebben.

Veelgestelde vragen

Kan ik sommige volumes scheiden, maar niet andere?

Yes. U kunt per volume kiezen of de toewijzing wel of niet beperkt moet worden.

Verandert begrensde toewijzing hoe de vervanging van een schijf werkt?

Nee, het is hetzelfde als bij reguliere toewijzing.

Aanvullende verwijzingen

Appendix

Met dit script kunt u zien hoe uw volumes worden toegewezen.

Als u deze wilt gebruiken zoals hierboven beschreven, kopieert/plakt u het bestand als 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