【Linux カーネル: OS 入門6】RAID

RAID (Redundant Array of Inexpensive Disks) とは

RAID とは、複数のストレージ (SSD/HDD など) にデータを分散することで「高速/大容量/冗長性」を実現する技術です。

RAID の実現方法には以下の2種類が存在します。

本記事では、よく利用する RAID0・RAID1・RAID5・RAID6 を紹介します。

Linux カーネルの機能
スポンサーリンク

RAID レベルの種類

RAID0

RAID0 とは、データを一定のサイズに分割して、複数のストレージを同時に読み書きすることで高速化する方法です。

なお、分割する一定のデータサイズのことを、ストライプサイズと言います。

ストライプサイズは 1MiB

読み書きが分散されるため、シーケンシャルアクセスが高速化します。

一方で、ランダムアクセスではアクセスサイズが小さいため、読み書きの分散が効きづらく、高速化しにくいです。(ストライプサイズ以下のデータを読み書きする場合は、1つのストレージしか使わないため)

また、1台でもストレージが壊れるとデータが破損する特徴を持ちます。

RAID1

RAID1 とは、同じデータを複数のストレージに書き込むことで、ストレージの故障に備える方法です。

同じデータを複数のストレージに置くため、ストレージ容量の利用効率が悪いという欠点を持ちます。

RAID10 (RAID1+0)

RAID1 とは、RAID1 と RAID0 を組み合わせた方法です。
RAID0 の高速化、大容量化 + RAID1 の耐障害性を兼ね備えてます。

RAID5

RAID5 とは、パリティという仕組みを使って、ストレージが故障に備える方法です。

1台のストレージが故障した場合でも、パリティを使って元のデータを復元できます。

パリティの計算方法

パリティは他のストレージにあるデータの XOR※ を取ります。
(※XOR は同じ数字なら0、違う数字なら1となる論理演算)

例えば、以下のデータを持つデータAとデータBからパリティを求めてみます。

データ A 10001010
データ B 01001100
---------------------------
パリティ 11000110

パリティを使ったデータの復元

データ B を持つストレージが故障した場合を例に考えます。

データ A とパリティ 1 は残っているので、これらの XOR を取るとデータ B が復元できます。

データ A 10001010
パリティ 11000110
---------------------------
データ B 01001100

パリティのデメリット (RAID5 のデメリット)

RAID5 は、データの書き込みに時間がかかります。

これは書き込み前に、「パリティの計算に使用するデータの読み出し」と「パリティの計算」をする必要があるからです。

ただし、最近は大容量のキャッシュと専用の XOR 演算機を搭載することでデメリットが解消されています。

RAID6

RAID6 とは、RAID5 の水平パリティ (XOR) に加えて、対角線パリティ (ガロア体)を使って、2台のストレージが故障してもデータを復旧できる方法です。
水平パリティ=パリティP、対角線パリティ=パリティQ

対角線パリティの詳細については、以下の記事をご覧ください。

RAIDのデータ復旧のしくみ(2)|Hisao Tsujimura
こんにちは、辻村です。前回は、「RAIDのデータ復旧の仕組み(1)」と題して、簡単な足し算と引き算を使ってRAID-5の復旧の仕組みについてお話ししました。今回は RAID-6についてお話をしていきます。今回のお話は小学校の算数だけでは残念ながら解けません。中学校の数学くらいは必要です。最後の方で有限体(たい)のお話に...

まとめ

RAID の種類ごとの特徴のまとめは、以下のとおりです。

RAID0RAID1RAID10RAID5RAID6
ストレージ2台以上2台4台以上3台以上4台以上
容量の利用効率
※1
100%50%50%(n-1)/n = 2/3
= 75%
(n-2)/n = 2/4
= 50%
故障率 ※2(1-0.99^2)
= 3.94%
(0.01^2)
= 0.01%
(0.01^2)*2
= 0.02%
3C2 * 0.01^2
= 0.06%
4C3*0.01^3
= 0.0004%
書き込み速度 ※3
※1 RAID10 は 4 台、RAID5 は 3 台、RAID6 は 4 台の場合
※2 故障率 1% の場合 (https://zenn.dev/firedial/articles/5acd947326e5b8
※3 https://www.fujitsu.com/jp/products/computing/storage/eternus/glossary/raid/index.html
スポンサーリンク

RAID の設定方法

今回は2つのブロックストレージ [xvdb] と [xvdc] を使用して、RAID0 を組んでみます。

RAID の作成

lsblk
NAME    MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
xvda    202:0    0   8G  0 disk  
└─xvda1 202:1    0   8G  0 part  /
xvdb    202:16   0   8G  0 disk  
xvdc    202:32   0   8G  0 disk
sudo mdadm --create --verbose /dev/md0 --level=0 --raid-devices=2 /dev/xvdb /dev/xvdc
  • --level は RAID レベルを指定 (今回は RAID0 を組むので 0)
  • --raid-devices は <デバイス数> <RAID に使うデバイス1> <RAID に使うデバイス2>....を指定
lsblk
$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
xvda    202:0    0   8G  0 disk  
└─xvda1 202:1    0   8G  0 part  /
xvdb    202:16   0   8G  0 disk  
└─md0     9:0    0  16G  0 raid0
xvdc    202:32   0   8G  0 disk  
└─md0     9:0    0  16G  0 raid0

xvdb 8G と xvdc 8G からなる md0 16G の raid0 が作成できていることを確認できます。

作成した raid0 の詳細は sudo mdadm --detail /dev/md0 コマンドで確認できます。

RAID にファイルシステムを作成

sudo mkfs -t xfs /dev/md0
lsblk -f
NAME    FSTYPE            LABEL UUID MOUNTPOINT
xvda                                                                 
└─xvda1 xfs               /     UUID1 /
xvdb    linux_raid_member 0     UUID2 
└─md0   xfs                     UUID3 
xvdc    linux_raid_member 0     UUID2 
└─md0   xfs                     UUID3

RAID0 (md0) に対して、xfs ファイルシステムが作成できたことが確認できます。

RAID をマウント

sudo mkdir -p /mnt/raid
sudo mount /dev/md0 /mnt/raid
lsblk
NAME    MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
xvda    202:0    0   8G  0 disk  
└─xvda1 202:1    0   8G  0 part  /
xvdb    202:16   0   8G  0 disk  
└─md0     9:0    0  16G  0 raid0 /mnt/raid
xvdc    202:32   0   8G  0 disk  
└─md0     9:0    0  16G  0 raid0 /mnt/raid

md0 のマウントポイントが /mnt/raid であることが確認できます。

RAID の動作確認

sudo touch /mnt/raid/test.txt
ls /mnt/raid/
test.txt

通常のファイルシステムと同様にファイルを格納できていることがわかります。

スポンサーリンク

関連情報

Linux カーネルの機能