Memisahkan alokasi volume di Ruang Penyimpanan Langsung

Berlaku untuk: Windows Server 2022, Windows Server 2019

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

Green checkmark icon. Pertimbangkan untuk menggunakan opsi ini jika:

Red X icon. 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.

Diagram showing the volume being divided into three stacks of slabs and distributed evenly across every server.

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:

Diagram showing three of six servers highlighted in red, and the overall volume is red.

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:

  1. 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.

  2. 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.

  3. 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:

  1. 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'.

  2. 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:

  1. Tentukan bahwa server kelima dapat menyimpan lempengan MyVolume:

    Get-VirtualDisk MyVolume | Add-StorageFaultDomain -StorageFaultDomains $Servers[4]
    
  2. Tentukan bahwa server pertama tidak dapat menyimpan lempengan MyVolume:

    Get-VirtualDisk MyVolume | Remove-StorageFaultDomain -StorageFaultDomains $Servers[0]
    
  3. 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