USBエンクロージャだけで記憶域スペースのミラー高速パリティを作ってみる


# 結論
・シーケンシャルリードは期待の結果に。
・ライトは期待の半分ほどで遅かったですが、HDDのパリティよりは速かったです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/0558520c-1f68-860c-f20a-33ddc7eb82a3.png)

# 概要
・以下のような構成で、SSDを2枚ないし4枚で高速層（ホットデータ）を作り、HDDはRAID5相当で領域を節約しつつ冗長性を保つ（コールドデータ）、というものになります。
・すみません図は使いまわしです。しかもストラピングではなくミラーです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/b6d7847a-95f3-b136-d5ae-5acaf19d2e24.png)

# なんか面白い製品が出た
・きっかけはセンチュリーさんから2ドライブのUSB NVMEエンクロージャーが出たことです。
・これにより1本のUSBケーブルで記憶域スペースの高速層を作れるのでは？というわけですね。
https://www.century.co.jp/products/cmnv2u10gcp.html

![cmnv2u10gcp_g03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/1ce5886e-48b7-b43f-4e82-588a040ed82a.jpeg)

# 必要なもの

1. 余ってるWindowsPC（今回はProxmox上のWindows Server2025）
2. 3ベイ以上のUSB HDDエンクロージャー（今回はロジテックの4ベイ）
3. センチュリーのこれ

あとはNVME SSDが2枚、HDDが任意の数必要になります。

# スペック
・高速層は500GB×2でRAID1相当のミラーリングにより容量は500GBのままですが、冗長化されます。
・USB3.2 Gen2なので、理論上は最大1000Mb/sが出るようです。
・低速層はパリティ（RAID5相当）により容量と冗長性のバランスを取ります。今回1TB×4台なので-1TBで3TBとなります。
・記憶域スペースのパリティの仕様により、低速層の書き込みは単体より低速になってしまいますが、高速層でカバーするということらしいです。

# HDDを認識させる
・VMにパススルーしてますが物理マシンでは不要な手順となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/b940c355-30ae-7f6a-0d74-bc6a407986f4.png)

# SSDを認識させる
・こちらはエンクロージャー単位でいけました。メーカーによるのですかね？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/d8526f75-1bf0-9b08-6c72-41ad5d40b7e3.png)
・全部で6台のディスクがWindowsからこのように認識していればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/7f37f66a-5dac-b0a9-55f6-fac10322de27.png)


# 記憶域スペース作成
・PowerShellコマンドで作ります。メディアタイプが不明になっているので、HDDに変換します。
```.ps1
# 情報確認
$disks = Get-PhysicalDisk | where {$_.Canpool -eq $true}
Write-Host "プールが可能なディスクの一覧：" -ForegroundColor Green
$diskInfo = $disks | select UniqueID, ClassName, Manufacturer, Model, BusType, MediaType, CanPool, @{Name="SizeGB"; Expression={$_.Size / 1GB -as [int]}}, OperationalStatus, HealthStatus
$diskInfo | sort MediaType -Descending | ft
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/4808813d-2b7a-d6c6-fa4f-3413f72ed4eb.png)
# メディアタイプをHDDに変換
・今回はHDDの型番が一緒なので型番で検索しています。
・検索条件は適宜変更してみて下さい。
```.ps1
$MediaTypeConversionToHDD = Get-PhysicalDisk | where {$_.Model -eq "DT01ACA100"}
foreach ($disk in $MediaTypeConversionToHDD) {
    $disk | Set-PhysicalDisk -MediaType HDD
    }
```
・メディアタイプがHDDになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/19b3d4fb-73fb-39c0-f770-8056bb8b5baa.png)

# 最終容量を計算する
・ミラーだと48%、パリティだと96%にすることでエラーなく作成できたのでそうしています。そういう仕様なのですかね。
```.ps1
# 容量プランの表示
$totalSSD = ($disks | where MediaType -eq "SSD" | measure -property Size -Sum).Sum
$totalHDD = ($disks | where MediaType -eq "HDD" | measure -property Size -Sum).Sum
$SSDSize = $totalSSD * 0.48
$singleHDD = ($disks | where MediaType -eq 'HDD' | select -First 1).Size
$HDDSize = ($totalHDD - $singleHDD) * 0.96

$totalSSDinGB = [math]::Round($totalSSD/1GB)
$totalHDDinGB = [math]::Round($totalHDD/1GB)
$SSDSizeInGB = [math]::Round($SSDSize/1GB)
$HDDSizeInGB = [math]::Round($HDDSize/1GB)

Write-Host "記憶域スペースで予定される最終容量を計算します。（高速層：48%のサイズ、低速層：-1台かつ96%のサイズ）"
Write-Host "SSD高速層（ミラー）:トータルは $totalSSDinGB GBで、$ssdSizeinGB GBのボリュームが作成される予定です。" -ForegroundColor Cyan
Write-Host "HDD低速層（パリティ）:トータルは $totalHDDinGB GBで、$hddSizeinGB GBのボリュームが作成される予定です。" -ForegroundColor Yellow
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/873cc4e6-2d9b-f718-0a35-f151ca1abc9a.png)

# 階層プールとボリュームの作成
・NumberOfColumnsとNumberOfDataCopyは難しそうだったのでいったんこのようにしています。
・詳しい方お願いします。
```.ps1
$Pool = New-StoragePool -FriendlyName "階層プール" -StorageSubsystemFriendlyName "Windows Storage*" -PhysicalDisks $disks
$SSDTier = New-StorageTier -StoragePoolFriendlyName "階層プール" -FriendlyName SSDTier -MediaType SSD -ResiliencySettingName Mirror -ProvisioningType Fixed -NumberOfColumns 1
$HDDTier = New-StorageTier -StoragePoolFriendlyName "階層プール" -FriendlyName HDDTier -MediaType HDD -ResiliencySettingName Parity -ProvisioningType Fixed -PhysicalDiskRedundancy 1 -NumberOfColumns 4

# ボリュームの作成
New-Volume -FriendlyName "ミラー高速パリティテスト" -DriveLetter M -FileSystem ReFS -WriteCacheSize 16GB -StorageTiers $SSDTier, $HDDTier -StorageTierSizes $SSDSize, $HDDSize
```
# ベンチマーク
・シーケンシャルリードは期待の結果に。
・ライトは期待の半分ほどで遅かったですが、HDDのパリティよりは速かったです。
・記憶域スペースの原因か、エンクロージャーの制約なのかは不明。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/0558520c-1f68-860c-f20a-33ddc7eb82a3.png)

# コラム
・ベンチマーク中にVMがフリーズするのが気になりました。
・Proxmoxってパススルーまわりはまだ不安定？実機でやってみることをお勧めいたします。
・テストが繰り返せるよう、ボリュームを削除するPowerShellも貼っておきます。

```.ps1
# 削除する
Remove-VirtualDisk -FriendlyName "ミラー高速パリティテスト" -Confirm:$false
Remove-StoragePool -FriendlyName "階層プール" -Confirm:$false
```

# ポエム
・センチュリーさんの製品ですが、2枚のNVMEにアクセス時に交互にチカチカ光るのでわかりやすかったです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/4ed00bab-ed97-fb92-c1fe-d69eef815256.png)