RAID
RAIDとはRedundant Array of Inexpensive(Independent) Disksの略です。
つまり、安いDiskを複数用いて冗長性のあるArray(Drive)を作ることです。
RAID0
RAID0はストライピングとも呼ばれます。
データを複数のDiskに分散して配置することで読み込み/書き込み速度を向上します。
データはストライプサイズと呼ばれるブロック単位で分割されます。
RAID0は冗長性がないためDiskエラーが発生した場合はすべてのデータが失われます。
理論的には読み出し/書き込み速度はDisk単体の速度×Disk台数になります。
RAID1
RAID1はミラーリングとも呼ばれます。
同じデータを2つのDiskに書き込むことで、1つのDiskにエラーが発生した場合でもデータは失われません。
また、1部のArrayControllerを除き、読み出し/書き込みともにDisk単体の速度と同じです。
(ものによっては書き込み速度はDisk単体よりも劣る場合があります)
RAID2
RAID2はハミングコードと呼ばれるエラー訂正コードを付加することにより、Nビットのエラー訂正を可能にします。
データはビット単位で処理されます。しかし、ハードウェアが複雑になる等の理由からほとんど実用化されていません。
ハミングコードによるエラー訂正ビット数はDiskの台数により異なります。
1bitのエラー訂正のためのハミングコードと必要なDisk台数は以下の通りです。
| Data |
1disk |
2disk |
3disk |
4disk |
5disk |
6disk |
7disk |
8disk |
| HammingCode |
2disk |
3disk |
3disk |
3disk |
4disk |
4disk |
4disk |
4disk |
| Total |
3disk |
5disk |
6disk |
7disk |
9disk |
10disk |
11disk |
12disk |
ハミングコードによりエラー訂正の仕組みは以下のようになっています。
まず、以下のような4ビットのデータ列と3ビットハミングコードを考えます。
この4ビットのデータに対しXOR演算をして3ビットのハミングコードを生成します。
これを以下のような順序でDiskに書き込みます。(実際には順序はどうでもよいが、分かりやすい順序にしてあります)
ここで7ビットのデータにエラーが発生したとします。このデータに対して以下のXOR演算をします。
ここで、もともと
p0 xor d0 xor d1 xor d3 = 0
p1 xor d0 xor d2 xor d3 = 0
p2 xor d1 xor d2 xor d3 = 0
となるようになっていたのでe0〜e2の値でエラービット位置がわかります。(分かりやすく言うと、e0が1の場合はp0,
d0, d1, d3のどれかがウソ。さらにe1が0であれあばp1, d0, d2, d3はホントなのでp0,
d1のどちらかがウソ。最後にe2が1であればp2, d1, d2, d3のどれかかがウソなので、最終的にウソなのがd1であることが分かる)
e0, e1, e2とエラービット位置関係は以下のようになります。
RAID3
RAID3はRAID2のエラー訂正を簡易化したものです。
RAID3はビット/バイト単位で処理され、ハミングコードの代わりにパリティビット/バイトを使用します。
パリティはハミングコードのときと同様にXORで求めます。
Diskにエラーが発生した場合は以下のようにパリティとその他データから逆算できます。
RAID4
RAID4はRAID3の処理単位をブロック単位にしたものです。
RAID4はパリティドライブに負担がかかるため、現在ではあまり使用されていません。
読み出しはストライプ効果で高速ですが、書き込みはパリティドライブにアクセスが集中するためあまり速くありません。
RAID5
RAID5は分散データガーディングとも呼ばれ、RAID4を改良したものです。
RAID4ではパリティドライブが固定でしたが、RAID5ではパリティドライブをブロックごとにシフトさせることによりパリティドライブへのアクセスの集中を防いでいます。
RAIDレベルの中では現在もっとも普及していると思われます。
RAID5ではパリティ生成時にデータおよびパリティの読み出しが入るため、書き込み速度は遅くなります。
よく、RAID5では書き込み時にすべてのデータを読み出してからパリティを生成して書き込むためオーバヘッドが大きいと言われますがほんとにそうなんでしょうか。すこし考えてみましょう。
RAID5では最初にバックグラウンド初期化が行われます。
このときはすべてのデータドライブを読み出してXORパリティを書き込みます。
ここでBのデータが書き換えられたとします。
いちばん簡単な方法はB以外のデータをすべて読み出してXORパリティを生成することです。
この方法だと
読み出し×4+書き込み×2+XOR×4
が必要です。
しかし、現在のXORパリティからBを引いて(XORして)、新しいB'をXORしなおせば同じことが実現できます。
この方法だと
読み出し×2+書き込み×2+XOR×2
で処理が終わります。
もちろん、すべてのRAID Controllerがそうとは限りません。特に信頼性を重視する場合はすべて読み出すことも考えられます。
RAID10
RAID10はRAID0+1とも呼ばれます。
RAID1の論理ドライブ(LogocalDrive)に見立てて、論理ドライブでRAID0を構成することによりRAID1の欠点(容量、速度)を補います。ものによってはRAID0ボリュームをRAID1でミラーする場合もあります。
RAID50
RAID50はRAID10と同様にRAID5のボリュームをRAID0でストライプします。
RAID50の場合はデータはストライプされていますので、RAID5ボリュームをストライプしてもあまりうれしくありません。(多少はうれしい)
RAID50の場合はどちらかというとデータ保護のためにストライプします。
RAID5は1台までのエラーの場合はデータは保護されますが、2台以上同時エラーになった場合は保護されません。とくにSCSIの場合はエラーになったドライブがバスをロックして同一バス上のドライブを巻き込むこともありえます。
そこで各チャネルをまたぐようにRAID5ボリュームを構成し、それをRAID0でストライプしておけば1つのバス上のドライブが全滅した場合でもデータが保護できます。