Memisahkan alokasi volume di Ruang Penyimpanan Langsung
Windows Server 2019 memperkenalkan opsi untuk secara manual memisahkan alokasi volume di Ruang Penyimpanan Langsung. Melakukannya dapat secara signifikan meningkatkan toleransi kesalahan dalam kondisi tertentu, tetapi memberlakukan beberapa pertimbangan dan kompleksitas manajemen tambahan. Topik ini menjelaskan cara kerjanya dan memberikan contoh di PowerShell.
Penting
Fitur ini baru di Windows Server 2019. Ini tidak tersedia di Windows Server 2016.
Prasyarat
Pertimbangkan untuk menggunakan opsi ini jika:
- Kluster Anda memiliki enam server atau lebih; dan
- Kluster Anda hanya menggunakan ketahanan cermin tiga arah
Jangan gunakan opsi ini jika:
- Kluster Anda memiliki kurang dari enam server; atau
- Kluster Anda menggunakan paritas atau ketahanan paritas yang dipercepat cermin
Memahami
Ulasan: alokasi reguler
Dengan pencerminan tiga arah reguler, volume dibagi menjadi banyak "slabs" kecil yang disalin tiga kali dan didistribusikan secara merata di setiap drive di setiap server di kluster. Untuk detail selengkapnya, baca blog mendalam ini.
Alokasi default ini memaksimalkan pembacaan dan penulisan paralel, yang mengarah ke performa yang lebih baik, dan menarik dalam kesederhanaannya: setiap server sama-sama sibuk, setiap drive sama-sama penuh, dan semua volume tetap online atau offline bersama-sama. Setiap volume dijamin bertahan hingga dua kegagalan bersamaan, seperti yang diilustrasikan contoh-contoh ini.
Namun, dengan alokasi ini, volume tidak dapat bertahan dari tiga kegagalan bersamaan. Jika tiga server gagal sekaligus, atau jika drive di tiga server gagal sekaligus, volume menjadi tidak dapat diakses karena setidaknya beberapa slabs (dengan probabilitas yang sangat tinggi) dialokasikan ke tiga drive atau server yang gagal.
Dalam contoh di bawah ini, server 1, 3, dan 5 gagal pada saat yang sama. Meskipun banyak slabs memiliki salinan yang bertahan, beberapa tidak:
Volume menjadi offline dan menjadi tidak dapat diakses sampai server dipulihkan.
Baru: alokasi yang dibatasi
Dengan alokasi yang dibatasi, Anda menentukan subset server yang akan digunakan (minimal empat). Volume dibagi menjadi lembaran yang disalin tiga kali, seperti sebelumnya, tetapi alih-alih mengalokasikan di setiap server, lemper dialokasikan hanya untuk subset server yang Anda tentukan.
Misalnya, jika Anda memiliki kluster simpul 8 (simpul 1 hingga 8), Anda dapat menentukan volume yang hanya akan ditemukan pada disk di simpul 1, 2, 3, 4.
Kelebihan
Dengan contoh alokasi, volume kemungkinan akan bertahan dari tiga kegagalan bersamaan. Jika node 1, 2, dan 6 turun, hanya 2 simpul yang menyimpan 3 salinan data untuk volume yang tidak berfungsi dan volume akan tetap online.
Probabilitas kelangsungan hidup tergantung pada jumlah server dan faktor lain - lihat Analisis untuk detailnya.
Kerugian
Alokasi yang dibatasi memberlakukan beberapa pertimbangan dan kompleksitas manajemen tambahan:
Administrator bertanggung jawab untuk memisahkan alokasi setiap volume untuk menyeimbangkan pemanfaatan penyimpanan di seluruh server dan menjunjung tinggi kemungkinan kelangsungan hidup, seperti yang dijelaskan di bagian Praktik terbaik.
Dengan alokasi yang dibatasi, cadangan setara dengan satu drive kapasitas per server (tanpa maksimum). Ini lebih dari rekomendasi yang diterbitkan untuk alokasi reguler, yang memaksimalkan total empat drive kapasitas.
Jika server gagal dan perlu diganti, seperti yang dijelaskan dalam Menghapus server dan drivenya, administrator bertanggung jawab untuk memperbarui pembatas volume yang terpengaruh dengan menambahkan server baru dan menghapus yang gagal - contoh di bawah ini.
Penggunaan di PowerShell
Anda dapat menggunakan New-Volume
cmdlet untuk membuat volume di Ruang Penyimpanan Langsung.
Misalnya, untuk membuat volume cermin tiga arah reguler:
New-Volume -FriendlyName "MyRegularVolume" -Size 100GB
Membuat volume dan memisahkan alokasinya
Untuk membuat volume cermin tiga arah dan memisahkan alokasinya:
Pertama tetapkan server di kluster Anda ke variabel
$Servers
:$Servers = Get-StorageFaultDomain -Type StorageScaleUnit | Sort FriendlyName
Tip
Di Ruang Penyimpanan Langsung, istilah 'Storage Scale Unit' mengacu pada semua penyimpanan mentah yang terpasang pada satu server, termasuk drive yang terpasang langsung dan penutup eksternal yang terpasang langsung dengan drive. Dalam konteks ini, sama dengan 'server'.
Tentukan server mana yang akan digunakan dengan parameter baru
-StorageFaultDomainsToUse
dan dengan mengindeks ke dalam$Servers
. Misalnya, untuk memisahkan alokasi ke server pertama, kedua, ketiga, dan keempat (indeks 0, 1, 2, dan 3):New-Volume -FriendlyName "MyVolume" -Size 100GB -StorageFaultDomainsToUse $Servers[0,1,2,3]
Lihat alokasi yang dibatasi
Untuk melihat bagaimana MyVolume dialokasikan, gunakan Get-VirtualDiskFootprintBySSU.ps1
skrip di Lampiran:
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
Perhatikan bahwa hanya Server1, Server2, Server3, dan Server4 yang berisi lempengan MyVolume.
Mengubah alokasi yang dibatasi
Gunakan cmdlet baru Add-StorageFaultDomain
dan Remove-StorageFaultDomain
untuk mengubah bagaimana alokasi dibatasi.
Misalnya, untuk memindahkan MyVolume melalui satu server:
Tentukan bahwa server kelima dapat menyimpan lempengan MyVolume:
Get-VirtualDisk MyVolume | Add-StorageFaultDomain -StorageFaultDomains $Servers[4]
Tentukan bahwa server pertama tidak dapat menyimpan lempengan MyVolume:
Get-VirtualDisk MyVolume | Remove-StorageFaultDomain -StorageFaultDomains $Servers[0]
Seimbangkan kembali kumpulan penyimpanan agar perubahan diterapkan:
Get-StoragePool S2D* | Optimize-StoragePool
Anda dapat memantau kemajuan penyeimbangan ulang dengan Get-StorageJob
.
Setelah selesai, verifikasi bahwa MyVolume telah dipindahkan dengan menjalankan Get-VirtualDiskFootprintBySSU.ps1
lagi.
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
Perhatikan bahwa Server1 tidak berisi lempengan MyVolume lagi - sebagai gantinya, Server5 tidak.
Praktik terbaik
Berikut adalah praktik terbaik yang harus diikuti saat menggunakan alokasi volume yang dibatasi:
Pilih empat server
Batasi setiap volume cermin tiga arah ke empat server, tidak lebih.
Menyeimbangkan penyimpanan
Seimbangkan berapa banyak penyimpanan yang dialokasikan untuk setiap server, memperhitungkan ukuran volume.
Volume alokasi yang dibatasi stagger
Untuk memaksimalkan toleransi kesalahan, buat alokasi setiap volume unik, yang berarti tidak berbagi semua servernya dengan volume lain (beberapa tumpang tindih tidak apa-apa).
Misalnya pada sistem delapan node: 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
Analisis
Bagian ini memperoleh probabilitas matematika bahwa volume tetap online dan dapat diakses (atau setara, pecahan penyimpanan keseluruhan yang diharapkan yang tetap online dan dapat diakses) sebagai fungsi dari jumlah kegagalan dan ukuran kluster.
Catatan
Bagian ini adalah pembacaan opsional. Jika Anda ingin melihat matematika, baca terus! Tetapi jika tidak, jangan khawatir: Penggunaan di PowerShell dan Praktik terbaik adalah semua yang Anda butuhkan untuk menerapkan alokasi yang dibatasi dengan sukses.
Hingga dua kegagalan selalu baik-baik saja
Setiap volume cermin tiga arah dapat bertahan hingga dua kegagalan pada saat yang sama, terlepas dari alokasinya. Jika dua drive gagal, atau dua server gagal, atau salah satu dari masing-masing, setiap volume cermin tiga arah tetap online dan dapat diakses, bahkan dengan alokasi reguler.
Lebih dari setengah kluster gagal tidak pernah baik-baik saja
Sebaliknya, dalam kasus ekstrem bahwa lebih dari setengah server atau drive dalam kluster gagal sekaligus, kuorum hilang dan setiap volume cermin tiga arah menjadi offline dan menjadi tidak dapat diakses, terlepas dari alokasinya.
Bagaimana dengan di antaranya?
Jika tiga atau lebih kegagalan terjadi sekaligus, tetapi setidaknya setengah dari server dan drive masih aktif, volume dengan alokasi yang dibatasi mungkin tetap online dan dapat diakses, tergantung pada server mana yang mengalami kegagalan.
Tanya jawab umum
Dapatkah saya memisahkan beberapa volume tetapi tidak yang lain?
Ya. Anda dapat memilih per volume apakah akan memisahkan alokasi atau tidak.
Apakah alokasi yang dibatasi mengubah cara kerja penggantian drive?
Tidak, sama dengan alokasi reguler.
Referensi Tambahan
Lampiran
Skrip ini membantu Anda melihat bagaimana volume Anda dialokasikan.
Untuk menggunakannya seperti yang dijelaskan di atas, salin/tempel dan simpan sebagai 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