概要
本記事では、RAID0・RAID1・RAID5・RAID6 といった RAID の各レベルについて、それぞれの特徴や違いを整理したうえで、Linux 環境において実際に RAID を構築し、障害発生時の挙動を検証しました。
仮想ディスクを用いて RAID を構成し、ディスク障害を意図的に発生させることで、各 RAID レベルにおける使用可能容量や耐障害性、読み書き可否の違いを確認しています。
RAIDについて
RAID0
データを複数ディスクに分割して高速化するものの、冗長性が一切ない構成です。
RAID1
同じデータを複数ディスクにそのまま複製し、耐障害性を高める構成です。
RAID5
データとパリティを複数ディスクに分散配置し、1台のディスク故障に耐えつつ容量効率も確保する構成です。
パリティは、ディスク故障時に失われたデータを復元するための冗長情報です。
例えば、HDD1が故障した時に、B,C,PをもとにAを復元することができます。
RAID6
データと二重パリティを分散配置し、同時に2台のディスク故障にも耐えられる高い耐障害性を持つ構成です。
RAIDの準備
仮想ディスクの追加
1GBの仮想ディスクを4本追加し、VMからは別々のブロックデバイスとして認識されるようにします。
これにより、VM内部でソフトウェアRAIDを構成できるようになり、仮想的に複数のHDDが存在する環境を再現しています。
RAID0
RAID0作成
sudo mdadm --create /dev/md0 \
--level=0 \
--raid-devices=4 \
/dev/sdb /dev/sdc /dev/sdd /dev/sde
ファイルシステム作成・マウント
sudo mkfs.ext4 /dev/md0
sudo mkdir -p /mnt/raidtest
sudo mount /dev/md0 /mnt/raidtest
データ書き込み
$ echo "RAID0 OK" | sudo tee /mnt/raidtest/test.txt
RAID0 OK
RAID1
RAID1作成
sudo mdadm --create /dev/md1 \
--level=1 \
--raid-devices=4 \
/dev/sdb /dev/sdc /dev/sdd /dev/sde
ファイルシステム作成・マウント
sudo mkfs.ext4 /dev/md1
sudo mkdir -p /mnt/raidtest
sudo mount /dev/md1 /mnt/raidtest
データ書き込み
$ echo "RAID1 OK" | sudo tee /mnt/raidtest/test.txt
RAID1 OK
RAID5
RAID5作成
sudo mdadm --create /dev/md5 \
--level=5 \
--raid-devices=4 \
/dev/sdb /dev/sdc /dev/sdd /dev/sde
ファイルシステム作成・マウント
sudo mkfs.ext4 /dev/md5
sudo mkdir -p /mnt/raidtest
sudo mount /dev/md5 /mnt/raidtest
データ書き込み
$ echo "RAID5 OK" | sudo tee /mnt/raidtest/test.txt
RAID5 OK
RAID6
RAID6作成
sudo mdadm --create /dev/md6 \
--level=6 \
--raid-devices=4 \
/dev/sdb /dev/sdc /dev/sdd /dev/sde
ファイルシステム作成・マウント
sudo mkfs.ext4 /dev/md6
sudo mkdir -p /mnt/raidtest
sudo mount /dev/md6 /mnt/raidtest
データ書き込み
$ echo "RAID6 OK" | sudo tee /mnt/raidtest/test.txt
RAID6 OK
使用可能な容量の確認
RAID0
4G 利用することができ、容量を100%利用できます。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb 8:16 0 1G 0 disk
└─md0 9:0 0 4G 0 raid0
sdc 8:32 0 1G 0 disk
└─md0 9:0 0 4G 0 raid0
sdd 8:48 0 1G 0 disk
└─md0 9:0 0 4G 0 raid0
sde 8:64 0 1G 0 disk
└─md0 9:0 0 4G 0 raid0
RAID1
1G しか利用できません。
全てのハードディスクに同じデータをコピーするため、利用できる容量はハードディスク1台分の容量になります。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb 8:16 0 1G 0 disk
└─md1 9:1 0 1022M 0 raid1
sdc 8:32 0 1G 0 disk
└─md1 9:1 0 1022M 0 raid1
sdd 8:48 0 1G 0 disk
└─md1 9:1 0 1022M 0 raid1
sde 8:64 0 1G 0 disk
└─md1 9:1 0 1022M 0 raid1
RAID5
3G 利用できます。
1台分をパリティに使うため、1G * 4台 - 1G = 3Gになります。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb 8:16 0 1G 0 disk
└─md5 9:5 0 3G 0 raid5
sdc 8:32 0 1G 0 disk
└─md5 9:5 0 3G 0 raid5
sdd 8:48 0 1G 0 disk
└─md5 9:5 0 3G 0 raid5
sde 8:64 0 1G 0 disk
└─md5 9:5 0 3G 0 raid5
RAID6
RAID5よりも少なく、2G利用できます。
2台分をパリティに使うためです。
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb 8:16 0 1G 0 disk
└─md6 9:6 0 2G 0 raid6
sdc 8:32 0 1G 0 disk
└─md6 9:6 0 2G 0 raid6
sdd 8:48 0 1G 0 disk
└─md6 9:6 0 2G 0 raid6
sde 8:64 0 1G 0 disk
└─md6 9:6 0 2G 0 raid6
障害時の挙動
概要
例えば、以下のようにして sdb や sdc を利用できない状態にした際に、ファイルシステムのマウント先ディレクトリへの読み込みや新規書き込みの様子が各RAIDレベルごとにどう異なるかを検証していきます。
echo 1 | sudo tee /sys/block/sdb/device/delete
echo 1 | sudo tee /sys/block/sdc/device/delete
RAID0
上記のコマンドで、sdb のみ利用できないようにします。
この時、先ほど作成したtest.txtを表示しようとするとI/O Errorになります。
これは、deleteした sdb 側にtest.txt の中身(データブロック)の一部があるためだと考えられます。
$ cat /mnt/raidtest/test.txt
cat: /mnt/raidtest/test.txt: Input/output error
また、ログを見ると md0 の不具合を検知し、その結果として、ファイルシステムをread-onlyに退避していることがわかります。
$ sudo dmesg | tail -n 20
[ 1727.212751] md/raid0md0: Disk failure on sdb detected, failing array.
[ 1798.127987] Aborting journal on device md0-8.
[ 1798.128004] Buffer I/O error on dev md0, logical block 196608, lost sync page write
[ 1798.128015] JBD2: I/O error when updating journal superblock for md0-8.
[ 1803.310612] EXT4-fs error (device md0): ext4_journal_check_start:84: comm ls: Detected aborted journal
[ 1803.310642] Buffer I/O error on dev md0, logical block 0, lost sync page write
[ 1803.310652] EXT4-fs (md0): I/O error while writing superblock
[ 1803.310659] EXT4-fs (md0): Remounting filesystem read-only
新たにファイルを作成しようとするとエラーになります。
read-onlyなので通常権限で作成しようとすると権限エラーに、特権権限で作成しようとするとI/O Errorとなります。
$ touch /mnt/raidtest/test2.txt
touch: cannot touch '/mnt/raidtest/test2.txt': Permission denied
$ sudo touch /mnt/raidtest/test2.txt
touch: cannot touch '/mnt/raidtest/test2.txt': Input/output error
RAID1
同様に、sdb が利用できない状態を作ります。
この時、RAID0と異なり、ファイル読み込みをできることが確認できます。
$ cat /mnt/raidtest/test.txt
RAID1 OK
新規書き込みもできることが確認できます。
$ echo "still alive" | sudo tee /mnt/raidtest/test2.txt
still alive
$ cat /mnt/raidtest/test2.txt
still alive
sdc や sdd が利用できない状態にしたとしても、RAIDを構成する仮想ディスクが一本でも正常であれば問題なくデータの読み書きを行うことができ、耐障害性に優れています。
RAID5
1台分をパリティに使っているため、1台壊しても問題ないですが、sdb と sdc といった形で2台を壊すと I/O Errorが出てくるようになりました。
$ cat /mnt/raidtest/test.txt
cat: /mnt/raidtest/test.txt: Input/output error
また、新規の書き込みができないことを確認できます。
$ echo "still alive" | sudo tee /mnt/raidtest/test3.txt
tee: /mnt/raidtest/test3.txt: Input/output error
still alive
$ cat /mnt/raidtest/test3.txt
cat: /mnt/raidtest/test3.txt: No such file or directory
ログを確認すると、RAID5 で許容できる 1台故障を超えて、2台目が故障したため、ext4 のジャーナルが破壊され、ファイルシステムが read-only に退避していることがわかります。
ryu@k8s-worker-3:~$ sudo dmesg | tail -n 20
[45895.119763] md/raid:md5: Disk failure on sdc, disabling device.
[45895.119777] md/raid:md5: Cannot continue operation (2/4 failed).
[45895.377702] Buffer I/O error on dev md5, logical block 417, lost async page write
[45918.284988] Aborting journal on device md5-8.
[45918.285028] Buffer I/O error on dev md5, logical block 327680, lost sync page write
[45918.285039] JBD2: I/O error when updating journal superblock for md5-8.
[45918.285048] EXT4-fs error (device md5) in ext4_orphan_add:188: IO failure
[45918.285063] EXT4-fs error (device md5) in ext4_reserve_inode_write:5792: Journal has aborted
[45918.285073] EXT4-fs error (device md5): ext4_setattr:5474: inode #13: comm tee: mark_inode_dirty error
[45918.285095] EXT4-fs error (device md5) in ext4_setattr:5487: IO failure
[45918.285104] EXT4-fs error (device md5) in ext4_setattr:5535: IO failure
[45918.285365] Buffer I/O error on dev md5, logical block 0, lost sync page write
[45918.285380] EXT4-fs (md5): I/O error while writing superblock
[45941.071894] EXT4-fs error (device md5): ext4_journal_check_start:84: comm ls: Detected aborted journal
[45941.071924] Buffer I/O error on dev md5, logical block 0, lost sync page write
[45941.071935] EXT4-fs (md5): I/O error while writing superblock
[45941.071942] EXT4-fs (md5): Remounting filesystem read-only
RAID6
sdb や sdc といった2台を壊しても問題なく読み書きを行うことができました。2台分をパリティに使っているためです。
例えば、ファイルが読めることを確認できます。
$ cat /mnt/raidtest/test.txt
RAID6 OK
新規書き込みができることも確認できます。
$ echo "still alive" | sudo tee /mnt/raidtest/test3.txt
still alive
$ cat /mnt/raidtest/test3.txt
still alive
ログを見ると、2台目のディスク故障を検知してもなお動作継続していることがわかります。
$ sudo dmesg | tail -n 20
[ 145.212143] md: md127 stopped.
[ 353.275237] md/raid:md6: not clean -- starting background reconstruction
[ 353.275270] md/raid:md6: device sde operational as raid disk 3
[ 353.275272] md/raid:md6: device sdd operational as raid disk 2
[ 353.275272] md/raid:md6: device sdc operational as raid disk 1
[ 353.275273] md/raid:md6: device sdb operational as raid disk 0
[ 353.276173] md/raid:md6: raid level 6 active with 4 out of 4 devices, algorithm 2
[ 353.276214] md6: detected capacity change from 0 to 4186112
[ 353.276294] md: resync of RAID array md6
[ 385.117318] md: md6: resync done.
[ 412.745420] EXT4-fs (md6): mounted filesystem 2d7e81dd-48ba-45f8-87f9-3ecd68aacac3 r/w with ordered data mode. Quota mode: none.
[ 431.855315] sd 1:0:0:1: [sdb] Synchronizing SCSI cache
[ 431.941372] md6_raid6: attempt to access beyond end of device
sdb: rw=432129, sector=8, nr_sectors = 1 limit=0
[ 431.941381] md: super_written gets error=-5
[ 431.941423] md/raid:md6: Disk failure on sdb, disabling device.
[ 431.941432] md/raid:md6: Operation continuing on 3 devices.
[ 455.391660] sd 2:0:0:2: [sdc] Synchronizing SCSI cache
[ 459.993903] md/raid:md6: Disk failure on sdc, disabling device.
[ 459.993923] md/raid:md6: Operation continuing on 2 devices.
3台以上削除すると読み書きに問題が生じてしまいますが、2台壊れても問題ないため、RAID5と比較すると耐障害性に優れていることを確認することができます。
まとめ
使用可能な容量
1Gのハードディスクを4本用意している場合、以下のようになります。
| RAIDレベル | 使用可能容量 | 理由 |
|---|---|---|
| RAID0 | 4G | 冗長性がなく、データを分割し全ディスクに書き込むため |
| RAID1 | 1G | 各ディスクに同一データをコピーするため |
| RAID5 | 3G | 1台分がパリティに使われるため |
| RAID6 | 2G | 2台分がパリティに使われるため |
耐障害性
何本ハードディスクを壊しても問題なく読み書きできるか
| RAIDレベル | 許容故障台数 | 理由 |
|---|---|---|
| RAID0 | 0本 | 冗長性がないため |
| RAID1 | 3本 | 同一データを全ディスクにコピーしており、1本でも残っていれば動作可能なため |
| RAID5 | 1本 | パリティ情報により、1本分のデータを復元できるため |
| RAID6 | 2本 | 2重パリティにより、2本分のデータを復元できるため |
読み書きの性能
こちらについて今回は検証していないですが、一般的な事実を記載します。
| RAIDレベル | 性能 | 理由 |
|---|---|---|
| RAID0 | 最速 | 冗長性がなく、データを分割して並列に読み書きできるため |
| RAID1 | 中 | 読み込みは分散できるが、書き込みは全ミラーに反映する必要があるため |
| RAID5 | 遅〜中 | 書き込み時にパリティ計算と更新が必要なため |
| RAID6 | 遅 | 二重パリティの計算と更新が必要なため |
感想
RAIDについて何となくの理解はしていましたが、今回実際に組んでみて障害発生を再現してみたことで、より各レベルごとの特徴を理解することができるようになりました。
この記事が参考になれば幸いです。





