Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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
Overweeg deze optie te gebruiken als:
- Uw cluster heeft zes of meer servers; en
- Uw cluster maakt gebruik van slechts tolerantie voor spiegeling in drie richtingen
Gebruik deze optie niet als:
- Uw cluster heeft minder dan zes servers; of
- Uw cluster maakt gebruik van pariteit- of spiegelversnelde pariteit-tolerantie.
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.
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.
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.
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.
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.
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:
Wijs eerst de servers in uw cluster toe aan de variabele
$Servers:$Servers = Get-StorageFaultDomain -Type StorageScaleUnit | Sort FriendlyNameTip
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'.
Geef op welke servers moeten worden gebruikt met de nieuwe
-StorageFaultDomainsToUseparameter 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:
Geef op dat de vijfde server platen van MyVolumekan opslaan:
Get-VirtualDisk MyVolume | Add-StorageFaultDomain -StorageFaultDomains $Servers[4]Geef op dat de eerste server geen slabs van MyVolume kan opslaan.
Get-VirtualDisk MyVolume | Remove-StorageFaultDomain -StorageFaultDomains $Servers[0]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