RAIDの原理 ─ ストライピング・パリティ・再構築の数理
なぜ1台壊れてもデータが残り、容量と速度はどう変わるのか。XORパリティとReed-SolomonのP+Q二重冗長、リビルド中の二次故障とURE、書き込みホールまで原理から押さえ、信頼性設計の勘所を掴めます。
- 1.RAID 0はストライピングで速度だけ、RAID 1はミラーで冗長だけ。RAID 5/6はXORとReed-Solomonのパリティで容量効率と耐故障を両立する。
- 2.RAID 5はXOR1本で1台、RAID 6はP+Qの独立な2式で2台までの同時故障を復元でき、復元は連立方程式を解くのと等価である。
- 3.大容量HDDではリビルド中の残存ディスク読み出しでUREによる二次故障が起きやすく、RAID 5の安全余裕が痩せたことがRAID 6普及の理由になっている。
RAIDが解く2つの問題
1台のディスクは「遅い」と「いつか壊れる」という2つの弱点を同時に抱えます。RAID(Redundant Array of Independent Disks)は複数台を束ね、データの並べ方を工夫することで速度と信頼性を稼ぐ技術です。鍵になる操作は2つだけ——ストライピング(データを複数台へ分散して並列化する)と冗長化(ミラーまたはパリティで失われた情報を取り戻せるようにする)です。各RAIDレベルは、この2つをどう組み合わせるかの設計点に過ぎません。
ストライプ: 連続データをチャンク単位で各ディスクへ分配
論理ブロック 0,1,2,3,4,5...
3台構成: D0=[0,3], D1=[1,4], D2=[2,5]
-> 1リクエストが複数スピンドルに分散し帯域が台数倍
冗長は「タダ」ではありません。容量・書き込み性能・復元の手間のどれかを必ず支払います。以下、各レベルがどの対価でどの保証を買っているのかを原理から見ます。
RAID 0/1/10 ─ 冗長のない速度と、ミラーの冗長
RAID 0は純粋なストライピングで、冗長は一切ありません。N台で容量N倍・帯域N倍ですが、1台でも壊れれば全データを失います。むしろ故障率は単体より悪化します(どれか1台でも死ねば全滅なので、年間故障率はおよそN倍)。速度専用と割り切る構成です。
RAID 1は同じデータを2台へ書くミラーリングです。容量は半分(実効50%)になりますが、片方が生きていれば読めます。読み出しは2台へ振り分けてスループットを上げられ、書き込みは両方へ届くまで完了しません。
RAID 10(1+0)はミラーペアを作り、そのペア群をストライピングします。各ペアが1台ずつ壊れる分には耐え、再構築は「相方からの単純コピー」で済むため後述のパリティ系より圧倒的に速く軽いのが実務上の強みです。容量効率50%という対価で、性能と復元の容易さを買う構成です。
RAID 10は最良で半数の台数まで耐えますが、保証されるのは1台までです。たまたま同じミラーペアの2台が同時に壊れると、その区画のデータは復元できません。耐えられる故障は「どの2台でも」ではなく「ペアをまたいだ故障」である点が、後述のRAID 6(任意の2台に耐える)との決定的な差です。
RAID 5 ─ XORパリティで1台分を復元する
RAID 5は、ミラーの容量効率の悪さを1台分のパリティで解決します。N台構成ならデータN-1台+パリティ1台分で、実効容量は (N-1)/N。パリティの正体は、同じストライプに属するデータブロックの**XOR(排他的論理和)**です。
4台構成・あるストライプ
P = D0 xor D1 xor D2 (パリティを計算)
D1が故障したとき
D1 = P xor D0 xor D2 (残り全部をXORすれば復元)
XORの自己逆元性(a xor a = 0、a xor 0 = a)がすべてです。両辺に同じ値をXORすれば打ち消せるので、パリティ式 P = D0 xor D1 xor D2 を変形すれば任意の1項を残りで表せます。これはECCのパリティと同じ原理を、ビットではなくブロック単位に拡大したものです。
パリティを1台へ集中させると(旧RAID 4)その1台が全書き込みのボトルネックになるため、RAID 5はパリティをストライプごとに別の台へ巡回配置します。これでどのディスクも均等に読み書きを受けます。
1ブロックだけ更新するとき、パリティを正しく保つには 新P = 旧P xor 旧D xor 新D が必要で、旧データと旧パリティの2回の読みと、新データ・新パリティの2回の書きが発生します。1論理書き込みに4回のI/Oが要るこの増幅が、RAID 5/6のランダム書き込みが遅い根本原因です。連続した全ストライプ書き込み(フルストライプライト)なら旧値を読まずに済み、ペナルティを避けられます。
RAID 6 ─ Reed-SolomonのP+Q二重パリティ
1台の冗長では、復元中にもう1台壊れると終わりです。RAID 6は独立な2つのパリティ P と Qを持ち、任意の2台までの同時故障に耐えます。Pは従来通りのXORですが、Qは単純なXORでは作れません。XORのパリティをもう1本足してもPと同じ式になり、2元連立として独立にならないからです。
そこでQはReed-Solomon符号、つまり有限体 GF(2^8) 上の重み付き和で定義します。各データに体上の異なる係数(生成元 g の冪 g^0, g^1, g^2...)を掛けて足します。
P = D0 xor D1 xor D2 xor ... (係数1の和)
Q = (g^0 *D0) xor (g^1 *D1) xor (g^2 *D2) ... (係数を変えた和)
* は GF(2^8) 上の乗算、加算はXOR
PとQは「各ディスクへの係数の付け方」が違うため、2本の一次独立な方程式になります。2台 i, j が同時に壊れても、未知数2個(Di, Dj)に対し独立式が2本あるので、連立方程式として一意に解けます。係数が全ディスクで相異なる(ヴァンデルモンド型)ことが、任意の2台の組み合わせで解が定まることを保証します。
復元は連立一次方程式を解くこと。普通の整数演算だと桁あふれや割り算の丸めで破綻しますが、GF(2^8) ならどの要素も8ビットに収まり、0以外に逆元が必ず存在するため割り算(連立の消去)が破綻なく定義できます。1バイトが体の1要素にちょうど対応するのも実装上の利点で、乗算は対数・反対数テーブルで高速化できます。チップキルやQRコード等でも使われるReed-Solomonと同じ数学基盤です。
| レベル | 最小台数 | 実効容量 | 耐故障 | 書込特性 |
|---|---|---|---|---|
| RAID 0 | 2 | 100% | 0台(悪化) | 最速・冗長なし |
| RAID 1 | 2 | 50% | 1台 | 両系へ書込 |
| RAID 5 | 3 | (N-1)/N | 1台 | 小書込で4 I/O |
| RAID 6 | 4 | (N-2)/N | 任意2台 | P+Qで更に重い |
| RAID 10 | 4 | 50% | ペア跨ぎ複数 | 高速・復元容易 |
リビルド時間とUREによる二次故障
ディスクが1台壊れると、ホットスペアへ向けて**リビルド(再構築)**が走ります。RAID 5/6の再構築は、残った全ディスクの同一ストライプを総ナメしてパリティ式から欠損を計算し直す処理です。ここに2つの増大するリスクがあります。
第一に時間。再構築は容量に比例し、十数TBのHDDでは全域の読み書きに丸一日以上かかることも珍しくありません。その間アレイは冗長を失った(または減らした)裸の状態で運転され、二次故障の窓が長く開きます。
第二にURE(Unrecoverable Read Error、回復不能読み取りエラー)。HDDには「読んだビット数あたり一定確率でセクタが読めない」という公称値があり、コンシューマ向けで 10^14 ビットに1回程度です。問題は、RAID 5のリビルドが残存ディスク全域を完全に読み切る必要がある点です。
URE 1e-14、12TB級ディスク数台を読み切る試算
12TB = 約 9.6e13 ビット/台
これを複数台ぶん読む間に URE に当たる確率は無視できない大きさになる
-> RAID 5 ではリビルド中の1セクタ読み失敗が、
そのストライプの復元失敗(=二次的なデータ欠損)に直結する
つまり大容量HDDでは、2台目が「故障」しなくても1台の故障+リビルド中のUREだけでRAID 5が破綻しうるのです。RAID 6(P+Q)が事実上の標準になったのは、片肺リビルド中にUREや2台目の故障が起きても、もう1本の独立式が残るからです。エンタープライズ向けディスクが 10^15 以上の低UREを謳うのも同じ動機です。
再構築は残存ディスクを全域フルスキャンするため、もともと劣化していた他の台に最も過酷な読み出し負荷をかけ、同時期に製造・運用された同型ディスクが連鎖故障しやすい局面でもあります。容量が増えるほどリビルド窓が延びてこの危険が増すため、定期スクラブ(全域を先読みしてUREを早期発見・修復する巡回検査)とホットスペアの常備が実務の前提になります。
書き込みホールとライトバック保護
パリティRAIDには、停電・クラッシュ起因の書き込みホール(write hole)という固有の弱点があります。データブロックとパリティブロックは別ディスクにあり、その両方をアトミックには書けません。データだけ書けてパリティ未更新、あるいはその逆の瞬間に電源が落ちると、ストライプ内でデータとパリティが整合しない不整合状態になります。
危険な瞬間
1. 新データを D1 へ書込(成功)
2. ここで停電 ← パリティ P は旧データ前提のまま
結果: P != D0 xor D1(新) xor D2 -> パリティが嘘をつく
この状態で別の D0 が故障すると
D0 を「壊れたパリティ」から復元 -> 誤った値を正解として再生
(サイレントなデータ破壊)
怖いのは、不整合自体はすぐには表面化せず、後でそのストライプの別ディスクが壊れて初めて誤復元という形で顕在化する点です。これを防ぐ代表的な手法が次の3つです。
- 不揮発ライトバックキャッシュ保護:RAIDコントローラのキャッシュをバッテリ(BBU)またはフラッシュ+スーパーキャパシタで保護し、停電してもデータ+パリティを電源復帰後に書き切ってストライプを完成させる。保護のないライトバックは性能のために整合性を賭ける危険な設定。
- ジャーナル/インテントログ:書き込み前に「これからこのストライプを更新する」と専用領域へ記録し、復帰時に未完了ストライプだけパリティを再計算(mdraid のジャーナルデバイスや専用ログ)。
- コピーオンライトでの根本回避:ZFS(RAID-Z)等は既存ストライプを上書きせず常に新ストライプとして書くため、原理的に書き込みホールが発生しない。
「RAID 5=XORで1台、RAID 6=Reed-SolomonのP+Qで任意2台」「RAID 5の小書込はRead-Modify-Writeで4 I/O」「実効容量は5が (N-1)/N、6が (N-2)/N、1/10が50%」「大容量HDDのリビルド+UREでRAID 5の安全余裕が痩せRAID 6が標準化」「書き込みホールはBBU/フラッシュ保護のライトバックやCoW(ZFS)で防ぐ」の対応を押さえましょう。
まとめ
- RAIDは**ストライピング(速度)と冗長化(信頼性)**の組み合わせで、各レベルは容量・性能・復元手間のどれを支払うかの設計点に過ぎない。
- RAID 5はXORの自己逆元性で1台分を復元し、RAID 6は
GF(2^8)上のReed-SolomonでP+Qの独立2式を持ち、任意2台の故障を連立方程式として解いて復元する。 - 大容量HDDではリビルド時間の長さとUREが二次故障の窓を広げ、RAID 5の安全余裕を痩せさせたことがRAID 6普及の数理的背景である。
- 書き込みホールはデータとパリティを非アトミックに書く構造的弱点で、不揮発ライトバックキャッシュ保護・ジャーナル・CoW(ZFS)で整合性を守る。
ビット単位で同じ発想に立つECCとReed-Solomonの数理、UREが生じるHDDの記録原理、SSDで様相が変わるNANDフラッシュの内部を併せて読むと、信頼性設計の全体像が立体的に掴めます。
CPU/メモリ/ディスク Article
RAIDの原理 ─ ストライピング・パリティ・再構築の数理を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
RAID
比較で見る軸
難易度: advanced / カテゴリ: CPU/メモリ/ディスク / タグ数: 6
導入後に効く点
RAID 5はXOR1本で1台、RAID 6はP+Qの独立な2式で2台までの同時故障を復元でき、復元は連立方程式を解くのと等価である。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- CPU/メモリ/ディスク
- タグ数
- 6
判断チェックリスト
- 自社の用途が「RAID / パリティ」に近いか確認する。
- 強みである「RAID 0はストライピングで速度だけ、RAID 1はミラーで冗長だけ。RAID 5/6はXORとReed-Solomonのパリティで容量効率と耐故障を両立する。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。