1、RAIDとは
複数のストレージ(HDD・SSD)を組み合わせて仮想的な1台のストレージとして運用する技術。一部が故障しても稼働を継続させることを主な目的とし、データを重複させて保存する「冗長化」を行う。これにより、一部のデータが消失・破損しても、重複データから直ちに復旧することも可能。ただし、削除・編集したデータを元の状態に戻すことはできないうえ、全損した場合は復旧不能となる。それらに備えるためにはバックアップが必要である。
RAIDには正式名称が2種類ある
・Redundant Array of Inexpensive Disks(安価なディスク)
・Redundant Array of Independent Disks (独立したディスク)
RAIDが提案された1980年代後半は、大容量で高性能なストレージは大変高価だった。そこで研究者たちは「安価なストレージを組み合わせて大容量を実現できないか」と考えた。更に冗長性を持たせて、信頼性の高い安価で大容量のストレージシステムとして開発された。
その後、技術の進歩とともにストレージは単体でも安価で大容量になり、RAIDから「安価」という印象は薄れていった。1990年代には、複数のストレージを組み合わせて性能を向上させることに焦点が置かれ、「独立したディスク」という表現が主流になった。
2、RAID0(ストライピング)
複数台のストレージにデータを分散して書き込む手法。書き込み・読み出しを複数台で同時に行うため、ストレージが多いほど処理が高速になる。性能を最大限に発揮させるためには、使用するデータとストレージの構成を最適化する必要がある。
- データとストレージの構成
- ブロックサイズ
- アプリケーションが扱うデータ単位。この値を起点とする。
- クラスタサイズ
- ファイルシステムが扱うデータ単位。ブロックサイズと同数か約数にし、無駄なくストライプに格納できるようにする。かつ、セクタサイズと同数か倍数にし、データの配置場所がずれないようにする。
- ストライプサイズ
- RAIDコントローラがデータを分散させる際の単位。ブロックが分裂しないよう、ブロックサイズと一致させる。
- セクタサイズ
- 物理ディスクが扱うデータ単位。4KBが主流。
冗長性がなく、それを明示するために「0」が振られている。1台でもストレージが故障すると全体が使用不能となるため、故障率はストレージが多いほど高い。故障のリスクをカバーするために、他のRAIDと組み合わせることも多い。
RAID0の故障率の計算式
[RAID0の故障率]=1-[1台も故障しない確率]
[1台も故障しない確率]=(1-[ストレージ1の故障率])×(1-[ストレージ2の故障率])…
故障率が2%のストレージ2台の場合は、
1-0.98×0.98=0.0396≒4%
3、RAID1(ミラーリング)
2台のストレージに同時に同じ内容を書き込む手法。ストレージが同時に故障しなければ稼働可能なため、データの保護・冗長性の提供を目的に使用される。ただし、容量はストレージ1台分となる。
別々の読み出し要求を同時に処理できるため、ランダムアクセスの場合読み出し速度が向上しやすい。書き込み量は2倍になるため、書き込み速度は単体と同様かやや低下する。
RAID1の故障率の計算式
[RAID1の故障率]=[全台が故障する確率]
[全台が故障する確率]=[ディスク1の故障率]×[ディスク2の故障率]…
故障率が2%のディスク2台の場合は、
0.02×0.02=0.0004=0.04%
4、RAID0とRAID1の組み合わせ
RAID0とRAID1は相性が良く、お互いの機能を補強することができる。最小4台のディスクを必要とし、読み書きが高速であるが容量効率は50%となる。4台で構成した場合はRAID01は1台まで、RAID10は最大2台までの故障に耐えることができる。現在ではRAID10が主流であり、RAID01は耐障害性が低いためほとんど使われない。
- RAID01(ストライピング<ミラーリング)
- RAID1
- ∟RAID0
- ∟Disk0[A1,A3,A5,A7]
- ∟Disk1[A2,A4,A6,A8]
- ∟RAID0
- ∟Disk2[A1,A3,A5,A7]
- ∟Disk3[A2,A4,A6,A8]
- ∟RAID0
- RAID10(ミラーリング<ストライピング)
- RAID0
- ∟RAID1
- ∟Disk0[A1,A3,A5,A7]
- ∟Disk1[A1,A3,A5,A7]
- ∟RAID1
- ∟Disk2[A2,A4,A6,A8]
- ∟Disk3[A2,A4,A6,A8]
- ∟RAID1
5、RAID2
ハミング符号を用いて高精度なエラー修正を行う手法。1ビット単位で誤り箇所の特定・自動訂正が可能であるが、誤り検出コードを大量に使用するため専用ストレージが設けられている。ストレージ構成は最低5台(データ用2台、誤り検出コード用3台)で、データはビット単位に分割されデータ用のストレージに分散される。
現代ではストレージには誤り訂正機能が搭載されており、RAID2はほとんど使用されない。
6、RAID3
RAID2から誤り検出方式を「パリティチェック」に変更したもの。ブロックごとに誤りの有無の検出のみが可能となり、性能はハミング符号よりも低下する。代わりに、誤り検出コードが減るため専用ストレージが1台で済み、ストレージ構成は最低3台(データ用2台、パリティ用1台)となる。ブロックデータはバイト単位に分割されデータ用のストレージに分散される。
ただ、性能の低下を招くことが多く実用化されなかった。RAID3では、各ストレージの同じアドレスにあるデータからパリティを計算している。読み書きの際には、パリティチェックのためにそれらに同時にアクセスする必要があり、HDDでは全てのストレージの回転を同期させている。汎用的なサーバやPCはランダムアクセスが多く、分割されたブロックデータは複数のストレージの不規則な位置に格納される。このブロックを読み出し更新すると、分割したデータごとにパリティが計算し直され、複数のストレージからパリティの書き換え要求が同時に発生する。パリティ用のストレージは1台しかないため待ち行列ができてしまう。
7、RAID4
RAID3から、データ分割の単位をブロック単位に変更したもの。パリティチェックもブロック単位で行うようにし、HDDで必要だった回転の同期が不要になった。ただし、ブロックの更新が頻発するとパリティの書き換え要求の待ち行列が発生してしまい、この課題は解消されなかった。
8、RAID5
RAID4から、パリティも各ストレージに分散するように変更し、パリティの書き換え要求が1台のストレージに集中する現象を解消させたもの。ストレージは最低3台必要であり、パリティの保存領域としてストレージ1台分を使用する。パリティチェックには、全てのストレージの同じアドレスのデータを使用する。1台まではストレージが故障しても、稼働・パリティ計算による復旧が可能。
3台構成のRAID5にデータを格納した場合
ストレージ1:データA|データC|パリティ3|データG|
ストレージ2:データB|パリティ2|データE|データH|
ストレージ3:パリティ1|データD|データF|パリティ4|
※パリティ1の計算にはデータA・データBを使用する
また、「ソフトウェアRAID」よりも「ハードウェアRAID」が推奨されている。RAID5はパリティ演算の負荷が高く、ソフトウェアRAIDでは他のCPU処理が低下してしまう。
9、RAID6
RAID5からパリティをもう1種類増やし、2台までの故障に耐えられるようにしたもの。ストレージの大容量化が進み、ディスクが1台故障した時、再構築に失敗してしまう可能性が高まった背景がある。最低4台のストレージを必要とし、パリティ用にストレージ2台分の容量を使用する。
10、その他
URE(回復不能な読み取りエラー)
使用期間の長期化や物理的損傷によって、特定のセクタが読み出せなくなること。UREが発生していると、ストレージが故障した際再構築に失敗してしまう。現在のRAID製品では「スクラビング」という定期スキャンが標準で有効になっており、不良セクタを早期に発見できるようになっている。
書き込みホール
システム障害などによって異常終了した場合に発生する、データとパリティの不整合のこと。データの書き込みと同時にパリティの更新も行う必要があるため、両方の処理が完了しなければ、パリティ演算が合わなくなってしまう。
実際には、現代では書き込みホールはほとんど起こらない。書き込みが中断された場合、ハードウェアRAIDでは途中のデータはキャッシュメモリに退避させる仕様となっている。ソフトウェアRAIDでは、未使用ブロックに書き込みを行い、完了するとメタデータ(データの位置情報)を更新する。その他の対策として無停電電源装置を取り付け、物理的に異常終了に備えておくのも有効。