VPSのRAID 10とは?NVMeで選ばれる理由
RAID 1、5、6、10が耐えられる故障台数、再構築のコスト、VPSホストがNVMeでRAID 10を選ぶ理由を解説します。/proc/mdstatの見方と、RAIDがバックアップではない理由も確認できます。
RAID 10 とは何か、VPS ホストが採用する理由
RAID 10 は、仮想化された NVMe (non-volatile memory express) ドライブ上で多くの VPS ホストが採用するストレージ構成です。各ドライブを対応する別のドライブにミラーリングし、そのミラーリングされたペア間でデータをストライピングします。1 台のドライブが故障してもアレイは停止せず、修復はセット内の他のすべてのドライブを読み取って再計算するのではなく、稼働しているペアから単純にコピーして行います。
RAID は redundant array of independent disks の略です。役割は 1 つだけです。ディスクが停止中または交換中でも、マシンによるサービス提供を継続します。これは可用性のための機能であり、安全性を保証するものではありません。
RAID は書き込みを複製します。rm -rf /srv は書き込みです。ミラーの両方が同じミリ秒にディレクトリを失っても、アレイはその後も正常な状態として報告します。
この文は覚えておいてください。このページの残りでは、各レベルで何に耐えられるかと、各書き込みで発生するコストを説明します。最後のセクションでは、自分が所有するマシンでアレイの状態を確認するコマンドと、RAID では決して防げない障害を説明します。
ホスティングの利用者が実際に目にするレベル: 1、5、6、10
プランのページには数字だけが記載され、それ以上の説明がないことがあります。この数字は、2つの疑問に答えます。何台のドライブまで故障に耐えられるか、そして書き込み1回ごとにどのようなコストが発生するかです。
RAID 1はミラーリングです。 2台のドライブに同一のブロックを保持します。書き込みは両方に行われます。読み取りはどちらのドライブからでも処理できます。1台が故障してもデータは失われず、使用できる容量は raw 容量の半分です。パリティ計算がないため、書き込み処理は短くなります。
RAID 5は、各ストライプに1つのパリティブロックを配置するストライピングです。 n 台のドライブを使う場合、使用できる容量は n-1 台分で、アレイは正確に1台の故障に耐えます。パリティは特定の1台に固定されません。すべてのドライブに分散して配置されるため、各ドライブがデータとパリティの両方を保持します。
RAID 6は各ストライプに独立した2つ目のパリティブロックを追加します。 通常、P と Q として書き込まれます。2台のドライブが同時に故障しても稼働を継続できます。これは見た目以上に重要です。2台目の故障は、最初の故障を修復している間に発生することが最も多いためです。
RAID 10はミラーのストライプです。 ドライブを2台ずつミラーリングし、そのペア間にデータを分散します。使用できる容量は raw 総容量の半分で RAID 1 と同じですが、ストライピングによる並列性が加わります。
RAID 1+0 と表記されることもあります。こちらが実態を正確に表しています。まずミラーリングし、次にミラー間でストライピングします。RAID 0+1 は順序が逆で、まずストライピングし、その2つのストライプをミラーリングします。こちらの方式は劣ります。1台のドライブが故障するとストライプ全体が利用できなくなり、修復時には反対側全体をコピーする必要があるためです。
Linuxには、知っておく価値のある特殊な点があります。カーネルの raid10 は2つの層を重ねるのではなく、単一の personality です。そのため、奇数台のドライブでも動作し、ネスト構成では表現できないレイアウト(near、far、offset)も利用できます。Linuxマシンのステータス行が2つのアレイ名ではなく、2 near-copies と表示されるのはそのためです。
The data behind this chart
[
{
"label": "RAID 1 (four mirrored pairs)",
"usable_tb": 4,
"worst_case_drives_lost": 1,
"best_case_drives_lost": 4
},
{
"label": "RAID 5",
"usable_tb": 7,
"worst_case_drives_lost": 1,
"best_case_drives_lost": 1
},
{
"label": "RAID 6",
"usable_tb": 6,
"worst_case_drives_lost": 2,
"best_case_drives_lost": 2
},
{
"label": "RAID 10",
"usable_tb": 4,
"worst_case_drives_lost": 1,
"best_case_drives_lost": 4
}
]1 TB のドライブ8台を使うと、RAID 5では使用可能容量が 7 TB、RAID 10では 4 TBになります。この差は実際の費用に直結するため、パリティ方式が繰り返し提案されます。RAID 6は、どのような組み合わせでも 2 台の故障に耐えます。RAID 10が保証するのは 1 台だけです。危険な2台目の故障とは、すでに故障したドライブのペア側にあるドライブで発生する故障だからです。どの2台の故障も同じペアに属さない場合は、最大 4 台まで耐えられますが、これは設計上の特性ではなく、運に左右されます。
各レベルで書き込みごとに発生するコスト
ミラーへの書き込みは、両方のメンバーに同時に発行する 2 回の書き込みです。パリティストライプへの書き込みは、対象ストライプのパリティブロックが正しくなくなるため、再計算が必要になり、より多くの処理が発生します。
コントローラーは、新しいブロックだけからパリティを再計算できません。最初に古いデータブロックと古いパリティブロックを読み取る必要があります。そのため、RAID 5 での小さなランダム書き込みは、read、read、write、write になります。RAID 6 では、維持する 2 つ目のシンドロームがあるため、同じ書き込みが read、read、read、write、write、write になります。
The data behind this chart
[
{
"label": "RAID 1 (2 drives)",
"write_ops_per_host_write": 2,
"drives_read_to_rebuild": 1
},
{
"label": "RAID 5 (8 drives)",
"write_ops_per_host_write": 4,
"drives_read_to_rebuild": 7
},
{
"label": "RAID 6 (8 drives)",
"write_ops_per_host_write": 6,
"drives_read_to_rebuild": 7
},
{
"label": "RAID 10 (8 drives)",
"write_ops_per_host_write": 2,
"drives_read_to_rebuild": 1
}
]小さなランダム書き込みでは、RAID 6 で 6 回、RAID 10 で 2 回のデバイス操作が発生します。この回数だけでは、レイテンシの差を十分に表せません。2 つのミラー書き込みは並列に実行されるため、ゲストは遅い方の完了を待ちます。一方、パリティ処理では、新しいパリティを計算する前に読み取りを完了する必要があります。そのため、ゲストは読み取り、続いて書き込みを順番に待ちます。負荷の高いホストでは、この読み取りが他のすべての I/O の後ろでキューに入ります。
重要な例外があります。ストライプ全体を埋めるほど大きな書き込みでは、ストライプ内のすべてのブロックが置き換わるため、古いデータは必要ありません。パリティはメモリ上のデータから計算でき、追加コストは 1 回の書き込みまで減少します。このため、RAID 5 はシーケンシャルベンチマークでは問題なく見えても、多数のテナントから小さな書き込みが混在する負荷では性能が悪化します。実際に運用するパターンでテストしてください。VPS ディスクを適切にベンチマークするとは、1 回の大きな dd ではなく、現実的なキュー深度でランダム I/O を実行することです。
再構築が危険な理由
パリティの再構築では、残りのすべてのドライブから故障したドライブを再構成する必要があります。そのため、最初のブロックから最後のブロックまで、稼働中の 7 台のドライブを読み取ります。RAID 10 の再構築で読み取るのは 1 だけです。故障したドライブのミラー相手だけを読み取り、ほかのドライブは読み取りません。
ここから2つのコストが生じます。1つ目は時間です。再構築の速度は、最も遅い稼働中のドライブと、その上で行うパリティ計算によって制限されます。2つ目は負荷です。パリティセット内のすべてのドライブが再構築中ずっと処理を続けるため、完了するまで、そのノード上のすべてのゲストでレイテンシが上昇します。RAID 10 では1組のミラーだけが処理中になり、ほかのミラー組は通常の速度で処理できます。
同じ期間には、データの正確性に関するリスクもあります。ドライブが1台故障したRAID 5アレイには、冗長性が残っていません。そのため、稼働中のドライブのどこかに読み取り不能なセクターがあると、そのデータは復旧できません。再構築は、1年間誰もアクセスしていないセクターも含め、すべてのセクターを読み取る唯一の処理です。公開されているデータシートの数値では、コンシューマー向けハードドライブの読み取り不能エラーは、読み取った10^14ビットあたり約1回です。エンタープライズ向けNVMeドライブでは、10^17ビットあたり1回以下です。これらは測定値ではなくベンダー仕様ですが、この比率から、RAID 5の再構築が失敗すると警告されてきた背景が大容量の回転ディスクであり、NVMeではその懸念が大幅に小さい理由が分かります。負荷に関する議論は、どの記録媒体にも当てはまります。
再構築が検出する前に、スクラビングで潜在的なエラーを検出してください。DebianとUbuntuにはmdアレイ用の定期スクラブが用意されていますが、その仕組みはリリースによって異なります。使用中の仕組みを確認してから、手動でパスを実行してください。
systemctl list-timers --all | grep -i mdcheck
ls -l /etc/cron.d/mdadm
echo check | sudo tee /sys/block/md0/md/sync_action
cat /sys/block/md0/md/mismatch_cntsync_action はパスの完了時に idle に戻り、mismatch_cnt は 0 になっているはずです。ミラーで0より大きい値が表示される場合、2つのコピーの内容が一致していません。どちらが正しいかをカーネルが判断できないのは、どちらのコピーにもチェックサムがないためです。不一致の中には問題のないものもあります。よくある原因はswapパーティションです。カーネルが、途中で内容が変化するページを書き込むことがあるためです。データアレイで不一致数が増加している場合は、ドライブを交換してください。
VPS プロバイダーが NVMe で RAID 10 を標準化する理由
ハイパーバイザーノードは、1 つのワークロードだけを実行するわけではありません。無関係なゲストを数十台実行し、それぞれの I/O が局所性のない小さな書き込みストリームとして混在して到着します。これは、パリティの read-modify-write サイクルのコストが最も大きくなるパターンです。共有ノードでは、この状態が常に続きます。
再構築時の動作も考慮すると、選択は明確です。パリティ構成のノードでドライブが故障すると、ホスト上のすべてのゲストが数時間にわたって遅くなります。RAID 10 ノードでドライブが故障した場合は、1 組のミラーだけが遅くなり、コピーはドライブ速度でシーケンシャルに実行されます。プロバイダーはスパイクしないレイテンシを提供するため、容量を対価として支払います。つまり、raw NVMe の半分をミラーに割り当てます。
ドライブ容量も同じ方向に作用します。ドライブが大容量になるほど再構築期間は長くなります。パリティ構成では、その期間中にすべての処理が遅くなり、しかもデータが保護されない状態になります。これが、仮想化向けの ZFS 構成で、幅の広い raidz ではなく、ミラー vdev のプールを使用する理由と同じです。ミラーの resilver では、実際に使用中のブロックだけを 1 組のドライブにコピーします。
ただし、これがどの環境でも RAID 10 が正しいという意味ではありません。バックアップターゲットは長いシーケンシャル書き込みが行われ、読み取り頻度も低いため、そこでは RAID 6 の方が有利です。2 台の故障に耐えながら、容量の大部分を利用できます。判断基準は台数ではなく、ワークロードです。現在選択するプランでは、通常、上に構築するレイアウトよりもストレージ媒体の方が重要です。SATA SSD から NVMe への性能差は、どちらの RAID 構成における差よりも大きくなります。SATA SSD から NVMe への移行
/proc/mdstat の読み方
自分でアレイを構築したマシンで実行してください。専用サーバー、自宅のマシン、または自分で組み立てた 2 つのボリュームを接続した VPS などが該当します。自分の出力を読み取ってください。以下のブロックは例です。実際に得られる出力の形と照合できるよう、展開して記載しています。
cat /proc/mdstat
sudo mdadm --detail /dev/md0
lsblk -o NAME,SIZE,TYPE,MOUNTPOINTS正常な 4 ドライブ RAID 10 では、次のような出力になります。
Personalities : [raid1] [raid10]
md0 : active raid10 nvme3n1p3[3] nvme2n1p3[2] nvme1n1p3[1] nvme0n1p3[0]
3906764800 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
bitmap: 0/30 pages [0KB], 65536KB chunk
unused devices: <none>この出力のすべての部分に情報があります。
Personalitiesは、実行中のカーネルがロードしている md モジュールを一覧表示します。そこにraid10が表示されることは、そのコードを利用できることだけを意味します。md0 : active raid10は、アレイデバイス、その状態、RAID レベルです。- その後に続く名前はメンバーです。角括弧内の番号は、アレイのメタデータにおけるデバイスのインデックスです。行内の位置を示すものではなく、常にスロット番号と一致するわけでもありません。
- ドライブを交換した後は、新しいメンバーのインデックスが、置き換えたスロットより大きくなることが一般的です。そのため、
nvme4n1p3[4]が slot 2 にある場合があります。mdadm --detailはRaidDevice列に実際のスロットを表示するため、両者の違いが重要な場合はそちらを使用してください。 - メンバーの後に表示される
(F)は、そのメンバーが faulty であることを示します。(S)は spare を示します。spare は存在しているもののアイドル状態で、何かが故障するのを待っています。 3906764800 blocks super 1.2は 1 KiB ブロック単位の使用可能なサイズで、その後にメタデータ形式が続きます。512K chunks 2 near-copiesはストライプのチャンクサイズと RAID 10 のレイアウトです。ここでは、各ブロックの 2 つのコピーを隣接して保持します。[4/4]はアレイが想定するメンバー数と、現在同期しているメンバー数です。[UUUU]はスロットごとに 1 文字を表示し、スロット順に並びます。Uは稼働中で同期済みのスロットです。_は動作しているものがないスロットです。bitmap:は write intent bitmap です。書き込み中だった領域を記録するため、脱落してから復帰したメンバーはドライブ全体ではなく、その領域だけを再同期します。
[4/3] と [UU_U] が障害時に示す意味
劣化したアレイは次のように表示されます。
md0 : active raid10 nvme3n1p3[3] nvme2n1p3[2](F) nvme1n1p3[1] nvme0n1p3[0]
3906764800 blocks super 1.2 512K chunks 2 near-copies [4/3] [UU_U]2 つの角括弧を合わせて読んでください。[4/3] は、4 つのスロットのうち 1 つがデータを提供していないことを示します。[UU_U] はそのスロットを示します。アンダースコアは 3 文字目で、スロット番号は 0 から始まるため、停止しているのは slot 2 です。(F) フラグは、故障したドライブが接続されたままの間だけデバイス名を示します。マシンから取り外すと、その名前は行から消えますが、アンダースコアは残ります。
この状態でもアレイはサービスを提供し続けます。RAID 10 では、多くの場合、ほぼ最大速度で処理を続けます。そのため、体感では障害に気付きません。別の方法で通知する必要があります。
grep -i mailaddr /etc/mdadm/mdadm.conf
sudo mdadm --monitor --scan --oneshot --test
systemctl list-units --all | grep -i mdmdadm パッケージは、/etc/mdadm/mdadm.conf から MAILADDR を読み取る監視デーモンをインストールします。unit 名はリリースによって変わっているため、推測せず、最後のコマンドで確認してください。--test の実行時には、各アレイにつき 1 通のメッセージを直ちに送信します。実行後に受信トレイが空の場合は、メール経路が壊れています。実際に必要なメッセージも同じように失われていたことになります。
交換用ドライブへの再構築中は、アレイの下に進捗行が表示されます。
md0 : active raid10 nvme4n1p3[4] nvme3n1p3[3] nvme1n1p3[1] nvme0n1p3[0]
3906764800 blocks super 1.2 512K chunks 2 near-copies [4/3] [UU_U]
[==>..................] recovery = 12.4% (242012928/1953382400) finish=63.1min speed=452000K/secrecovery は、交換用ドライブへの再構築です。resync は、新しく作成したアレイに対する最初の整合性チェックです。check は、上で実行した scrub です。括弧内の組は、デバイスごとの合計に対する 1 KiB ブロック単位の進捗を示します。finish は、現在の速度に基づくカーネルの推定値です。この速度は /proc/sys/dev/raid/speed_limit_min と speed_limit_max によって制限されます。再構築によって本番 I/O が枯渇しないように、これらの上限が設定されています。
再構築中の完全な mdadm --detail
/dev/md0:
Version : 1.2
Creation Time : Tue Mar 10 09:14:22 2026
Raid Level : raid10
Array Size : 3906764800 (3.64 TiB 4.00 TB)
Used Dev Size : 1953382400 (1.82 TiB 2.00 TB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Wed Aug 5 11:02:41 2026
State : clean, degraded, recovering
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : near=2
Chunk Size : 512K
Rebuild Status : 12% complete
Name : storage:0
Events : 4184
Number Major Minor RaidDevice State
0 259 3 0 active sync set-A /dev/nvme0n1p3
1 259 7 1 active sync set-B /dev/nvme1n1p3
4 259 11 2 spare rebuilding /dev/nvme4n1p3
3 259 15 3 active sync set-B /dev/nvme3n1p3Number 列は、/proc/mdstat の角括弧内に表示されるメタデータのインデックスです。RaidDevice 列はスロットで、[UU_U] 文字列内の位置に対応します。この例で両者が異なるのは、device 4 が slot 2 にあったドライブを置き換えたためです。set-A と set-B は、各ミラーの 2 つの側を示します。同じペア内で同じデータを保持する set-A のメンバーと set-B のメンバーを同時に失わないことが重要です。
自分が所有するアレイでドライブを交換する場合、必要なコマンドは 4 つです。最後のコマンドで確認します。
sudo mdadm --manage /dev/md0 --fail /dev/nvme2n1p3
sudo mdadm --manage /dev/md0 --remove /dev/nvme2n1p3
sudo mdadm --manage /dev/md0 --add /dev/nvme4n1p3
cat /proc/mdstatrecovery の行は、通常 1、2 秒以内に表示されます。交換用パーティションは、mdadm --detail の Used Dev Size 以上のサイズでなければなりません。少しでも小さいパーティションは、not large enough to join array の形式のメッセージとともに拒否されます。追加する前に、新しいドライブを古いドライブに合わせてパーティション分割してください。
VPS 内部から確認できることと、確認できないこと
ほとんどのゲストからホストの RAID は確認できません。これは設計上の動作です。ハイパーバイザーはゲストに 1 台の仮想ディスクを提供します。そのディスクが NVMe ドライブの RAID 10 プールから切り出されたものか、1 台のドライブ上にあるものかはホスト側の属性であり、ゲスト内部には表示されません。
systemd-detect-virt
lsblk -d -o NAME,SIZE,ROTA,MODEL
cat /proc/mdstatsystemd-detect-virt は KVM ゲストでは kvm、lxc のようなコンテナ種別では none、ベアメタルでは vda を出力します。KVM ゲストでは通常、sda 内の lsblk または /proc/mdstat が 1 つだけ表示され、/proc にアレイは表示されません。ゲスト内部にアレイが存在しないためです。
コンテナベースの VPS では、この情報を信頼できません。コンテナはホストのカーネルを共有し、mdadm の一部は namespace の対象外であるため、表示内容が自分の領域ではなくホストの状態を示すことがあります。表示内容を、自分のストレージに関する事実として扱わないでください。構成をプロバイダーに確認し、重要な場合は回答を書面で受け取ってください。
ゲスト内部から確認できるのは、割り当てられたディスクの動作です。VPS のディスクが実際に NVMe か確認する方法では、実際の情報を返すコマンドを説明しています。SSD VPS に実際に含まれるものでは、プランページのラベルが示している内容を説明しています。
VPS 内で RAID を構成すべきですか?
通常は構成しません。理由は障害ドメインです。1 台の VPS に 2 つのボリュームを接続し、mdadm でミラーリングしても、両方のボリュームが同じ物理アレイ、同じノード、同じ電源装置の配下にある可能性があります。すでに確保されている冗長性のために、すべての書き込みコストを 2 倍にしても、重要な 1 つの障害で両方のコピーを失うことになります。
プロバイダーがボリュームを別々の障害ドメインに配置していることを明記している場合や、ドライブを自分で指定できる dedicated server を使用している場合は、構成する価値があります。それ以外の場合は、マシンの外部に保存されるコピーに取り組むほうが効果的です。
RAID では防げないこと
RAID が対処できるのは、ドライブが正常に動作しなくなるという 1 つの事象です。以下はいずれも正当な書き込みです。そのため、アレイはすべてのコピーに反映し、自身を正常と報告します。
- 削除。 間違ったディレクトリで
rm -rfを実行した場合や、パス内の変数が未設定のままデプロイスクリプトを実行した場合です。アレイは正当な書き込みとして認識し、2 つのドライブに反映します。 - ランサムウェア。 暗号化は書き込みです。正常なアレイは、ミラーの両方に暗号化されたデータを保存します。
- 壊れたアプリケーション。 データベースに不正なデータを書き込むバグがあると、冗長化されたドライブにも同じ不正なデータが書き込まれます。
- ノード全体。 ホストが停止した場合や、アカウントが誤って停止された場合です。アレイが完全に正常でも、同時にアクセス不能になることがあります。
- 後から気づいた自分自身の操作。 月曜日に削除したファイルは、その時点で全ドライブから消えています。それより前に取得したコピーだけが復元に役立ちます。
同じストレージ上のスナップショットも解決策にはなりません。削除への対策にはなりますが、保存先のアレイとともに失われます。バックアップをバックアップにする性質は、別の場所に存在することです。restic による暗号化オフサーバーバックアップは、このページのもう一方の要点です。アレイはドライブが故障してもサービスの提供を継続し、restic はアレイが問題ない書き込みとして受け入れた変更によってデータが破損した場合に、データを復元します。
FAQ
RAID 10 ならバックアップは不要ですか?
いいえ。RAID 10 は、ドライブが停止した場合に備える仕組みです。ミラーの両方にすべての有効な書き込みを適用するため、削除やランサムウェアによる処理も同じ時点で冗長ドライブに反映されます。その後もアレイは正常と報告します。アレイから見ると、何も障害が発生していないためです。マシン外に保存するコピーが依然として必要です。また、コピーが機能することを確認するため、定期的に復元する必要があります。
VPS プロバイダーが RAID 5 や RAID 6 ではなく RAID 10 を選ぶのはなぜですか?
理由は2つあります。どちらも小さなランダム書き込みに関係します。パリティを書き込む場合、新しいパリティを計算する前に、古いデータと古いパリティを読み戻す必要があります。そのため、小さな書き込みでは RAID 5 で 4 回、RAID 6 で 6 回の操作が必要です。ミラーでは 2 回です。さらに、パリティの再構築では、残っているすべてのドライブを末端まで読み取ります。その間、ノード上のすべてのゲストが数時間にわたって遅くなります。一方、RAID 10 の再構築では、1台のドライブから別の1台のドライブへコピーし、他のミラーペアには影響しません。プロバイダーはその代償として容量を負担します。使用できるのは raw NVMe 容量の半分です。
/proc/mdstat の [U_] や [UU_U] は何を意味しますか?
各文字はアレイ内の1つのスロットを、スロットの順序で表します。スロットごとに1文字です。U は、そのスロットに稼働中で同期済みのメンバーがあることを示します。_ は、そのスロットで動作しているものがないことを示します。2台構成のミラーで [U_] となっている場合、2番目のスロットが停止しており、冗長性は残っていません。前にあるペアと合わせて読み取ります。[4/3] は、アレイが4台のメンバーを想定し、そのうち3台が存在することを示します。スロットの順序は mdadm --detail の RaidDevice 列と一致します。行にデバイス名が現れる順序とは一致しません。
RAID 10 アレイでは何台のドライブを失っても耐えられますか?
どのような配置でも、1台です。それを超えると、障害が発生した場所によって異なります。各ミラーペアは2台のうち1台を失っても耐えられます。そのため、8台構成のアレイでは、同じペアに2台が属さなければ、最大4台の障害に耐えられます。一方、同じペアの2台が故障すると、2台の障害で停止します。保証される台数である1台を基準に計画し、それを超える分は保護機能ではなく幸運と考えてください。
VPS 内で mdadm を使って2つのボリュームをミラーリングすべきですか?
通常は不要です。1つの VPS に接続された2つのボリュームは、同じホスト上の同じ物理アレイに配置されていることが多いためです。その場合、すべての書き込みコストが2倍になるだけで、ホスト側の RAID がすでに防いでいる障害から新たに保護されることはありません。プロバイダーが、ボリュームが別々の障害ドメインに配置されていると明示している場合に限り、実施する価値があります。それ以外では、その労力をマシン外に保存するバックアップに充ててください。