0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RAIDについて実際に組みながら理解する

Last updated at Posted at 2025-12-13

概要

本記事では、RAID0・RAID1・RAID5・RAID6 といった RAID の各レベルについて、それぞれの特徴や違いを整理したうえで、Linux 環境において実際に RAID を構築し、障害発生時の挙動を検証しました。
仮想ディスクを用いて RAID を構成し、ディスク障害を意図的に発生させることで、各 RAID レベルにおける使用可能容量や耐障害性、読み書き可否の違いを確認しています。

RAIDについて

RAID0

データを複数ディスクに分割して高速化するものの、冗長性が一切ない構成です。

image.png

RAID1

同じデータを複数ディスクにそのまま複製し、耐障害性を高める構成です。

image.png

RAID5

データとパリティを複数ディスクに分散配置し、1台のディスク故障に耐えつつ容量効率も確保する構成です。
パリティは、ディスク故障時に失われたデータを復元するための冗長情報です。
例えば、HDD1が故障した時に、B,C,PをもとにAを復元することができます。

image.png

RAID6

データと二重パリティを分散配置し、同時に2台のディスク故障にも耐えられる高い耐障害性を持つ構成です。

image.png

RAIDの準備

仮想ディスクの追加

1GBの仮想ディスクを4本追加し、VMからは別々のブロックデバイスとして認識されるようにします。
これにより、VM内部でソフトウェアRAIDを構成できるようになり、仮想的に複数のHDDが存在する環境を再現しています。

image.png

Screenshot 2025-12-13 at 3.39.03 PM.png

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 

障害時の挙動

概要

例えば、以下のようにして sdbsdc を利用できない状態にした際に、ファイルシステムのマウント先ディレクトリへの読み込みや新規書き込みの様子が各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

sdcsdd が利用できない状態にしたとしても、RAIDを構成する仮想ディスクが一本でも正常であれば問題なくデータの読み書きを行うことができ、耐障害性に優れています。

RAID5

1台分をパリティに使っているため、1台壊しても問題ないですが、sdbsdc といった形で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

sdbsdc といった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について何となくの理解はしていましたが、今回実際に組んでみて障害発生を再現してみたことで、より各レベルごとの特徴を理解することができるようになりました。
この記事が参考になれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?