【基本/応用情報技術者試験】RAIDとは?

サムネイル 基本/応用情報技術者試験

RAIDとは、複数のディスクを組み合わせてデータの安全性やアクセス速度を向上させる技術です。

以下では、RAIDの基本的な概念と、RAID0,1,5の各レベルの特徴について詳しく説明します。後半では、実際にファイルを「ディスク」に見立てたプログラムを書いて、RAID5が本当に1台故障から復旧できるのかを実測で確認します。

RAIDとは?

RAID(Redundant Array of Independent Disks)は、複数のハードディスクを組み合わせて、仮想的な1つのハードディスクとして扱う技術です。

これにより、ハードディスクの高速化や、データの信頼性向上をさせることができます。RAIDには複数のレベルがあり、それぞれ異なる特徴を持っています。

重要なのは、高速化のRAID0、信頼性向上のRAID1、バランス型のRAID5です!

この3つさえ覚えれば、基本情報技術者試験のRAID対策はばっちりです!

RAID0:高速化

RAID0の説明画像

RAID0は、ひとつのデータを2台以上のディスクに分散させて書き込みます。

また、データを複数のディスクに分散して書き込む「ストライピング」を行います。

これにより、読み書き速度が向上しますが、冗長性がないため、一つのディスクが故障するとすべてのデータが失われてしまいます

特徴

  • 少なくとも2台のディスクが必要
  • データ分散による高速化
  • 冗長性がないため、故障時のリスクが高い

RAID1:信頼性向上

RAID1の説明画像

RAID1は、2台以上のディスクに対して常に同じデータを書き込みます。

また、同じデータを複数のディスクに書き込む「ミラーリング」を行います。

これにより、データの冗長性が確保されるので、1台のディスクが故障してもデータを失うことはありません

特徴

  • 少なくとも2台のディスクが必要
  • データの冗長性が高いので、信頼性が高い
  • 読み出し速度は向上するが、書き込み速度は単体ディスクと同じ

RAID5:高速化&信頼性向上

RAID5の説明画像

RAID5は、3台以上のディスクを使って、データと同時にパリティと呼ばれる誤り訂正符号も分散させて書き込みます。

また、データとパリティ情報を複数のディスクに分散して保存します。

これにより、1台のディスクが故障してもデータを復元することができます

RAID5は、性能と信頼性のバランスが良く、広く使用されています。

特徴

  • データとパリティ情報が分散されているため、1台のディスク故障に対応
  • 速度と信頼性が向上
  • 少なくとも3台のディスクが必要

ここまでは仕組みの説明です。「パリティで本当に復旧できるのか」を、実際に手元でファイルを「ディスク」に見立てて確かめてみましょう。

【実測】RAID0・RAID1・RAID5を実際に動かして確認する

3つのファイルを「ディスク」に見立てて、それぞれの方式でデータを書き込み、実際にファイルを1つ消してから復元を試すプログラムを書きました。RAID0は復元できないこと、RAID1・RAID5は復元できることを、想像ではなく実行結果で確認します。

▼raid_demo.cpp(RAID5の中核部分)

// データを半分に分け、XOR(排他的論理和)でパリティを作る
size_t half = src.size() / 2;
std::vector<uint8_t> dA(src.begin(), src.begin() + half);
std::vector<uint8_t> dB(src.begin() + half, src.end());
std::vector<uint8_t> parity(half);
for (size_t i = 0; i < half; i++) parity[i] = dA[i] ^ dB[i];

WriteWhole("raid5_diskA.bin", dA);
WriteWhole("raid5_diskB.bin", dB);
WriteWhole("raid5_diskP.bin", parity);

// diskBが壊れた(消えた)場合、diskAとパリティのXORだけで復元する
remove("raid5_diskB.bin");
std::vector<uint8_t> rA, rP;
ReadWhole("raid5_diskA.bin", rA);
ReadWhole("raid5_diskP.bin", rP);
std::vector<uint8_t> rebuiltB(half);
for (size_t i = 0; i < half; i++) rebuiltB[i] = rA[i] ^ rP[i];

「Aとパリティが分かれば、消えたBがXORだけで元通りになる」というのがRAID5の核心です。実際に実行した結果がこちらです。

元データ: 0123456789ABCDEF0123456789ABCDEF (32バイト)

[RAID0] 2台のディスクに1バイトずつ交互に分散
  disk0: 16バイト  disk1: 16バイト
  正常時の復元: 0123456789ABCDEF0123456789ABCDEF  (一致: OK)
  disk1を削除して復元を試みる -> 奇数バイトが失われ、元データは復元不能
  disk0だけから読める内容: 0_2_4_6_8_A_C_E_0_2_4_6_8_A_C_E_

[RAID1] 2台のディスクに同じ内容を書き込む
  disk0を削除 -> disk1から復元: 0123456789ABCDEF0123456789ABCDEF  (一致: OK)

[RAID5] 3台のディスクにデータ2つ分+XORパリティ1つを分散
  diskA: 16バイト  diskB: 16バイト  diskP(パリティ): 16バイト
  diskBを削除 -> diskA と パリティ の XOR で再構築: 0123456789ABCDEF0123456789ABCDEF
  元データと一致: OK(1台故障からの復旧に成功)

結果を見ると違いがはっきりします。RAID0はdisk1を消した時点で「0_2_4_6…」のように偶数バイトしか残らず、二度と元の文字列には戻せません(ストライピングは速度と引き換えに冗長性を捨てているため)。一方RAID1はミラーの片方が消えても、もう片方から完全に同じ内容が読めます。そしてRAID5はデータそのものを1台失っても、残ったデータとパリティのXORだけで元の32バイトが寸分違わず再現されました。教科書の説明を鵜呑みにせず、実際にファイルを消して試すと、パリティという言葉が急に具体的になります。

よくある勘違いと注意点

  • RAIDはバックアップの代わりにはならない
    → 今回のRAID5のように1台の故障には強いですが、誤って上書き・削除した場合や、火災・盗難などの物理的な喪失には対応できません。別途バックアップが必要です。
  • RAID0を「高速だから」と安全な用途に使ってしまう
    → 実測のとおり、RAID0は1台消えただけで残りのデータも実用上復元不能になります。一時ファイルやキャッシュなど、消えても困らないデータ専用と考えるべきです。
  • RAID5は「2台同時に」壊れると復旧できない
    → 今回の実験はあくまで1台故障のケースです。パリティは1台分の情報しか持っていないため、同時に2台失うとRAID0と同じく復旧できません。

おわりに

RAIDは、2,3,4,10…など、ほかにも多く存在しますが、基本情報技術者試験に出題されるのは、RAID0,1,5がメインですので、今回はRAID0,1,5のみ解説させていただきました!

「パリティで復旧できる」という説明は多くの解説サイトに載っていますが、実際にファイルを消して復元できるかまで試したものは意外と少ないです。気になった方は、ぜひ同じようにXORで自作して試してみてください。

この記事が皆様の学習に役立てば幸いです!

ここまで読んでくださり、ありがとうございました!