LinuxのソフトウェアRAIDを利用する
RAIDは構築だけではなくて、障害検知と復旧の手順も確認してから運用しましょう。
2021年6月11日 嶋田大貴
RAIDの構築
ディスク一覧の確認
システムに接続されているハードディスクなどの一覧を得るには、lsscsi コマンドを使います。このような出力がされます。
[3:0:0:0] disk ATA Hitachi HDS72161 P22O /dev/sda
[3:0:1:0] cd/dvd Optiarc DVD RW AD-7200S 1.06 /dev/sr0
[7:0:0:0] disk ATA WDC WD2500JS-55N 10.0 /dev/sdc
[7:1:0:0] disk ATA ST3320620AS 3.AA /dev/sdd
[7:4:0:0] disk ATA ST3320620AS 3.AA /dev/sde
[8:0:0:0] disk JetFlash Transcend 2GB 8.07 /dev/sdb
ここでは、7:1と7:4に接続されているシーゲイトのハードディスク(sddとsde)をRAID1にしてみます。これらのハードディスクはまだシステムに接続したばかりで、未使用の状態です。
普通のLinux解説サイトだと、パーティションがどうとか理屈っぽいことの説明から入るのですが、この記事ではとにかく /dev/sddと /dev/sdeを RAID1にする最短の手順だけガイドすることにします。
パーティションの作成
parted --script /dev/sdd 'mklabel gpt'
parted --script /dev/sdd 'mkpart primary 2048s -1'
parted --script /dev/sdd 'set 1 raid on'
parted --script /dev/sde 'mklabel gpt'
parted --script /dev/sde 'mkpart primary 2048s -1'
parted --script /dev/sde 'set 1 raid on'
これで二つのハードディスクはRAID用に初期化されました。
新たに /dev/sdd1 と /dev/sde1 というデバイスが出現しています。LinuxのソフトウェアRAIDでは、ディスク全体をまるごと使用する場合でもいちおう原則としてパーティションの作成をすることになっています。そのため /dev/sddの1番目のパーティション(ひとつしかないけど)を作成しました。それは/dev/sdd1 というわけです。
RAID1の構築
二つのハードディスクをRAID用に初期化したら、mdadmというコマンドを使ってRAID1を作成しましょう。
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdd1 /dev/sde1
sdd1とsde1のふたつのハードディスクが合わさったRAID1ボリューム md0 を作りなさいというコマンドです。
mdadm: array /dev/md0 started.
と言われます。瞬時にRAID1が構成されました。とはいえRAID1とはミラーリングのはずです。データのコピーが瞬時に行われるわけがありません。実は /dev/md0が作成された瞬間から、バックグラウンドでふたつのハードディスクのデータ同期が行われています。
cat /proc/mdstat
としてみましょう。
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4]
md0 : active raid1 sde1[1] sdd1[0]
312571072 blocks [2/2] [UU]
[>....................] resync = 2.3% (7359552/312571072) finish=86.9min speed=58521K/sec
のような表示が出ます。いまデータ同期が2.3%進んだ所だ、というわけです。もし、同期の最中でシステムを再起動するなどした場合、同期が保留されてしまいますので mdstat --readwrite /dev/md0
として同期を再開してください。
構築したRAID1ボリュームの利用
RAIDボリュームはまだ同期中の状態でも利用を開始することができます。下記は今作成したRAID1ボリューム上に XFSファイルシステムを構築してマウントする例です。
mkfs.xfs /dev/md0
mount /dev/md0 /mnt
これでRAID上にファイルを保存できるようになりました。
だがここで安心してはいけない
ただこれだけの設定では、ミラーリングの片方が故障してしまった時にそれを人間が知る術がありません。放っておくと、マシンが動かなくなってはじめて両方のハードディスクが故障したことに気付くというハメになります。ハードウェアRAIDであれば、けたたましいブザー音が鳴ったりディスクのLEDが赤く光ったりするので片割れの異常に気付くことができるのですが、ソフトウェアRAIDの場合はそういった自己主張の強い方法で通知をしてもらうことは出来ないため、かわりにディスクの異常検知を何らかの方法で通知するように設定しておくことで悲劇を避けることが出来るかもしれません。
RAID異常の時にメールを飛ばす方法
RAIDの異常を検知した際にメールを発信させるには、/etc/mdadm.conf
という設定ファイルの中にある MAILADDR 行に、異常検知のメールを送信する宛先アドレスを書き込み(デフォルトではコメントアウトされているのでコメントインしてください)、systemctl start mdmonitor
として監視デーモンを起動してください。次回のシステム起動時に監視デーモンを自動起動させるには、さらに systemctl enable mdmonitor
とします。
メールの送信には /sbin/sendmail
が使用されるので、sendmailで外部にメールが送信できる環境が前提となります。これについてはここで解説しきれないため、ssmtpや Postfixを使ってうまくやってくださいと述べるにとどめておきます。また、OP25Bによって外部への直接メール送信がブロックされている環境では gmailを経由するなどして対策する必要があります。
監視デーモンが走り出し、sendmailでメールが飛ぶ環境であることを確認できたら、本当に監視しているかテストしてみましょう。RAID1を構成しているハードディスクの片方を抜いてしまいます。ここでは、/dev/sde を抜きました。しばらくしてから lsscsi を取ってみると、/dev/sdeは居なくなります。
[3:0:0:0] disk ATA Hitachi HDS72161 P22O /dev/sda
[3:0:1:0] cd/dvd Optiarc DVD RW AD-7200S 1.06 /dev/sr0
[7:0:0:0] disk ATA WDC WD2500JS-55N 10.0 /dev/sdc
[7:1:0:0] disk ATA ST3320620AS 3.AA /dev/sdd
[8:0:0:0] disk JetFlash Transcend 2GB 8.07 /dev/sdb
cat /proc/mdstat
で RAIDの状態を確認してみてください。
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4]
md0 : active raid1 sdd1[0] sde12
312571072 blocks [2/1] [U_]
sde1が(F)、つまり Failになっていることが確認出来ます。この状態になってから数分以内にシステムからメールが飛べば監視はうまくいっています。メールが飛んで来ない場合は、SMTPサーバの指定が正しいか、SMTPサーバにリレーを拒否されていないか、迷惑メールフォルダ行きにされていないかをチェックしてみてください。
では、抜いたハードディスクを元に戻します。lsscsiを取ってみましょう。
[3:0:0:0] disk ATA Hitachi HDS72161 P22O /dev/sda
[3:0:1:0] cd/dvd Optiarc DVD RW AD-7200S 1.06 /dev/sr0
[7:0:0:0] disk ATA WDC WD2500JS-55N 10.0 /dev/sdc
[7:1:0:0] disk ATA ST3320620AS 3.AA /dev/sdd
[7:4:0:0] disk ATA ST3320620AS 3.AA /dev/sdf
[8:0:0:0] disk JetFlash Transcend 2GB 8.07 /dev/sdb
なんと /dev/sde だったハードディスクが /dev/sdf に変わってしまっています。Linuxではハードディスクの抜き差しをする度に名前が変わってしまうのです。とはいえ、名前が変わったところで対応を間違えなければどうということはありません。
現在、RAID1ボリュームは /dev/sdd1 の片系だけで動作している状態なので、本当はもともとこのRAID1の一員だった /dev/sdf1を「新品の交換用ハードディスクだということにして」新たにRAID1に加えてやりましょう。
mdadm /dev/md0 --add /dev/sdf1
このコマンドがうまくいけば、mdadm: re-added /dev/sdf1
と言われます。これで /dev/sdd1と /dev/sdf1 の2台体勢による RAID1が復活しました。
RAIDは構築だけではなくて、障害検知と復旧の手順も確認してから運用しましょう。
RAIDは構築だけではなくて、障害検知と復旧の手順も確認してから運用しましょう。
大事な事なので2度言いました。
監視エージェントで監視する方法
Zabbixを使用してソフトウェアRAIDの監視をする方法を Zabbixで LinuxのソフトウェアRAIDを監視する にて紹介しています。
RAIDをオフライン(非アクティブ)にする方法
ハードディスクを他のマシンに付け替えるなど、アレイを解除せずに(データを残したまま)ハードディスクを外したい場合は、
mdadm --stop /dev/md0
としてアレイを非アクティブにし、それからハードディスクを外して下さい。
RAIDの解除方法
何らかの理由で、組んだRAIDを解除したい場合もあるでしょう。RAIDボリュームをマウントしている場合はまずアンマウントするなどして開放してから、RAIDを停止し、それぞれのハードディスク上に記録されているRAIDに関する情報を消去します。
注意!これを行うと中のデータにはもうアクセスできなくなります。つまり全ファイルを消去したのと同じことになります。意味を理解し、指差し確認してから行ってください。
mdadm --stop /dev/md0
mdadm --zero-superblock /dev/sdd1 /dev/sde1
2021年6月11日 嶋田大貴