ハードディスクの故障によるシステムダウンを避けるため、Linux標準のソフトウェアRAID機能を使って Walbrixで RAID1を構築する例をご紹介します。
Linuxの操作ができる人用に、RAIDの構築(と、その上に Walbrixの仮想マシン用領域を作成する)方法を示します。
以降、ずっとコンソールでの話になります。
システムに接続されているハードディスクなどの一覧を得るには、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にしてみます。これらのハードディスクはまだシステムに接続したばかりで、Walbrixの「領域」として利用されていない状態です。
普通の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 というわけです。
二つのハードディスクを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 として同期を再開してください。
では次に、/dev/md0 をWalbrixの仮想マシン用領域として使えるようにします。
pvcreate /dev/md0 vgcreate --addtag=wbvg myraid1 /dev/md0
これで RAID1のボリューム /dev/md0を myraid1 という名前の「領域」として使えるようになりました。vgsコマンドで領域の一覧を確認してみてください(wbvgは Walbrixをインストールした際に自動的に作成される領域です)。
# vgs VG #PV #LV #SN Attr VSize VFree wbvg 1 5 0 wz--n- 90g 22g myraid1 1 0 0 wz--n- 298g 298g
ただこれだけの設定では、ミラーリングの片方が故障してしまった時にそれを人間が知る術がありません。放っておくと、マシンが動かなくなってはじめて両方のハードディスクが故障したことに気付くというハメになります。ハードウェアRAIDであれば、けたたましいブザー音が鳴ったりディスクのLEDが赤く光ったりするので片割れの異常に気付くことができるのですが、ソフトウェアRAIDの場合はそういった自己主張の強い方法で通知をしてもらうことは出来ないため、かわりにディスクの異常検知をメールで通知するように設定しておくことで悲劇を避けることが出来るかもしれません。
RAIDの異常を監視させるには、まず先ほどの /etc/mdadm.confの中にある MAILADDR 行に、異常検知のメールを送信する宛先アドレスを書き込みます(デフォルトではコメントアウトされているのでコメントインしてください)。
さらにメールを送信出来るようにするために SMTPサーバの情報を /etc/ssmtp/ssmtp.confに書き込みます。mailhub= 行にSMTPサーバ名(や、必要ならポート番号やTLS情報など)を設定してください。
RAIDの監視デーモンを起動するには /etc/init.d/mdadm start とします。次回のシステム起動時に自動起動させるには、さらに rc-update add mdadm default と入力してください。
監視デーモンが走り出したら、本当に監視しているかテストしてみましょう。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] sde1[2](F) 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を解除したい場合もあるでしょう。WBの領域(ボリュームグループ)として使用している場合はまず、
vgremove myraid1 pvremove /dev/md0
として領域を開放してください。解放する前に、中には何の論理ボリューム(仮想マシン)も無くなっている必要があります。
領域を開放したら、RAIDを停止し、それぞれのハードディスク上に記録されているRAIDに関する情報を消去します。
mdadm --stop /dev/md0 mdadm --zero-superblock /dev/sdd1 /dev/sde1
アレイを解除せずにそのままハードディスクを外したい場合(RAID構成そのままでアレイを他のマシンに付け替える場合など)は、
mdadm --stop /dev/md0
としてアレイを非アクティブにし、それからハードディスクを外して下さい。